%% 清空
clc;
clear;
close all;
rand('seed',1);
%%
% %%非线性系统
% % 初始化
% y(1)=0;
% y(2)=0;
% u(1)=1;
% u(2)=1;
% Data = [];
% % 给定控制量变化 建模时给定用于测试模型性能,
% % 若考虑系统控制时 该量求解得出,也即根据系统状态求取得出控制率
% for t=3:400
% % u(t)=sin(0.2*pi*t);
% u(t)=sin(1*t);
% end
% % 参考输入 reference input r(k) 期望跟踪值
% for t=1:200
% r(t)=1;
% end
% for t=201:400
% r(t)=0;
% end
% %外部干扰 external disturbance
% for t=1:100
% v(t)=0;
% end
% for t=101:300
% v(t)=0.05;
% end
% for t=301:400
% v(t)=0.2;
% end
% % 由数学表达式进行样本收集
% for t=3:400
% y(t)=0.9722*y(t-1)+0.378*u(t-1)-0.1295*u(t-2)...
% -0.3103*y(t-1)*u(t-1)-0.04228*(y(t-2)^2)...
% +0.1663*y(t-2)*u(t-2)-0.03259*(y(t-1)^2)*y(t-2)...
% -0.3513*(y(t-1)^2)*u(t-2)...
% +0.3084*y(t-1)*y(t-2)*u(t-2)...
% +0.1087*y(t-2)*u(t-1)*u(t-2)+1*v(t);
% Samples = [y(t-1); y(t-2); u(t-1); u(t-2); y(t)]; % 按列存放 前5行为输入样本,最后1行为输出样本
% Data = [Data Samples];
% end
% [m,n]= size(Data);
% % 取数据方式 1-Random 打乱顺序; 2-Original 原始
% Flag1=1;
% switch Flag1
% case (1)
% rand_sequence=randperm(size(Data,2)); % 产生随机排序的size(Data,2)=998个数,
% Data=Data(:,rand_sequence); %按随机数排序方式取出数据
% case (2)
% Data = Data; %按原始排序
% end
% %--------将数据分为输入样本和输出样本------------
% InputData = Data(1:4,:);
% OutputData = Data(end,:);
% % 输入样本数据归一化方式 1-Mapminmax [-1 1]; 2-Mapminmax [0 1]; 3- Original data
% Flag2=3;
% switch Flag2
% case (1)
% [InputData,ps] = mapminmax(InputData);
% case (2)
% [InputData,ps] = mapminmax(InputData );
% ps.ymin=0;
% [InputData,ps] = mapminmax(InputData,ps);
% case (3)
% InputData = InputData;
% end
% % 将样本分类: 训练样本和测试样本
% TrainSamIn = InputData(:,1:300);
% TrainSamOut = OutputData (:,1:300);
% TestSamIn = InputData(:,301:end);
% TestSamOut = OutputData (:,301:end);
% [InDim,TrainSamNum]=size(TrainSamIn);
% OutDim=size(TrainSamOut,1);
% TestSamNum=size(TestSamIn,2);
% % 存储训练样本和测试样本
% save TrainSamIn TrainSamIn
% save TrainSamOut TrainSamOut
% save TestSamIn TestSamIn
% save TestSamOut TestSamOut
% %%复杂的非线性系统辨识
% % 初始化
% y(1)=0;
% y(2)=0;
% y(3)=0;
% Data = [];
% % 给定控制量变化
% for t=1:249
% u(t)=sin(pi*t/25);
% end
% for t=250:499
% u(t)=1.0;
% end
% for t=500:749
% u(t)=-1.0;
% end
% for t=750:1005
% u(t)=0.3*sin(pi*t/25)+0.1*sin(pi*t/32)+0.6*sin(pi*t/10);
% end
% % 由数学表达式进行样本收集
% for t=3:1000
% y(t+1)=(y(t)*y(t-1)*y(t-2)*u(t-1)*(y(t-2)-1)+u(t))/(1+y(t-2)^2+y(t-1)^2);
% Samples = [y(t); y(t-1); y(t-2); u(t); u(t-1); y(t+1)]; % 按列存放 前5行为输入样本,最后1行为输出样本
% Data = [Data Samples];
% end
% [m,n]= size(Data);
% % 取数据方式 1-Random 打乱顺序; 2-Original 原始
% Flag1=1;
% switch Flag1
% case (1)
% rand_sequence=randperm(size(Data,2)); % 产生随机排序的size(Data,2)=998个数,
% Data=Data(:,rand_sequence); %按随机数排序方式取出数据
% case (2)
% Data = Data; %按原始排序
% end
% %--------将数据分为输入样本和输出样本------------
% InputData = Data(1:5,:);
% OutputData = Data(end,:);
% % 输入样本数据归一化方式 1-Mapminmax [-1 1]; 2-Mapminmax [0 1]; 3- Original data
% Flag2= 3;
% switch Flag2
% case (1)
% [InputData,ps] = mapminmax(InputData);
% case (2)
% [InputData,ps] = mapminmax(InputData );
% ps.ymin=0;
% [InputData,ps] = mapminmax(InputData,ps);
% case (3)
% InputData = InputData;
% end
% % 将样本分类: 训练样本和测试样本
% TrainSamIn = InputData(:,1:800);
% TrainSamOut = OutputData (:,1:800);
% TestSamIn = InputData(:,801:end);
% TestSamOut = OutputData (:,801:end);
% [InDim,TrainSamNum]=size(TrainSamIn);
% OutDim=size(TrainSamOut,1);
% TestSamNum=size(TestSamIn,2);
% % 存储训练样本和测试样本
% save TrainSamIn TrainSamIn
% save TrainSamOut TrainSamOut
% save TestSamIn TestSamIn
% save TestSamOut TestSamOut
%% 初始化Mackey-Glass函数
%训练样本
x=ones(1,4000); x(1)=1.2;
for t=18:4017
x(t+1)=0.9*x(t)+0.2*x(t-17)/(1+x(t-17).^10);
end
x1=x(136:635); x2=x(130:629);
x3=x(124:623); x4=x(118:617);
TrainSamIn=[x1;x2;x3;x4];
TrainSamOut=x(142:641);
[InDim,TrainSamNum]=size(TrainSamIn); %InDim输入维数4,TrainSamNum训练样本数500
OutDim=size(TrainSamOut,1); %OutDim输出维数为1
%测试样本
x5=x(636:1135); x6=x(630:1129);
x7=x(624:1123); x8=x(618:1117);
TestSamIn=[x5;x6;x7;x8];
TestSamOut=x(642:1141);
TestSamNum=size(TestSamIn,2); %TestSamNum测试样本数500
% %%Lorenz混沌时间序列预测
% load Lorenz_TrainSamIn % 训练数据 3*1000
% load Lorenz_TrainSamOut % 1*1000
% load Lorenz_TestSamIn % 测试数据 3*1000
% load Lorenz_TestSamOut
% [InDim,TrainSamNum]=size(TrainSamIn);
% OutDim=size(TrainSamOut,1);
% TestSamNum=size(TestSamIn,2);
% %%氨氮数据
% %%%%%%%%%%%%%%%读取文件数据,并将数据进行归一化%%%%%%%%%%%%%%%%%%%%
% data=xlsread('氨氮数据.xlsx','sheet2','A2:G141');%读取文件数据
% x_train=data(1:90,1:6)'; %x_train是用于训练网络的输入数据
% r_train=data(1:90,7)'; %r_train是用于计算训练输出误差的输出数据(期望输出的)
% [TrainSamIn,inputps1]=mapminmax(x_train);%把训练输入数据归一化
% [TrainSamOut,outputps1]=mapminmax(r_train);%把训练输出数据归一化
% [InDim,TrainSamNum]=size(TrainSamIn);%InDim是输入节点数,有6个,PatternNum是训练样本数据,有90个
% OutDim=size(TrainSamOut,1); %输出节点数,有1个
% %测试样本
% TestSamIn=data(91:140,1:6)';
% TestSamOut=data(91:140,7)'; %选择测试数据
% [TestSamIn,inputps2]=mapminmax('apply',TestSamIn,inputps1);%把测试数据归一化至0,1之间
% [TestSamOut,outputps2]=mapminmax('apply',TestSamOut,outputps1);
% TestSamNum=size(TestSamIn,2);
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 初始化参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RuleNum=7; %规则数
rate=0.08;
Width=2.5*ones(InDim,RuleNum);%2型高斯函数的宽度;ones()是产生一个全1矩阵
Center=0.4*rand(InDim,RuleNum)+0.9;
Center_l=Center-rate*Width;%隶属函数的第一个中心
Center_r=Center+rate*Width;%隶属函数的第二个中心
rateW=0.7;
rateb=0.7;
W=rateW*randn(InDim,RuleNum); %权值
b=rateb*randn(RuleNum,1);
lamda=0.1;
q=0.3;
%%
%%%%%%%%%%%%%%%%%预分配内存,优化循环%%%%%%%%%%%%%%%
WeightNum=4*InDim*RuleNum+RuleNum+1;
jac=zeros(TrainSamNum,WeightNum);
Q=zeros(WeightNum,WeightNum);
g=zeros(1,WeightNum);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
tic
for epoch=1:TrainSamNum %%%k为样本个数
epoch
SamIn=TrainSamIn(:,epoch);
%%%%%%%%%%%%%%%%%%%%%%%%%计算前件隶属度,即网络的第二层计算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:1:InDim %ih是第一层输入节点的标号,jh是第二层节点的标号
for j=1:1:RuleNum %mt2_1代表前一个高斯的中心点,mt2_2代表后一个高斯中心点,x是输入,u_up是上限,u_lo是下限,一共6个输入 每个输入有6个隶属度函数
%% 计算上隶属度函数
if SamIn(i) < Center_l(i,j)%如果训练值小于前一个中心点
u_up(i,j)=gaussmf(SamIn(i),[Width(i,j) Center_l(i,j)]); % 高斯函数gaussmf(x,sigma,c),得到左侧隶属函数的上界值
elseif Center_l(i,j) <= SamIn(i) && SamIn(i) <= Center_r(i,j) %如果训练值大于第一个中心点且小于第二个中心点
u_up(i,j)=1;%隶属函数值上界值为1
elseif SamIn(i) > Center_r(i,j)%如果训练值大于第二个中心点
u_up(i,j)=gaussmf(SamIn(i),[Width(i,j) Center_r(i,j)]);%则得到右侧隶属函数的上界值
end
%% 计算下隶属度函数
if SamIn(i) <= (Center_l(i,j)+Center_r(i,j))/2%如果输入值小于
评论6