数值计算方法matlab程序.docx

上传人:b****2 文档编号:1966627 上传时间:2022-10-25 格式:DOCX 页数:22 大小:32.69KB
下载 相关 举报
数值计算方法matlab程序.docx_第1页
第1页 / 共22页
数值计算方法matlab程序.docx_第2页
第2页 / 共22页
数值计算方法matlab程序.docx_第3页
第3页 / 共22页
数值计算方法matlab程序.docx_第4页
第4页 / 共22页
数值计算方法matlab程序.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数值计算方法matlab程序.docx

《数值计算方法matlab程序.docx》由会员分享,可在线阅读,更多相关《数值计算方法matlab程序.docx(22页珍藏版)》请在冰豆网上搜索。

数值计算方法matlab程序.docx

数值计算方法matlab程序

二分法

function[x0,k]=bisect1(fun1,a,b,ep)

ifnargin<4

ep=1e-5;

end

fa=feval(fun1,a);

fb=feval(fun1,b);

iffa*fb>0

x0=[fa,fb];

k=0;

return;

end

k=1;

whileabs(b-a)/2>ep

x=(a+b)/2;

fx=feval(fun1,x);

iffx*fa<0

b=x;

fb=fx;

else

a=x;

fa=fx;

k=k+1;

end

end

x0=(a+b)/2;

>>fun1=inline('x^3-x-1');

>>[x0,k]=bisect1(fun1,1.3,1.4,1e-4)

x0=

1.3247

k=

7

>>

简单迭代法

function[x0,k]=iterate1(fun1,x0,ep,N)

ifnargin<4

N=500;

end

ifnargin<3

ep=1e-5;

end

x=x0;

x0=x+2*ep;

k=0;

whileabs(x-x0)>ep&k

x0=x;

x=feval(fun1,x0);

k=k+1;

end

x0=x;

ifk==N

warning('已达最大迭代次数')

end

>>fun1=inline('(x+1)^(1/3)');

>>[x0,k]=iterate1(fun1,1.5)

x0=

1.3247

k=

7

>>fun1=inline('x^3-1');

>>[x0,k]=iterate1(fun1,1.5)

x0=

Inf

k=

9

>>

Steffesen加速迭代(简单迭代法的加速)

function[x0,k]=steffesen1(fun1,x0,ep,N)

ifnargin<4

N=500;

end

ifnargin<3

ep=1e-5;

end

x=x0;

x0=x+2*ep;

k=0;

whileabs(x-x0)>ep&k

x0=x;

y=feval(fun1,x0);

z=feval(fun1,y);

x=x0-(y-x0)^2/(z-2*y+x0);

k=k+1;

end

x0=x;

ifk==N

warning('已达最大迭代次数')

end

>>fun1=inline('(x+1)^(1/3)');

>>[x0,k]=steffesen1(fun1,1.5)

x0=

1.3247

k=

3

>>fun1=inline('x^3-1');

>>[x0,k]=steffesen1(fun1,1.5)

x0=

1.3247

k=

6

Newton迭代

function[x0,k]=Newton7(fname,dfname,x0,ep,N)

ifnargin<5

N=500;

end

ifnargin<4

ep=1e-5;

end

x=x0;

x0=x+2*ep;

k=0;

whileabs(x-x0)>ep&k

x0=x;

x=x0-feval(fname,x0)/feval(dfname,x0);

k=k+1;

end

x0=x;

ifk==N

warning('已达最大迭代次数')

end

 

>>fname=inline('x-cos(x)');

>>dfname=inline('1+sin(x)');

>>[x0,k]=Newton7(fname,dfname,pi/4,1e-8)

x0=

0.7391

k=4

非线性方程求根的Matlab函数调用举例:

1.求多项式的根:

求f(x)=x^3-x-1=0的根:

>>roots([10-1-1])

ans=

1.3247

-0.6624+0.5623i

-0.6624-0.5623i

2.求一般函数的根

>>fun=inline('x*sin(x^2-x-1)','x')

fun=

Inlinefunction:

fun(x)=x*sin(x^2-x-1)

>>fplot(fun,[-20.1]);gridon

>>x=fzero(fun,[-2,-1])

x=

-1.5956

>>x=fzero(fun,[-1-0.1])

x=

-0.6180

[x,f,h]=fsolve(fun,-1.6)

x=

-1.5956

f=

1.4909e-009

h=

1

(h>0表示收敛,h<0表示发散,h=0表示已达到设定的计算函数值的最大次数)

第三章:

线性方程组的数值解法

1.高斯消元法

function[A,x]=gauss3(A,b)

%本算法用顺序高斯消元法求解线性方程组

n=length(b);

A=[A,b];

fork=1:

n-1

A((k+1):

n,(k+1):

(n+1))=A((k+1):

n,(k+1):

(n+1))-A((k+1):

n,k)/A(k,k)*A(k,(k+1):

(n+1));

