牛顿法和割线法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业十(第五章):1. 在区间(0,1.5)上分别用二分法、牛顿法和割线法编程求下面的函数的零点,精度要求10-10。
22
()=cos(2)
f x x x
二分法
function [X]=bisection(fx,xa,xb,n,delta)
% 二分法解方程
% fx是由方程转化的关于x的函数,有fx=0。
% xa 解区间上限
% xb 解区间下限
%解区间人为判断输入
% n 最多循环步数,防止死循环。
%delta 为允许误差
x=xa;fa=eval(fx);
x=xb;fb=eval(fx);
for i=1:n
xc=(xa+xb)/2;x=xc;fc=eval(fx);
X=[i,xc,fc];
if fc*fa<0
xb=xc;
else xa=xc;
end
if (xb-xa) 二分法结果: 迭代34次,xc=0.5149 牛顿法 function [X]=newton(fx,e,x0,m) x=x0;k=0; F=eval(fx); if abs(F)<=e X=[x F]; disp(X); return end while k<=m x=x0;g=eval(diff(fx)); x1=x0-F/g; x=x1;F=eval(fx);k=k+1; if abs(F)<=e X=[x1 F k];return end if k>m fprintf('牛顿法迭代M次没有找到方程的根') return end x0=x1; end fprintf('\n%s%.4f\t%s%d','X=',X,'k=',k) %输出结果牛顿法结果: 迭代5次结果0.5149 割线法:function [X]=gx9(fx,x0,x1,m,e) x=x0;f0=eval(fx); x=x1;f1=eval(fx); if abs(f0)<=e X=[x0,f0]; end for k=2:m if abs(f0) b=x0;x0=x1;x1=b; b=f0;f0=f1;f1=b; end t=(x1-x0)/(f1-f0);x0=x1;f0=f1; x1=x1-t*f1; x=x1;f1=eval(fx); if abs(f1)<=e X=[x1,f1,k] return end End 割线法结果: 迭代7次结果0.5149 2.编程求下面的函数在区间[0,13]上的所有零点,精度要求10-10。提示:先扫描得到解所在区间,再用迭代法 求解。 ()=2-cos x f x x function [X]=scan(a,b,fx) x=a;y0=eval(fx);m=100000;e=10^-10; for k=0:0.01:13 x=x+k; y1=eval(fx); if y1==0 X=x;disp(X); return end if y0*y1>0 y0=y1;continue end x0=x-k;x1=x; [X]=gx9(fx,x0,x1,m,e);%割线法 if x>b X=x;disp(X); end y0=y1; end %%%%%%%%%%%%%%%% function [X]=gx9(fx,x0,x1,m,e) x=x0;f0=eval(fx); x=x1;f1=eval(fx); if abs(f0)<=e X=[x0,f0]; end for k=2:m if abs(f0) b=x0;x0=x1;x1=b; b=f0;f0=f1;f1=b; end t=(x1-x0)/(f1-f0);x0=x1;f0=f1; x1=x1-t*f1; x=x1;f1=eval(fx); if abs(f1)<=e X=[x,f1,k] end End 扫描法结果: