作业帮 > 综合 > 作业

matlab!Input argument "f" is undefined.Error in ==> agui_bis

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/12 05:43:03
matlab!Input argument "f" is undefined.Error in ==> agui_bisect at 3 fa=feval(f,a);
function x=agui_bisect(f,a,b,e)
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
error('两端函数值为同号');
end
k=0
x=(a+b)/2
while(b-a)>(2*e)
fx=feval(f,x);
if fa*fx
matlab!Input argument agui_bis" />
从功能上看,这个是二分法求根的程序.程序自身没有太大问题,楼主遇到的错误是因为直接从编辑器里面点运行了吧?
 
这个程序必须要提供具体的输入参数才可以:第一个参数是待求根的函数,第二、三个是根的区间,第四个是精度.
 
示例(求函数f(x)=1-x^2在0-3区间的根,程序保存为文件agui_bisect.m):
>> f=inline('1-x^2');
>> agui_bisect(f,0,3,1e-6)
ans =
         0.999999761581421
 
但需要注意,这个函数有个BUG,如果区间的中点刚好就是函数的根,则算法没有终止,继续计算下去而得到错误的结果:
>> f=inline('1-x^2');
>> agui_bisect(f,0,2,1e-6)
ans =
          1.99999904632568
 
要改正这个BUG,加入一行代码即可:
function x=agui_bisect(f,a,b,e)
fa=feval(f,a);
fb=feval(f,b);
if fa*fb>0
    error('两端函数值为同号');
end
k=0;
x=(a+b)/2;
while(b-a)>(2*e)
    fx=feval(f,x);
    if abs(fx) <= eps, break, end
    if fa*fx<0
        b=x;
        fb=fx;
    else
        a=x;
        fa=fx;
    end
    k=k+1;
    x=(a+b)/2;
end
此时求解就没问题了:
>> f=inline('1-x^2');
>> agui_bisect(f,0,2,1e-6)
ans =
     1
>> agui_bisect(f,0,3,1e-6)
ans =
         0.999999761581421