您好,欢迎来到汇意旅游网。
搜索
您的当前位置:首页matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组

来源:汇意旅游网
matlab实现牛顿迭代法求解非线性方程组

matlab 实现牛顿迭代法求解非线性方程组 已知非线性方程组以下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+^2+sin(x3)+=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到

————————————————————————————————

第一成立函数 fun

储藏方程组编程以下将保留到工作路径中 function

f=fun(x);

:

%定义非线性方程组以下 %变量 x1 x2 x3 %函数 f1 f2

f3

syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+^2+sin(x3)+; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1

f2

f3];

————————————————————————————————

成立函数 dfun

用来求方程组的雅克比矩阵将保留到工作路径中 function

df=dfun(x);

dfun 中

:

%用来求解方程组的雅克比矩阵储藏在 f=fun(x);

df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df');

————————————————————————————————

matlab实现牛顿迭代法求解非线性方程组

编程牛顿法求解非线性方程组将保留到工作路径中

:

function con=0;

x=newton(x0,eps,N);

%此中 x0 为迭代初值 eps 为精度要求 N 为最大迭代步数 con 用来记录结果能否收敛 for

i=1:N;

f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) df=subs(dfun(x0),{'x1' 'x2'

'x3'},{x0(1)

x=x0-f/df; for

j=1: length(x0);

il(i,j)=x(j); end

if

norm(x-x0)con=1; break; end x0=x; end

%以下是将迭代过程写入 txt 文档文件名为 fid=fopen('','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,' %',il(j,k));

x0(2) x0(3)}); x0(2)

x0(3)});

matlab实现牛顿迭代法求解非线性方程组

end end if

con==1

计算结果收敛! ');

fprintf(fid,'\\n end if

con==0

fprintf(fid,'\\n end fclose(fid);

迭代步数过多可能不收敛! ');

————————————————————————————————

运转程序在 matlab 中输入以下内容

newton([ ],,20)

————————————————————————————————

输出结果

———————————————————————————————————————

———

在 iteration 中查察迭代过程

iteration x1 x2 x3

matlab实现牛顿迭代法求解非线性方程组

.mulStablePoint 用不动点迭代法求非线性方程组的一个根

function [r,n]=mulStablePoint(F,x0,eps)

%非线性方程组: f %初始解: a %解的精度: eps %求得的一组解: r %迭代步数: n if

nargin==2

eps=;

end

x0 = transpose(x0); n=1; tol=1; while

tol>eps

r= subs(F,findsym(F),x0); %迭代公式 tol=norm(r-x0);

求法,

norm 为矩阵的欧几里德范数

n=n+1; x0=r; if(n>100000)

%注意矩阵的偏差

%迭代步数控

matlab实现牛顿迭代法求解非线性方程组

disp('

return;

end

end

迭代步数太多,可能不收敛! ');

x0=[0 0 0];

[r,n,data]=budong(x0); disp(' 不动点计算结果为 ') x1=[1 1 1]; x2=[2 2 2];

[x,n,data]=new_ton(x0);

disp( ’初始值为 0,牛顿法计算结果为:’ [x,n,data]=new_ton(x1);

disp(' 初始值为 1,牛顿法计算结果为: ') [x,n,data]=new_ton(x2); disp ('

初始值为 2,牛顿法计算结果为: ')

)

function[r,n,data]=budong(x0, tol) if nargin=-1 tol=1e-3 : end

x1=budong fun(x0) n=1;

while(norm(x1-x0))tol)&(n500)

; matlab实现牛顿迭代法求解非线性方程组

x0=x1;

x1=budong_fun(x0) ; n=n+1: data(:,n)=x1 end r=x1 :

function [x,n,data]=new_ton(x0, tol) if nargin=-1 tol=1e-8 ; end

x1=x0-budong_fun(x0)/df1(x0); n=1;

while (norm(x1-x0))tol) x0=x1;

x1=x0-budong_fun(x0)/df1(x0); n=n+1; data(:,n)=x1; end x=x1;

function f=budong_fun(x) f(1)=3* x(1)-cos(x(2)*x(3))-1/2; f(2)=x(1)^2-81*(x(2)+^2+sin(x(3))+;

f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;

f=[f(1)*f(2)*f(3)] ; matlab实现牛顿迭代法求解非线性方程组

function f=df1(x)

f=[3sin(x(2)*x(3))*x(3) sin(x(2)*x(3))*x(2) 2* x(1)-162*(x(2)+cos(x(3))

exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20]; 结果:

不动点计算结果为

r= +012* NaN

-Inf

初始值为 0,牛顿法计算结果为: x=

初始值为 1,牛顿法计算结果为: x=

初始值为 2,牛顿法计算结果为: x=

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务