使用BP神经网络逼近任意函数

该博客介绍了一个使用BP神经网络进行非线性函数逼近的案例。具体而言,网络结构为2-6-1,逼近函数为y(k)=u(k)^3+y(k-1)/(1+y(k-1)^2),其中u(k)为0.5*sin(6pit)。通过初始化权重、学习速率和动量因子,利用Sigmoid激活函数进行训练,并通过不断迭代更新权重以减小实际输出与理想值的偏差。最终,博客展示了训练过程中的输出曲线、误差变化以及雅可比信息的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逼近函数为:y(k)=u(k)^3 +
y(k-1)/(1+y(k-1)^2),
其中u(k)=0.5sin(6pit),网络结构为“2-6-1”

%2-6-1’结构的BP神经网络
clc;
clear all;
close all;
xite=0.5;%学习速率
alfa=0.5;%动量因子
%……………………………………初始化………………………………%
w1=rands(2,6);%初始化输入层到隐含层的权值w1,2×6矩阵
w1_1=w1;%初始化k时刻隐含层到输出层的权值w1_1
w1_2=w1;%初始化k-1时刻隐含层到输出层的权值w1_2


w2=rands(6,1);%初始化隐含层到输出层的权值w2,6×1矩阵
w2_1=w2;  %初始化k时刻隐含层到输出层的权值w2_1
w2_2=w2_1;%初始化k-1时刻隐含层到输出层的权值w2_2

dw1=0*w1;%初始化Δw1

x=[0,0]';%初始化二维输入x
u_1=0;%1个输入信号赋初值
y_1=0;%2个输入信号赋初值
I=[0 0 0 0 0 0]';%初始化输入层的输出,即隐含层的输入
Iout=[0 0 0 0 0 0]';%初始化隐含层的输出,即输出层的输入
FI=[0 0 0 0 0 0]';%初始化隐含层函数的函数的求导
%……………………………………初始化………………………………%
ts=0.001;%采样时间

for k=1:1:1000
    time(k)=k*ts;%离散时间点
    u(k)=0.5*sin(3*2*pi*k*ts);%1个输入信号f(x)=0.5*sin(3*2*pi*t)
    y(k)=u_1^3+y_1/(1+y_1^2);%初始化需要逼近的函数y(k)=u(k)^3+y(k-1)/(1+y(k-1)^2)
    for j=1:1:6
        I(j)=x'*w1(:,j);%输入层输出
        Iout(j)=1/(1+exp(-I(j)));%隐含层输出,激活函数采用Sigmoid函数
    end
    yn(k)=w2'*Iout;%输出层实际输出
    e(k)=y(k)-yn(k);%实际输出与理想值的偏差
    w2=w2_1+(xite*e(k))*Iout+alfa*(w2_1-w2_2);%隐含层到输出层的权值更新,负梯度法,w2(k+1)=w2(k)+Δw2(k)+α(w2(k)-w2(k-1));
    for j=1:1:6
        FI(j)=exp(-I(j))/(1+exp(-I(j)))^2;%激活函数求导
    end
    for i=1:1:2
        for j=1:1:6
            dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i);%Δw1(k)
        end
    end
    w1=w1_1+dw1+alfa*(w1_1-w1_2);%输入层到隐含层权值更新,负梯度法,w1(k+1)=w1(k)+Δw1(k)+α(w1(k)-w1(k-1));
    
    %……………………jacobin信息更新………………%
    yu=0;
    for j=1:1:6
        yu=yu+w2(j)*w1(1,j)*FI(j);
    end
    dyu(k)=yu;
     %……………………jacobin信息更新………………%
    x(1)=u(k);%第一个输入信号更新
    x(2)=y(k);%第二个输入信号更新
    w1_2=w1_1;%w1(k-1)更新
    w1_1=w1;%w1(k)更新
    w2_2=w2_1;%w2(k-1)更新
    w2_1=w2;%w2(k)更新
    u_1=u(k);%1个输入信号更新
    y_1=y(k);%2个输入信号更新
end
%………………………………绘图…………………………%
 figure(1);
 plot(time,y,'r',time,yn,'b');
 xlabel('times');
 ylabel('y and yn');
 figure(2);
 plot(time,y-yn,'r');
 xlabel('times');
 ylabel('error');
 figure(3);
 plot(time,dyu);
 xlabel('times');
 ylabel('dyu');
 %………………………………绘图…………………………%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karwen2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值