必做题目比较简单,写得有些随意,主要还是第二个拓展题目的难度比较高
1.Newton迭代法解非线性方程
function [] = Newton_Die(x,tol,N)
f=cos(x)-x; %f(x)
df=-sin(x)-1; %f(x)的导数
for k=1:N
x_old=x;
x=x_old-f/df;
f=cos(x)-x; %更新f的值
df=-sin(x)-1; %更新df的值
fprintf('迭代次数=%d\tx=%.10f\n',k,x)
if abs(x_old-x)<tol
break
end
if k==N
disp('达到最大迭代次数')
end
end
end
2.Newton迭代法解非线性方程组
function [X] = Newton_Z(X,tol,N)
n = input('输入未知数的个数:');
syms x [1 n] %创建n个未知数变量
ff=cell(n,1); %初始化f(xk)——带入Xk值之前为符号表达式——cell储存
F=zeros(n,1); %初始化f(xk)——带入Xk值之后为矩阵——数组储存
Jx=cell(n,n); %初始化J(xk)——带入Xk值之前为符号表达式——cell储存
J=zeros(n,n); %初始化J(xk)——带入Xk值之后为矩阵——数组储存
for i=1:n
f=input('请输入方程:');
ff{i,1}=f;
for j=1:n
Jx{i,j}=diff(f,x(j)); %求Jacobi矩阵
end
end
Jx
for k=1:N %定义最大迭代次数
X_old = X;
for i=1:n
ff_cpoy=ff{i,1};
for u=1:n %求f(xk)的值
if u~=n
ff_cpoy=subs(ff_cpoy,x(u),X(u,1)); %对符号表达式逐个赋值
else
F(i,1)=vpa(subs(ff_cpoy,x(u),X(u,1)));%赋值完成后传给F
end
end
for j=1:n
Jx_copy=Jx{i,j};
for v=1:n %求J(xk)的值
if v~=n
Jx_copy=subs(Jx_copy,x(v),X(v,1));%对符号表达式逐个赋值
else
J(i,j)=vpa(subs(Jx_copy,x(v),X(v,1)));%赋值完成后传给J
end
end
end
end
X = X-J\F; %Newton迭代公式
fprintf('迭代次数=%d ',k)
for i=1:n
value=X(i,1);
fprintf('x%d=%.8f ',i,value)
end
fprintf('\t')
fprintf('精度:%.10f\n',norm(X_old-X, inf))
if norm(X_old-X, inf)<tol %无穷范数定义终止条件
break
end
if k==N
disp('达到最大迭代次数')
end
end
传入题设数据有:
>> Newton_Die(0.5,1e-5,100)
迭代次数=1 x=0.7552224171
迭代次数=2 x=0.7391416661
迭代次数=3 x=0.7390851339
迭代次数=4 x=0.7390851332
Newton_Z([1;1;1],1e-5,100)
输入未知数的个数:3
请输入方程:3*x1-cos(x2*x3)-0.5
请输入方程:x1^2-81*(x2+0.1)^2+sin(x3)+1.06
请输入方程:exp(-1*x1*x2)+20*x3+(10*pi-3)/3
Jx =
3×3 cell 数组
{[3 ]} {[x3*sin(x2*x3) ]} {[x2*sin(x2*x3)]}
{[2*x1 ]} {[- 162*x2 - 81/5]} {[cos(x3) ]}
{[-x2*exp(-x1*x2)]} {[-x1*exp(-x1*x2)]} {[20 ]}
迭代次数=1 x1=0.91968721 x2=0.46082246 x3=-0.50338764 精度:1.5033876355
迭代次数=2 x1=0.50100049 x2=0.18743348 x3=-0.52086923 精度:0.4186867278
迭代次数=3 x1=0.50054294 x2=0.06115345 x3=-0.52200096 精度:0.1262800240
迭代次数=4 x1=0.50010444 x2=0.01161711 x3=-0.52329515 精度:0.0495363479
迭代次数=5 x1=0.50000551 x2=0.00060562 x3=-0.52358294 精度:0.0110114900
迭代次数=6 x1=0.50000002 x2=0.00000183 x3=-0.52359873 精度:0.0006037894
迭代次数=7 x1=0.50000000 x2=0.00000000 x3=-0.52359878 精度:0.0000018264
另附运行截图
文章来源:https://www.toymoban.com/news/detail-502113.html
文章来源地址https://www.toymoban.com/news/detail-502113.html
到了这里,关于牛顿(Newton)迭代法求解非线性方程以及方程组的Matlab实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!