二分法没有 return 值
Bisection doesn't return a value
下面的函数 bisection
应该在给定三个输入的情况下找到一个根:函数 f
和使用两个参数 a
和 [=16] 定义的区间=].目的是 a
和 b
的值在函数内改变以接近公共点,只要它们的符号不同即可。
当我这样调用函数时:
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) 的指定公差范围内。
下面的函数 bisection
应该在给定三个输入的情况下找到一个根:函数 f
和使用两个参数 a
和 [=16] 定义的区间=].目的是 a
和 b
的值在函数内改变以接近公共点,只要它们的符号不同即可。
当我这样调用函数时:
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) 的指定公差范围内。