我们将坐标 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3)对应的函数值 [ u ( x 1 , x 2 , x 3 ) , v ( x 1 , x 2 , x 3 ) , w ( x 1 , x 2 , x 3 ) ] [u(x_1,x_2,x_3),v(x_1,x_2,x_3),w(x_1,x_2,x_3)] [u(x1,x2,x3),v(x1,x2,x3),w(x1,x2,x3)]作为输入向量,而将坐标 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3)作为目标向量,去初值点 x 0 x_0 x0附近多个坐标对应的函数值向量作为输入,训练神经网络。
将 [ 0 , 0 , 0 ] [0,0,0] [0,0,0]作为输入输入到训练好的神经网络中,就可以得到该线性方程组的一个近似解 x 1 ∗ , x 2 ∗ , x 3 ∗ x_1^*,x_2^*,x_3^* x1∗,x2∗,x3∗
function u=u(x)
u = 3*x(1)-cos(x(2)*x(3))-0.5;
function v=v(x)
v = x(1)^2 -81 * (x(2)+0.1)^2+sin(x(3))+1.06;
function w=w(x)
w = exp(-x(1)*x(2))+20*x(3)+(10*pi - 3) / 3;
% ----------------------------------
% 使用 神经网络求解非线性方程组
% 以坐标(x,y,z)为目标向量
% 坐标(x,y,z)对应的各个非线性函数的值(u(x,y,z), v(x,y,z), w(x,y,z))为输入向量
% 训练网络后,输入(0,0,0)对应的输出即非线性方程组的一个近似解
% -----------------------------------
x0 = [0.1 0.1 -0.1]; %初值
x = ones(200,3); % 根据初值得到200个点
for i = 1:200
x(i,:) = x0 + (i - 100) * 0.01;
end
P = zeros(3,200); % 输入样本矩阵,每列为一个样本
for i = 1:200
P(:,i) = [u(x(i,:)) v(x(i,:)) w(x(i,:))];
end
T = x'; % 目标矩阵,每列为一个目标向量
net = newff([-100,100; -100,100; -100,100;],[3 3],{'tansig','logsig'},'traingd'); % 输入3,输出3!!!!(注意网络输入与目标向量的维数对应)
net.trainParam.epochs = 15000; % 迭代15000次
net.trainParam.goal = 0.01; % 误差
LP.lr = 0.1; % 学习率
% 训练网络
net = train(net, P, T);
% 给出非线性方程的近似解
res = sim(net, [0;0;0])
此时,解和真实解还是有误差,可以调整输入样本来得到更好的近似解。
参考文献:用人工神经网络求解非线性方程组的一种方法