matlab 二分法求方程解时 遇到错误使用 feval

二分法程序如下:

function [c, err, yc] = bisect(f,a,b,delta)  
%=================input==================================
%-f is the function input as a sting 'f'
%-a and b are the left and right end points
%-delta is the tolerance
%=================output=================================
%-c is the zero
%yc = f(c)
%err is the error estimate for c
%========================================================
% 计算区间端点a,b的函数值
ya = feval(f,a);
yb =feval(f,b);
% 如果同号,则无零点
if ya*yb >0
end
% 根据误差delta推算迭代次数(这是解析推出的)
max1 = 1+round((log(b-a)-log(delta))/log(2));
% 开始循环
for k = 1:max1
   %计算a,b的中点
    c = (a+b)/2;
    %计算c的函数值
    yc=subs(f,c);
    % 若c的函数值为0,则c为零点
    if yc == 0
        a = c;
        b = c;
    % 若b,c的函数值同号,则收缩b为c
    elseif yb*yc > 0
        b=c;
        yb=yc;
    % 若a,c的函数值同号,则收缩a为c
    else
        a = c;
        ya = yc;
    end
    % 若a,b差值小于误差限,则停止
    if b-a<delta
        break
    end
end
%最后计算一下,c及其函数值,误差
c=(a+b)/2;
err = abs(b-a);
yc =feval(f,c);
end

 

在命令行窗口输入 [c, err, yc] = bisect('x^3 - 3*x + 1', -1, 1,1e-6),提示错误使用 feval

各位大佬,我是初学,请问这种怎么解决,用的是matlab2018b版,求指导

参考GPT和自己的思路:

根据你的问题描述和代码,可以发现在 bisect 函数中使用了 feval 函数来计算输入函数的值,但在输入参数时,使用了字符串形式的函数表达式 'x^3 - 3*x + 1',而 feval 函数并不支持字符串形式的输入函数。因此,需要对输入函数的表达式进行转换,使其成为 matlab 中可执行的函数句柄,然后再传递给 bisect 函数。可以使用 matlab 中的 str2func 函数来实现这一点,将输入函数表达式转换为函数句柄即可。

具体的修改方法如下:

  1. 将 bisect 函数中的 ya = feval(f,a) 和 yb = feval(f,b) 改为 ya = f(a) 和 yb = f(b),即直接调用函数句柄来计算函数值。

  2. 在调用 bisect 函数时,将字符串形式的函数表达式 'x^3 - 3*x + 1' 转换为函数句柄并传递给 bisect 函数。具体的修改方法如下:

[c, err, yc] = bisect(str2func('@(x) x^3 - 3*x + 1'), -1, 1, 1e-6)

这样就可以正确地使用 feval 函数来计算函数值,并得到正确的输出结果。

希望对你有帮助!