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 に答える