MATLAB求解非线性方程组(牛顿拉夫逊方法)
Equation.m 函数
这个函数用来写非线性方程组,注意整理成标准形式
function [f,variable]=Equation(~)
%定义非线性方程组,方程组右端项为0
syms x1 x2 x3 x4 %x5 x6 x7 x8 x9 x10 x11 x12
f1=x1+x1*x2+x3-8*x4-8;
f2=x3+x2+x1*x3+x4*x1+x4;
f3=x1*x1+x3*x4-5+x3+x4;
f4=x2+x4+x3*x4;
%f5=x6*x5*x4;
%f6=
%f=[f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 ];
f=[f1 f2 f3 f4];
variable=[x1 x2 x3 x4];
end
牛顿拉夫逊方法迭代求解
clear
[f,variable]=Equation()
N=5;%迭代次数
[row,size]=size(variable);
x0=zeros(size,1); %初值
for i =1:N
% delta_y=zeros(size,1)-double(subs(Equation(),...
% {'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' 'x10' 'x11' 'x12'},...
% {x0(1) x0(2) x0(3) x0(4) x0(5) x0(6) x0(7) x0(8) x0(9) x0(10) x0(11) x0(12)}));
% J=double(subs(jacobian(f,variable);...
% {'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' 'x10' 'x11' 'x12'},...
% {x0(1) x0(2) x0(3) x0(4) x0(5) x0(6) x0(7) x0(8) x0(9) x0(10) x0(11) x0(12)}));
delta_y=zeros(size,1)-double(subs(Equation(), ...
{'x1' 'x2' 'x3' 'x4' }, ...
{x0(1) x0(2) x0(3) x0(4)}))';
J=double(subs(jacobian(f,variable), ...
{'x1' 'x2' 'x3' 'x4' }, ...
{x0(1) x0(2) x0(3) x0(4)}));
delta_x=J\delta_y
x0=x0+delta_x;
if(norm(delta_y,"inf")<0.5)%判定收敛
disp(i);
disp(x0);
break;
end
end
本例运行结果输出:
[x1 + x3 - 8*x4 + x1*x2 - 8, x2 + x3 + x4 + x1*x3 + x1*x4, x1^2 + x3 + x4 + x3*x4 - 5, x2 + x4 + x3*x4]
[x1, x2, x3, x4]
delta_x = 4×1
48
-5
0
5
delta_x = 4×1
-23.9728
2.5888
-0.0210
-2.4835
delta_x = 4×1
-11.9224
1.5449
-0.2289
-1.0432
delta_x = 4×1
-4.9237
10.1295
-12.8115
11.3410
delta_x = 4×1
-1.9197
1.8696
5.1976
-6.3692
delta_x = 4×1
-0.7955
-2.1395
2.5462
-2.7440
delta_x = 4×1
-0.3771
-1.5859
1.1497
-0.9999
delta_x = 4×1
-0.1128
-0.4665
0.3133
-0.2430
delta_x = 4×1
-0.0095
-0.0376
0.0249
-0.0184
9
3.9665
6.9032
-3.8297
2.4397