各种迭代法编程

  • 格式:doc
  • 大小:53.00 KB
  • 文档页数:7

下载文档原格式

  / 20
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

雅可比迭代法:

function x=jacobi(a,b,p,delta,n)

%a为n维非奇异矩阵;b为n维值向量

%p为初值;delta为误差界;n为给定的迭代最高次数

N=length(b);

for k=1:n

for j=1:N

x(j)=(b(j)-a(j,[1:j-1,j+1:N])*p([1:j-1,j+1:N]))/a(j,j);

end

err=abs(norm(x’-p));

p=x’;

if(err

break;

end

end

p %显示迭代过程

x=x’;

k,err

高斯塞德尔法迭代:

function x=saidel(a,b,p,delta,n)

%a为n维非奇异矩阵;b为n维值向量

%p为初值;delta为误差界;n为给定的迭代最高次数

N=length(b);

for k=1:n

for j=1:N

if j==1

x(1)=(b(1)-a(1,2:N)*p(2:N))/a(1,1);

else if j=N

x(N)=(b(N)-a(N,1:N-1)*(x(1:N-1))’)/a(N,N);

else

x(j)=(b(j)-a(j,(1:j-1)*x(1:j-1)-a(j,j+1:N)*p(j+1:N))/a(j,j);

end

end

err=abs(norm(x’-p));

p=x’;

if(err

break;

end

end

x=x’;

k,err

不动点迭代法:

function [x,k,err,p]=ddf(f,x0,tol,n)

%ddl.m为用迭代法求非线性方程的解

%f为给定的迭代函数;x0为给定的初始值

%tol为给定的误差界;n为所允许的最大迭代次数

%k为迭代次数;x为不动点的近似值;err为误差

p(1)=x0;

for k=2:n

p(k)=feval(f,p(k-1));

k,

err=abs(p(k)-p(k-1))

x=p(k);

if(err

break;

end

if k==n

disp('迭代超过最大次数!')

end

end

x=p'

牛顿法:

function [x,k,err,y]=Newtun(f,df,x0,tol,n)

%Newtun.m为用迭代法求非线性方程的解

%f为给定的非线性方程;df为f的微分方程;x0为给定的初始值%tol为给定的误差界;n为所允许的最大迭代次数

%k为迭代次数;x为不动点的近似值;err为误差

%x为牛顿迭代法得到得近似解

y(1)=x0;

for k=1:n

x=x0-feval(f,x0)/feval(df,x0);

err=abs(x-x0);

x0=x;

if(err

break;

end

end

必要编辑M文件qfun.m,代码如下:

function y=qfun(x);

y=x^3-3*x-1;

弦截法:

function [x,err,k,y]=xjf(f,x0,x1,tol,n)

%xjf.m为用弦截法迭代法求非线性方程的解

%f为给定的非线性方程;x0,x1为给定的初始值

%tol为给定的误差界;n为所允许的最大迭代次数

%k为迭代次数;x为牛顿迭代法的近似值;err为x1-x0的绝对值

y(1)=x0;

for k=1:n

x=x1-feval('li6_5fun',x1)*(x1-x0)/(feval('li6_5fun',x1)-feval('li6_5fun',x0));

err=abs(x-x1);

x0=x1;

x1=x;

if(err

break;

end

end

必要编辑M文件li6_5.m,代码如下:

function y=li6_5(x);

y=x^3-3*x-1;

复化梯形公式matlab:

function t=tixing(f,a,b,n)

h=(b-a)/n;

sum=0;

for k=0:n-1

x=a+k*h;

sum=sum+feval(f,x);

end

t=h/2*(feval(f,a)+feval(f,b)+2*sum);

运行程序结果:

>> format long

>> tixing(inline('x./(x.^2+4)'),0,1,8)

ans =

0.111402354529548

复化辛普森公式matlab:

function y=xinpusen(f,a,b,n)

h=(b-a)/n;

sn=h/6*(feval(f,a)+feval(f,b));

s=0;

for i=0:n-1

s=s+4*feval(f,a+h/2+i*h)+2*feval(f,a+i*h);

end

y=sn+h*s/6;

运行结果:

>> xinpusen(inline('x./(x.^2+4)'),0,1,8)

ans =