数值计算方法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