1

我需要编写二分法的正确实现,这意味着我必须解决所有可能的用户输入错误。这是我的代码:

    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)

我试图查看我的错误代码是否有效,但看起来不像。当我尝试在一个应该可以工作的函数上测试它时,我得到了同样的错误。

4

1 回答 1

1

如果 f 是函数句柄,那么您需要传递一个函数。代替

bisection(x.^2, 2, -1, 1e-8, 1e-10)

你应该做类似的事情

bisection(@(x)x.^2, 2, -1, 1e-8, 1e-10)
于 2012-09-15T21:32:28.537 回答