概念不多说,很好理解,直接放代码:
代码说明:针对每一个问题,我分别创建了三个文件,解法1.m 解法2.m 以script为后缀名的文件。前两个文件存入两种解法的实现函数,最后一个用来存放脚本文件,即将测试的数据编入,调用时可直接在命令行窗口输入脚本文件名。
bisect1.m
function [x,k]=bisect1(f,a,b,eps)
%此题先计算了达到精确值所要走的步数,再用for循环求解x
%kmax=1+floor((log(b-a)-log(eps))/log(2)) Kmax为达到输入精度要走的步数,书上公式
%f为待求函数,[a,b]为起始区间,eps为精度,有默认值
if nargin<4
eps=1e-5; %eps的默认值
end
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
disp('[a,b]不是有根区间!')
end
kmax=1+floor((log(b-a)-log(eps))/log(2));
for k=1:kmax
x=(a+b)/2;
fx=feval(f,x);
if fx*fa<0
b=x;
fb=fx;
elseif fx*fa>0
a=x;
fa=fx;
else
a=x;
b=x;
break;
end
end
%若在for循环底部多加一步下面的判断,情况会不一样
%if(b-a)/2<eps
% break;
%end
%x=(a+b)/2;
%这是因为先判断区间是否符合精度标准,再求该区间的x
bisect2.m
function [x,k]=bisect2(f,a,b,eps)
%用while循环找出符合精度的区间
%while循环可用于当循环次数不确定时
if nargin<4
eps=1e-5;
end
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
x=[fa,fb];k=0;
return;
end
k=1;
while abs(b-a)/2>eps
x=(a+b)/2;
fx=feval(f,x);
if fa*fx<0
b=x;
fb=fx;
else
a=x;
fa=fx;
end
k=k+1;
end
x=(a+b)/2;
bisectscript.m
clc;
f=inline('x^3-x-1');
[x,k]=bisect2(f,1,1.5,0.005)
[x,k]=bisect1(f,1,1.5,0.005)
运行结果:
>>bisectscript
x =
1.3242
k =
7
x =
1.3242
k =
7
由于数值分析这门课所以才开始接触MATLAB,在这给同我一样是初学者的人提个建议,要想看懂这些代码,必须先掌握一些matlab的基础流程控制与两种m文件的编写,这样以后看代码就容易多了。基于刚学,博文肯定有不尽完善的地方,也希望大家可以指出来,共同进步。以后会陆续将我的学习心得与代码分享出来,供大家参考。
以上代码均为原创,转载请注明出处。 --凉柒-lq