数值计算方法matlab程序

  • 格式:pdf
  • 大小:71.06 KB
  • 文档页数:17

数值计算⽅法matlab程序

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

if nargin<4

ep=1e-5;

end

fa=feval(fun1,a);

fb=feval(fun1,b);

if fa*fb>0

x0=[fa,fb];

k=0;

return;

end

k=1;

while abs(b-a)/2>ep

x=(a+b)/2;

fx=feval(fun1,x);

if fx*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)if nargin<4

N=500;

end

if nargin<3

ep=1e-5;

end

x=x0;

x0=x+2*ep;

while abs(x-x0)>ep & k

x0=x;

x=feval(fun1,x0);

k=k+1;

end

x0=x;

if k==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)

if nargin<4

N=500;

end

if nargin<3ep=1e-5;

end

x=x0;

x0=x+2*ep;

k=0;

while abs(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;

if k==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)

if nargin<5

N=500;

end

if nargin<4

ep=1e-5;end

x=x0;

x0=x+2*ep;

k=0;

while abs(x-x0)>ep & k

x0=x;

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

k=k+1;

end

x0=x;

if k==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([1 0 -1 -1])

ans =

1.3247

-0.6624 + 0.5623i

-0.6624 - 0.5623i

2.求⼀般函数的根

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

fun =

Inline function:

fun(x) = x*sin(x^2-x-1)>> fplot(fun,[-2 0.1]);grid on

>> 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];

for k=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);

for k=n-1:-1:1

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

end

%上⾯为回代过程

>> A=[2 3 4;3 5 2;4 3 30];

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

b =

6

532

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

A =

2.0000

3.0000

4.0000 6.0000

0 0.5000 -4.0000 -4.0000

0 0 -2.0000 -4.0000

x =

-13

8

2

列选主元的⾼斯消元法:function [A,x]=gauss5(A,b)

%本算法⽤列选主元的⾼斯消元法求解线性⽅程组

n=length(b);

A=[A,b];

for k=1:n-1

%选主元

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

p=p+k-1;

if p>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);

for k=n-1:-1:1

x(k)=(A(k,n+1)-A(k,(k+1):n)*x((sk+1:n)))/A(k,k);end

>> A=[2 3 4;3 5 2;4 3 30]; b=[6,5,32]';

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

A =

4.0000 3.0000 30.0000 32.0000

0 2.7500 -20.5000 -19.0000

0 0 0.1818 0.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);

for k=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);

for i=2:n

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

end

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

for i=n-1:-1:1

x(i)=(y(i)-U(i,i+1:n)*x(i+1:n))/U(i,i);

end

>> A=[1 2 3;2 5 2 ;3 1 5];b=[14 18 20]';

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

L =

1 0 0