matlab实现牛顿迭代法求解非线性方程组_第1页
matlab实现牛顿迭代法求解非线性方程组_第2页
matlab实现牛顿迭代法求解非线性方程组_第3页
matlab实现牛顿迭代法求解非线性方程组_第4页
matlab实现牛顿迭代法求解非线性方程组_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0

x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到0.00001————————————————————————————————首先建立函数fun

储存方程组编程如下将fun.m保存到工作路径中:

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+0.1)^2+sin(x3)+1.06;f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;f=[f1

f2

f3];

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

建立函数dfun

用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:

function

df=dfun(x);

%用来求解方程组的雅克比矩阵储存在dfun中

f=fun(x);

df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];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'

'x3'},{x0(1)

x0(2)

x0(3)});df=subs(dfun(x0),{'x1'

'x2'

'x3'},{x0(1)

x0(2)

x0(3)});

x=x0-f/df;for

j=1:length(x0);

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

end

if

norm(x-x0)<eps

con=1;

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);endfor

j=1:ifprintf(fid,'\n%6d

',j);for

k=1:length(x0)fprintf(fid,'

%10.6f',il(j,k));end

endif

con==1fprintf(fid,'\n计算结果收敛!');

endif

con==0fprintf(fid,'\n迭代步数过多可能不收敛!');endfclose(fid);————————————————————————————————运行程序在matlab中输入以下内容

newton([0.1

0.1

-0.1],0.00001,20)————————————————————————————————输出结果

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

在iteration中查看迭代过程

iteration

x1

x2

x3

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

function

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

%非线性方程组:f

%初始解:a

%解的精度:eps

%求得的一组解:r

%迭代步数:n

if

nargin==2

eps=1.0e-6;

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)

%迭代步数控制

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

return;

end

end

x0=[000];

[r,n,data]=budong(x0);

disp('不动点计算结果为')

x1=[111];

x2=[222];

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

disp(’初始值为0,牛顿法计算结果为:’)

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

disp('初始值为1,牛顿法计算结果为:')

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

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

budong.m

function[r,n,data]=budong(x0,tol)

ifnargin=-1

tol=1e-3:

end

x1=budongfun(x0);

n=1;

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

x0=x1;

x1=budong_fun(x0);

n=n+1:

data(:,n)=x1;

end

r=x1:

new_ton.m

function[x,n,data]=new_ton(x0,tol)

ifnargin=-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;

budong_fun.m

functionf=budong_fun(x)

f(1)=3*x(1)-cos(x(2)*x(3))-1/2;

f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06;

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

f=[f(1)*f(2)*f(3)];

df1.m

functionf=df1(x)

f=[3sin(x(2)*x(3))*x(3)sin(x(2)*x(3))*x(2)

2*x(1)-162*(x(2)+0.1)cos(x(3))

exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20];

结果:

不动点计算结果为

r=

1.0e+012*

NaN

-Inf

5.6541

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论