clc;clear all;close
%% 线性系统x(k+1)=A*x(k)+B*u(k)参数(A,B)
A=[1 1;-1 1];
B=[0.1; 1];
%% 神经网络训练参数
N=1000; %样本数
hiddenSizes=10; %隐藏层神经元数目
%% 获取模型网络训练样本
uk = randn(1,N); %控制变量随机均匀取值|u|≤1
xk = randn(2,N); %状态标量随机均匀取值|x|≤1
target=A*xk+B*uk; %状态方程获取训练样本-目标
input=[xk; uk]; %训练样本-输入
%% 构建前馈神经网络
net=feedforwardnet(hiddenSizes,'trainlm');
net.trainParam.showWindow=false; %关闭nntraintool窗口
net = train(net, input, target);
net.b{1}=zeros(size(net.b{1})); %输入层阈值10x1
net.b{2}=zeros(size(net.b{2})); %隐藏层阈值2x1
net.iw{1}=zeros(size(net.iw{1})); %输入层权值10x3
net.lw{2,1}=zeros(size(net.lw{2,1})); %隐藏层权值2x10
%% 训练过程
% net = train(net, input, target);
%% 仿真参数
x=[1; -0.5];
u=0.2;
ystar=A*x+B*u %参照输出值
%in的输入归一化处理参数
xinmin=net.inputs{1}.processSettings{1}.xmin;
xinmax=net.inputs{1}.processSettings{1}.xmax;
xoutmin=net.inputs{1}.processParams{1}.ymin;
xoutmax=net.inputs{1}.processParams{1}.ymax;
%out的输出归一化处理参数
yinmin=net.outputs{1,2}.processSettings{1}.xmin;
yinmax=net.outputs{1,2}.processSettings{1}.xmax;
youtmin=net.outputs{1,2}.processParams{1}.ymin;
youtmax=net.outputs{1,2}.processParams{1}.ymax;
%%
in=[x; u]; %神经网络输入
ynet=net(in) %神经网络1输出值
%权值和阈值为零时,输出层的输出确实是零,
%但matlab对零做了mapminmax反变化后得到了一个和输出归一化处理参数相关的数
%将y再做一次mapminmax变化将得到零
y=(youtmax-youtmin)./(yinmax-yinmin).*(ynet-yinmin)+youtmin
%% 数学模型求输出再次验证该数学模型,即ynet==ym
in=(xoutmax-xoutmin)./(xinmax-xinmin).*(in-xinmin)+xoutmin;
b1=net.b{1}; %输入层阈值10x1
b2=net.b{2}; %隐藏层阈值2x1
IW=[net.iw{1}, b1]; %输入层权值10x4
LW=[net.lw{2,1}, b2]; %隐藏层权值2x11
p=[in; 1]; %网络输入4x1
a=IW*p; %输入层输入10x1
a1=[tansig(a); 1]; %输入层输出11x1
ym=LW*a1; %线性输出层输出
ym=(yinmax-yinmin)./(youtmax-youtmin).*(ym-youtmin)+yinmin