1.简述

若向量记号为X,方程组就可以写成F(X)=0的形式。

我们知道,对于一元函数的牛顿迭代法求根公式

类似的,对于多元函数求根公式

其中X是向量,是非线性方程组对应的雅可比矩阵。

具体求解的时候,我们可以先通过绘图命令绘制图形,看交点。然后将交点附近的值带入迭代

矩阵。最后求出小于误差的收链解。

2.代码

主程序:

function newton%牛顿迭代法解非线性方程组
syms a x;
beta=0.15;
F=[1-beta+sqrt((1-beta)^2+4*a)-2*x;
beta+a+2*x-(beta+x)^3];
eps=10e-6;%精度
num=1;%记步数
tol=1;%给定误差初始值
x0=[1;1];%参数赋初始值
v=[a,x];
while tol>eps
Fx=subs(F,v,transpose(x0));
dF=jacobian(F,v);
c=subs(dF,v,transpose(x0));
x=x0-inv(c)*Fx;
tol=norm(x-x0);
x0=x;
num=num+1;
if (num>10^8)
disp(‘迭代次数大于最大值,可能不收敛’)
return
end
end
%Output
fprintf(‘解出 a = %g.\n’,x0(1))
fprintf(‘解出 x = %g.\n’,x0(2))
fprintf(‘迭代次数 n = %g次.\n’,num)

子程序:

function[y,n]=newton_fun(F,x0)
if nargin==2
eps=1.0e-6;
end
num = 0;
tol = 1;
v=findsym(F);
while tol>eps
Fx = subs(F,v,transpose(x0));
dF=jacobian(F,v);
c=subs(dF,v,transpose(x0));
x=x0-inv(c)*Fx;
tol=norm(x-x0);
x0=x;
num=num+1;
if (num>10^8)
disp(‘迭代次数大于最大值,可能不收敛’)
return
end
end
y = x0;
n = num;
end

子程序:

function solve
syms x
gamma=0.5;
m=5;
theta=12;
a=1-gamma;
F=sin((m+1)*x)-a*sin(m*x);

for i=0:m+1
w0=i*pi/(m+1);
[x,n]=newton_fun(F,w0);
w(i+1)=x;
%beta(i+1)=theta*gama^2/(sqrt(1+a^2-2*a*cos(x))-gama*(1-theta));
b(i+1)=cos((m+1)*x)-a*cos(m*x);%先算出b
beta(i+1)=theta*gamma^2/(b(i+1)-gamma*(1-theta));%再算出beta
num(i+1)=n;
end
w
beta
num