0

重複の可能性:
関数を引数として別の関数に渡す

以下は二分法の簡単なコードです。関数をハードコーディングする代わりに、パラメーターとして選択した関数を渡す方法を知りたいです。

% This is an implementation of the bisection method
% for a solution to f(x) = 0 over an interval [a,b] where f(a) and f(b)
% Input: endpoints (a,b),Tolerance(TOL), Max # of iterations (No).
% Output: Value p or error message.

function bjsect(a,b,TOL,No)
% Step 0
if f(a)*f(b)>0
    disp('Function fails condition of f(a),f(b) w/opposite sign'\n);
    return
end
% Step 1
i = 1;
FA = f(a);
% Step 2
while i <= No
    % Step 3
    p = a +(b - a)/2;
    FP = f(p);
    % Step 4
    if FP == 0 || (b - a)/2 < TOL
        disp(p); 
    return
    end
    % Step 5
    i = i + 1;
    % Step 6
    if FA*FP > 0
        a = p;
    else
        b = p;
    end
    % Step 7
   if i > No
       disp('Method failed after No iterations\n');
       return 
   end
end
end

% Hard coded test function
function y = f(x)
y = x - 2*sin(x);
end

これは重要な概念であることを知っているので、どんな助けも大歓迎です。

4

1 に答える 1

1

最も簡単な方法は、無名関数を使用することです。あなたの例では、次をbjsect使用して外部で匿名関数を定義します。

MyAnonFunc = @(x) (x - 2 * sin(x));

MyAnonFuncbjsect引数として渡すことができるようになりました。を使用して検証できる関数ハンドルのオブジェクト型を持ちますisa。内部では、関数であるかのようにbjsect単純に使用します。MyAnonFuncMyAnonFunc(SomeInputValue)

もちろん、匿名関数で記述した関数をラップできます。つまり、次のようになります。

MyAnonFunc2 = @(x) (SomeOtherCustomFunction(x, OtherInputArgs));

完全に有効です。

編集:おっと、これはほぼ確実に別の質問の複製であることに気付きました-H.Musterに感謝します。フラグを立てます。

于 2012-10-05T06:11:58.860 に答える