一、实验目的

二、实验方法

三、实验内容


注:上面的是我自己手打的,因为有用MathType打的,不方便复制,所以我就截图了。
四、实验程序
二分法
function x=agui_bisect(fname,a,b,e) % a,b为左右端点,e为精度
fa=feval(fname,a); % feval函数求相应函数在某个点的函数值
fb=feval(fname,b);
if fa*fb>0
error('两端函数值同号,没有实根');
end
k=0; % k为迭代次数
x=(a+b)/2; % 二分法取中间的值
while (b-a)>(2*e)
fx=feval(fname,x);
if fa*fx>0
a=x;
fa=fx;
else
b=x;
fb=fx;
end
disp(x)
k=k+1;
x=(a+b)/2;
end
迭代法
function x=agui_iteration(fname,x0,e)
% fname为函数名,x0为迭代初值,e为迭代精度
N=100; % 最大迭代次数
x=x0;
x0=x+2*e;
k=0;
while abs(x0-x)>e&k<N
k=k+1;
x0=x;
x=(2-exp(x0))/10;
disp(x)
end
if k==N
warning('已经达到最大迭代次数');
end
牛顿迭代法
function x=agui_newton(fname,dfname,x0,e)
% fname为函数名,x0为迭代初值,e为迭代精度
N=100; % 最大迭代次数
x=x0;
x0=x+2*e;
k=0;
while abs(x0-x)>e&k<N
k=k+1;
x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);
disp(x)
end
if k==N
warning('已经达到最大迭代次数');
end
五、实验结果
二分法
>> fun=inline('exp(x)+10*x-2','x')
fun =
内联函数:
fun(x) =exp(x)+10*x-2
>> x=agui_bisect(fun,0,1,5e-4)
0.5000
0.2500
0.1250
0.0625
0.0938
0.0781
0.0859
0.0898
0.0918
0.0908
x =
0.0903
迭代法
>> fun=inline('exp(x)+10*x-2','x')
fun =
内联函数:
fun(x) =exp(x)+10*x-2
>> x=agui_iteration(fun,0,5e-4)
0.1000
0.0895
0.0906
0.0905
x =
0.0905
牛顿迭代法
>> fun=inline('exp(x)+10*x-2','x')
fun =
内联函数:
fun(x) =exp(x)+10*x-2
>> dfun=inline('exp(x)+10','x')
dfun =
内联函数:
dfun(x) =exp(x)+10
>> x=agui_newton(fun,dfun,0,5e-4)
0.0909
0.0905
x =
0.0905
六、结果分析
二分法的计算次数为11次;迭代法的计算次数为5次;牛顿迭代法的计算次数为3次,牛顿迭代法的计算次数最少,可以大大减小计算量,而且误差更小。
实验一方程求根:二分法、迭代法。
实验二解方程组的直接法:列主元高斯-约当消去法。
实验三求解特殊线性方程组:追赶法。
实验四解线性方程组的迭代法:高斯-赛德尔迭代法。
实验五插值问题:牛顿插值。
实验六数值积分:复合辛普生公式
实验七数值微分:变步长中点方法
实验八常微分方程初值问题:改进的欧拉公式。