二分法
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;
1/16页
k=0;
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<3
ep=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
2/16页

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
3/16页
非线性方程求根的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 =
4/16页

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
5
32
>> [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
列选主元的高斯消元法: