function f=fun(x);
%定义非线性方程组如下
%变量x1 x2
%函数f1 f2
syms x1 x2
f1=4*x1-x2+1/10*exp(x1)-1;
f2=-x1+4*x2+1/8*(x1)^2;
f=[f1 f2];
建立函数dfun
用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:
function df=dfun(x);
%用来求解方程组的雅克比矩阵储存在dfun中
f=fun(x);
df=[diff(f,'x1');diff(f,'x2')];
df=conj(df');
编程牛顿法求解非线性方程组将newton.m保存到工作路径中:
function x=newton(x0,eps,N);
con=0;
%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛
for i=1:N;
f=subs(fun(x0),{'x1' 'x2'},{x0(1) x0(2)});
df=subs(dfun(x0),{'x1' 'x2'},{x0(1) x0(2)});
x=x0-f/df;
for j=1:length(x0);
il(i,j)=x(j);
end
if norm(x-x0)
break;
end
x0=x;
end
%以下是将迭代过程写入txt文档文件名为iteration.txt
fid=fopen('iteration.txt','w');
fprintf(fid,'iteration');
for j=1:length(x0)
fprintf(fid,' x%d',j);
end
for j=1:i
fprintf(fid,'\n%6d ',j);
for k=1:length(x0)
fprintf(fid,' %10.6f',il(j,k));
end
end
if con==1
fprintf(fid,'\n计算结果收敛!');
end
if con==0
fprintf(fid,'\n迭代步数过多可能不收敛!');
end
fclose(fid);
运行程序
在matlab中输入以下内容
newton([0.1 0.1 -0.1],0.00001,20)
上面的输入是错误的,是在matlab中输入以下内容
newton([0.1 0.1],0.00001,20)