我需要编写一个正确的二分法方法,这意味着我必须解决所有可能的用户输入错误。这是我的代码:
function [x_sol, f_at_x_sol, N_iterations] = bisection(f, xn, xp, eps_f, eps_x)
% solving f(x)=0 with bisection method
% f is the function handle to the desired function,
% xn and xp are borders of search,
% f(xn)<0 and f(xp)>0 required,
% eps_f defines how close f(x) should be to zero,
% eps_x defines uncertainty of solution x
if(f(xp) < 0)
error('xp must be positive')
end;
if(f(xn)>0)
error('xn must be negative')
end;
if (xn >= xp)
error ('xn must be less than xp')
end;
xg=(xp+xn)/2; %initial guess
fg=f(xg); % initial function evaluation
N_iterations=1;
while ( (abs(fg) > eps_f) & (abs(xg-xp) > eps_x) )
if (fg>0)
xp=xg;
else
xn=xg;
end
xg=(xp+xn)/2; %update guess
fg=f(xg); %update function evaluation
N_iterations=N_iterations+1;
end
x_sol=xg; %solution is ready
f_at_x_sol=fg;
if (f_at_x_sol > eps_f)
error('No convergence')
end
这是我在Matlab中尝试测试时收到的错误消息:
>> bisection(x.^2, 2, -1, 1e-8, 1e-10)
Attempted to access f(-1); index must be a positive integer or logical.
Error in bisection (line 9)
if(f(xp)<0)
我试图查看我的错误代码是否有效,但看起来并不像他们那样。当我尝试在应该工作的函数上测试它时,我得到了同样的错误。
答案 0 :(得分:1)
如果f是函数句柄,那么你需要传递一个函数。而不是
bisection(x.^2, 2, -1, 1e-8, 1e-10)
你应该做点什么
bisection(@(x)x.^2, 2, -1, 1e-8, 1e-10)