数值计算方法Matlab练习题
姓名学号
侯永琪-B18021008
第一题
(1)二分法
求解结果
matlab程序(主函数dichotomy())
%二分法计算函数的零点
%输入求根区间a,b和求根精度abtol
%函数输出根的近似值,和迭代次数
function dichotomy()
a=input('请输入求根的下限,a=');
b=input('请输入求根的上限,b=');
abtol=input('请输入求根的精度,abtol=');
iterations=0;
ya=fun(a);yb=fun(b);%程序中调用的fun.m为函数
if ya*yb>0
fprintf('注意:ya*yb>0,请重新调整区间端点a和b.'),return
else
[iter,y]=dichotomyRoot(a,b,abtol,iterations);
disp('Root='),disp(y);
end
disp('迭代次数='),disp(iter);
end
matlab程序(子函数dichotomyRoot())
%可以只运行某一个小函数(内层函数)
%使用二分法计算函数的零点
%参数a,b为根的大概区间,abtol为精度
function [iterations,y]=dichotomyRoot(a,b,abtol,counter)
x=(a+b)/2;
f3=fun(x);
f1=fun(a);
if(f1*f3<0)
m=x-a;
if(m>abtol)
b=x;
counter=counter+1;
[counter,y]=dichotomyRoot(a,b,abtol,counter);
else
y=x;
end
else
m=b-x;
if(m>abtol)
a=x;
counter=counter+1;
[counter,y]=dichotomyRoot(a,b,abtol,counter);
else
y=x;
end
end
iterations=counter;
end
matlab程序(子函数fun())
function y1=fun(x)
y1=exp(x)+10*x-2;
(2)简单迭代法
求解结果
主函数
clc
x0=0.5;
x1=fun(x0);
k = 1;
while(abs(x1-x0)>0.0005)
x0=x1;
x1=fun(x1);
k = k +1;
end
disp('解题结束')
disp('简单迭代法所求根为')
disp(x1)
disp('迭代次数为')
disp(k)
子函数(fun())
function y1=fun(x)
y1=(2-exp(x))/10;
(3)牛顿迭代法
求解结果
主函数
x = input('x=');%开始迭代最初的x
eps = input('eps=');%定义所要求解的精度
syms x1;%定义两Xk+1和Xk的差,一次来限制精度的要求
x1=100;
syms xa;
xa=x;
k = 1;
syms xb;%记录上一个x和下一个x
while x1>eps
xb = xa;
xa = newton1(xb);
x1 = abs(xa-xb);%得到▲x
k = k+1;
end
disp('该函数符合规定精度的解是:');
double(xa)
disp('迭代次数为:');
disp(k)
%xa即为所求的值
子函数1||2
function y = newton(x)
y = exp(x)+10*x-2;%任意函数
end
%function的自定义函数用来保存咱们要进行牛顿迭代的函数
function y = newton1(x)
syms a;
f = a - (newton(a)./diff(newton(a)));
y = subs(f,x);%牛顿迭代公式
end
%如果直接用y和x来实现的话,在掉用原函数的时候就算出了具体数值,公式中的求导就会变为0,
%无法求解,所以先用f,a来代替y和x,最后再进行替换,实现牛顿迭代公式。