A((k+1):

n,k)=zeros(n-k,1);

A;

end

x=zeros(n,1);

%上面为消元过程

x(n)=A(n,n+1)/A(n,n);

fork=n-1:

-1:

1

x(k)=(A(k,n+1)-A(k,(k+1):

n)*x((k+1:

n)))/A(k,k);

end

%上面为回代过程

>>A=[234;352;4330];

>>b=[6,5,32]'

b=

6

5

32

>>[A,x]=gauss3(A,b)

A=

2.00003.00004.00006.0000

00.5000-4.0000-4.0000

00-2.0000-4.0000

x=

-13

8

2

列选主元的高斯消元法:

 

function[A,x]=gauss5(A,b)

%本算法用列选主元的高斯消元法求解线性方程组

n=length(b);

A=[A,b];

fork=1:

n-1

%选主元

[ap,p]=max(abs(A(k:

n,k)));

p=p+k-1;

ifp>k

t=A(k,:

);

A(k,:

)=A(p,:

);

A(p,:

)=t;

end

%消元

A((k+1):

n,(k+1):

(n+1))=A((k+1):

n,(k+1):

(n+1))-A((k+1):

n,k)/A(k,k)*A(k,(k+1):

(n+1));

A((k+1):

n,k)=zeros(n-k,1);

end

%回代

x=zeros(n,1);

x(n)=A(n,n+1)/A(n,n);

fork=n-1:

-1:

1

x(k)=(A(k,n+1)-A(k,(k+1):

n)*x((sk+1:

n)))/A(k,k);

end

>>A=[234;352;4330];b=[6,5,32]';

>>[A,x]=gauss5(A,b)

A=

4.00003.000030.000032.0000

02.7500-20.5000-19.0000

000.18180.3636

x=

-13

8

2

三角分解法:

Doolittle分解

function[L,U]=doolittle1(A)

n=length(A);

U=zeros(n);

L=eye(n);

U(1,:

)=A(1,:

);

L(2:

n,1)=A(2:

n,1)/U(1,1);

fork=2:

n

U(k,k:

n)=A(k,k:

n)-L(k,1:

k-1)*U(1:

k-1,k:

n);

L(k+1:

n,k)=A(k+1:

n,k)-L(k+1:

n,1:

k-1)*U(1:

k-1,n)/U(k,k);

End

y=zeros(n,1);

x=y;

y

(1)=b

(1);

fori=2:

n

y(i)=b(i)-L(i,1:

i-1)*y(1:

i-1);

end

x(n)=y(n)/U(n,n);

fori=n-1:

-1:

1

x(i)=(y(i)-U(i,i+1:

n)*x(i+1:

n))/U(i,i);

end

>>A=[123;252;315];b=[141820]';

>>[L,U,x]=doolittle1(A,b)

L=

100

210

3-81

U=

123

01-4

00-36

x=

2.8333

1.3333

2.8333

 

平方根法:

function[L,x]=choesky3(A,b)

n=length(A);

L=zeros(n);

L(:

1)=A(:

1)/sqrt(A(1,1));

fork=2:

n

L(k,k)=A(k,k)-L(k,1:

k-1)*L(k,1:

k-1)';

L(k,k)=sqrt(L(k,k));

fori=k+1:

n

L(i,k)=(A(i,k)-L(i,1:

k-1)*L(k,1:

k-1)')/L(k,k);

end

end

y=zeros(n,1);

x=y;

y

(1)=b

(1)/L(1,1);

fori=2:

n

y(i)=(b(i)-L(i,1:

i-1)*y(1:

i-1))/L(i,i);

end

x(n)=y(n)/L(n,n);

fori=n-1:

-1:

1

x(i)=(y(i)-L(i+1:

n,i)'*x(i+1:

n))/L(i,i);

end

>>A=[4-11;-14.252.75;12.753.5]

A=

4.0000-1.00001.0000

-1.00004.25002.7500

1.00002.75003.5000

>>b=[467.25]'

b=

4.0000

6.0000

7.2500

[L,x]=choesky3(A,b)

L=

2.000000

-0.50002.00000

0.50001.50001.0000

x=

1

1

1

>>

迭代法求方程组的解

Jacobi迭代法:

function[x,k]=jacobi2(a,b,x0,ep,N)

%本算法用Jacobi迭代求解ax=b,用分量形式

n=length(b);

k=0;

ifnargin<5

N=500;

end

ifnargin<4

ep=1e-5;

end

ifnargin<3

x0=zeros(n,1);

y=zeros(n,1);

end

x=x0;x0=x+2*ep;

whilenorm(x-x0,inf)>ep&k

k=k+1;

x0=x;

fori=1:

n

y(i)=b(i);

forj=1:

n

ifj~=i

y(i)=y(i)-a(i,j)*x0(j);

end

end

ifabs(a(i,i))<1e-10|k==N

warning('a(i,i)istoosmall');

return

end

y

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1