Matlab BPNet线性+非线性逼近

请添加图片描述
请添加图片描述

线性部分确定+BPNet逼近非线性

请添加图片描述

function LineAndNonlin
%% 参数初始化
l = 0.009; % 学习率
alfa = 0.05; % 动量因子

cells1 = 8; % 隐层神经元个数
cells2 = 4;

w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [8 ,1]
w2 = rand(cells2,cells1); % 随机赋值第二层连接权系数 [4, 8]
w3 = rand(1,cells2); % 随机赋值第三层连接权系数 [1, 4]

yw1 = rand(cells1,1); % 随机赋值第一层输出阈值 [8, 1]
yw2 = rand(cells2,1); % 随机赋值第二层输出阈值 [4, 1]
yw3 = rand; % 随机赋值第三层输出阈值 [1]

ts=0.001; % 样本
n = 1000; % 样本数
yn = rand(1,n); % 随机赋值输出(预测)
y = rand(1,n); % 随机赋值输出(真实)

counts = 1; % 计数值初始化

x = [0]; % 输入

g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出

aa = 0.3; % 线性部分参数
bb = 0.6; % 线性部分参数

times = 1; % 训练轮数
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
    ei=0;
    for a=1:n % 样本数
        
        time(a)=a*ts;
        u=0.50*sin(3*2*pi*a*ts); % 0.50*sin(3*2*pi*k)
        g=u^3 + 0.3*u^2 - 0.4*u;
        y(a) = aa*y_1 + bb*y_1_1 + g_1;
    
        net1=w1*x-yw1; % 第一层网络的输入 [8, 1]
        out1=logsig(net1); % 第一层网路的输出 [8, 1]
        net2=w2*out1-yw2; % 第二层网络的输入 [4, 8]*[8 ,1]=[4, 1]
        out2=logsig(net2); % 第二层网络的输出 [4, 1]
        net3=w3*out2-yw3; % 第三层网络的输出 [1]
        ynet=net3; % 第三层网络的输出 [1]
        
        yn(a) = aa*y_1 + bb*y_1_1 + ynet; % 计算两个模型的总输出
        
        det3=y(a)-yn(a); % 计算偏差 [1]
        det2=((det3*(w3))*out2)*(1-out2); % ([1, 4]*[4 ,1])*[4, 1] = [4, 1]
        det1=((det2'*(w2))*out1)*(1-out1); % [8, 1]
     
        w1=w1+det1*x'*l; % [8, 1]
        w2=w2+(det2*out1')*l; % [4, 8]
        w3=w3+(det3*out2')*l; % [1, 4]
        
        yw1=-det1*l+yw1;
        yw2=-det2*l+yw2;
        yw3=-det3*l+yw3;
        
        ei=ei+det3^2/2;
        e(i)=ei;      
        
        x(1)=g; % 更新输入
 
        g_1 = g;
        
        y_1_1 = y_1;
        y_1=y(a);
    end % 结束一次样本遍历
    
    if ei<0.008
        break;
    end
    counts=counts+1;
    
end % 结束学习
%% 计算学习的曲线
x = [0]'; % 输入
yn_test = rand(1,n); % 随机赋值输出(预测)
y_test = rand(1,n); % 随机赋值输出(真实)
g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出
ts=0.1; % 样本
n = 1000; % 样本数
for a=1:n
    u=sin(2*pi*a*ts/100); % sin(2*pi*a*ts/100)
	g=u^3 + 0.3*u^2 - 0.4*u;
	y_test(a) = aa*y_1 + bb*y_1_1 + g_1;
 
    net1=w1*x-yw1;
    out1=logsig(net1);
    net2=w2*out1-yw2;
    out2=logsig(net2);
    net3=w3*out2-yw3;
    ynet=net3;
    
    yn_test(a) = aa*y_1 + bb*y_1_1 + ynet; % 计算两个模型的总输出
    
	x(1)=g; % 更新输入
    
    g_1 = g;
	y_1_1 = y_1;
	y_1=y_test(a);
end
%% 绘图
figure(1);
subplot(2,1,1);
plot(time,y,'b-',time,yn,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=0.50*sin(3*2*pi*k)');
xlabel('x轴');
ylabel('y=0.50*sin(3*2*pi*k)');

if (counts<times)
    count=1:counts;
    sum=counts;
else 
    count=1:times;
    sum=times;
end

subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');

figure(2);
plot(time,y_test,'b-',time,yn_test,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=sin(2*pi*a*ts/100)');
xlabel('x轴');
ylabel('y=sin(2*pi*a*ts/100)');
return

请添加图片描述
请添加图片描述

最小二乘逼近线性部分+BPNet逼近非线性

请添加图片描述
不会写,感觉不如下面的方法好用!!!

BPNet逼近线性部分+BPNet逼近非线性

请添加图片描述

function LineAndNonlin
%% 参数初始化
l = 0.009; % 学习率
alfa = 0.05; % 动量因子

cells1 = 8; % 隐层神经元个数
cells2 = 4;

cells1_2 = 1; % 线性网络的隐层神经元个数

w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [8 ,1]
w2 = rand(cells2,cells1); % 随机赋值第二层连接权系数 [4, 8]
w3 = rand(1,cells2); % 随机赋值第三层连接权系数 [1, 4]
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值 [8, 1]
yw2 = rand(cells2,1); % 随机赋值第二层输出阈值 [4, 1]
yw3 = rand; % 随机赋值第三层输出阈值 [1]

w1_2 = rand(cells1_2,2); % 随机赋值第一层连接权系数 [1 ,2]

ts=0.001; % 样本
n = 1000; % 样本数
yn = rand(1,n); % 随机赋值输出(预测)
y = rand(1,n); % 随机赋值输出(真实)

counts = 1; % 计数值初始化

x = [0]; % 输入
x_2 = [0, 0]'; % 输入

g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出

aa = 0.3; % 线性部分参数
bb = 0.6; % 线性部分参数

times = 1; % 训练轮数
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
    ei=0;
    for a=1:n % 样本数
        
        time(a)=a*ts;
        u=0.50*sin(3*2*pi*a*ts); % 0.50*sin(3*2*pi*k)
        g=u^3 + 0.3*u^2 - 0.4*u;
        y(a) = aa*y_1 + bb*y_1_1 + g_1;
    
        net1_1=w1*x-yw1; % 第一层网络的输入 [8, 1]
        out1_1=logsig(net1_1); % 第一层网路的输出 [8, 1]
        net2_1=w2*out1_1-yw2; % 第二层网络的输入 [4, 8]*[8 ,1]=[4, 1]
        out2_1=logsig(net2_1); % 第二层网络的输出 [4, 1]
        net3_1=w3*out2_1-yw3; % 第三层网络的输出 [1]
        ynet=net3_1; % 第三层网络的输出 [1]
        
        net1_2=w1_2*x_2; % 第一层网络的输入 [1]
        
        yn(a) = net1_2 + ynet; % 计算两个模型的总输出
        
        det3=y(a)-yn(a); % 计算偏差 [1]
        det2=((det3*(w3))*out2_1)*(1-out2_1); % ([1, 4]*[4 ,1])*[4, 1] = [4, 1]
        det1=((det2'*(w2))*out1_1)*(1-out1_1); % [8, 1]
     
        w1=w1+det1*x'*l; % [8, 1]
        w2=w2+(det2*out1_1')*l; % [4, 8]
        w3=w3+(det3*out2_1')*l; % [1, 4]
        yw1=-det1*l+yw1;
        yw2=-det2*l+yw2;
        yw3=-det3*l+yw3;
        
        w1_2=w1_2+det3*x_2'*l; % [1, 2]
        
        ei=ei+det3^2/2;
        e(i)=ei;      
        
        g_1 = g;
        
        y_1_1 = y_1;
        y_1=y(a);
        
        x(1)=g; % 更新输入
 
        x_2(1) = y_1;
        x_2(2) = y_1_1;
    end % 结束一次样本遍历
    
    if ei<0.008
        break;
    end
    counts=counts+1;
    
end % 结束学习
%% 计算学习的曲线
x = [0]'; % 输入
x_2 = [0, 0]'; % 输入
yn_test = rand(1,n); % 随机赋值输出(预测)
y_test = rand(1,n); % 随机赋值输出(真实)
g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出
ts=0.1; % 样本
n = 1000; % 样本数
for a=1:n
    u=sin(2*pi*a*ts/100); % sin(2*pi*a*ts/100)
	g=u^3 + 0.3*u^2 - 0.4*u;
	y_test(a) = aa*y_1 + bb*y_1_1 + g_1;
 
    net1=w1*x-yw1;
    out1=logsig(net1);
    net2=w2*out1-yw2;
    out2=logsig(net2);
    net3=w3*out2-yw3;
    ynet=net3;
    
    net1_2=w1_2*x_2; % 第一层网络的输入 [1]
        
	yn_test(a) = net1_2 + ynet; % 计算两个模型的总输出
    
    g_1 = g;
	y_1_1 = y_1;
	y_1=y_test(a);
    
	x(1)=g; % 更新输入
 
	x_2(1) = y_1;
	x_2(2) = y_1_1;
end
%% 绘图
figure(1);
subplot(2,1,1);
plot(time,y,'b-',time,yn,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=0.50*sin(3*2*pi*k)');
xlabel('x轴');
ylabel('y=0.50*sin(3*2*pi*k)');

if (counts<times)
    count=1:counts;
    sum=counts;
else 
    count=1:times;
    sum=times;
end

subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');

figure(2);
plot(time,y_test,'b-',time,yn_test,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=sin(2*pi*a*ts/100)');
xlabel('x轴');
ylabel('y=sin(2*pi*a*ts/100)');
return

请添加图片描述
请添加图片描述
此时线性网络输出的系数如下,发现与真实值有一定的差别,但是曲线逼近的效果还是可以的。

w1_2 =

0.2648    0.7028

代码

韦巍《智能控制基础》课本例3-8 线性+非线性系统代码

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值