二分法没有 return 值

Bisection doesn't return a value

下面的函数 bisection 应该在给定三个输入的情况下找到一个根:函数 f 和使用两个参数 a 和 [=16] 定义的区间=].目的是 ab 的值在函数内改变以接近公共点,只要它们的符号不同即可。

当我这样调用函数时:

bisection( @(x)x-1 ,-2,3)

没有返回任何输出。我做错了什么?

function X = bisection(f,a,b)

if ge((f(a)*f(b)),0)

    disp('Wrong')

    return;
end

X = (a+b)/2;
while abs(X)>0.01

    if f(X)*f(a)>0
        X=a;
    else 
        X=b;
    end
end

进入无限!

做得好!您已经编写了第一个(相信我,这不是最后一个)无限循环。问题是三方面的。首先,您的停止条件是 abs(X) 并且应该是 abs(f(X)) - 您不关心 X 为零,您希望 f(X) 为零。其次你没有正确更新你的 X 所以你的中断条件永远不会被击中(除非你很幸运地给这个函数对称的 a,b 边界在函数的零附近)。您可以通过在 while 循环中的某处添加像 disp(f(X)); pause(0.5); 这样的行来轻松地看到这一点。

一般来说,尽量避免出现带有明确停止条件的无限循环。在我下面的代码中,我设置了交互限制,超过该限制算法将停止(捕获该条件并警告用户达到迭代限制会更优雅......)。

function x0 = bisection(f,a,b)
assert(f(a)*f(b)<0,'Invalid f(x) range. f(a)*f(b) >= 0');

tol = 0.00001; % Tolerance
iter_limit = 10000; % Limit of number of iterations

iter = 0;
x0 = (a+b)/2; % Midpoint
while abs(f(x0)) > tol && iter < iter_limit
    if f(x0)*f(a) > 0
        a = x0; % Zero to the right of the midpoint
    else 
        b = x0; % Zero to the left
    end

    x0 = (a+b)/2; % Recalculate midpoint
    iter = iter + 1;
end
end

这对

应该没问题
f = @(x)x-1;
bisection(f,-2,3);

我得到类似 0.999992370... 的值,它在实际答案 (1) 的指定公差范围内。