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));

您现在可以作为参数MyAnonFunc传入。bjsect它具有函数句柄的对象类型,可以使用isa. 在里面bjsect简单地使用MyAnonFunc,就好像它是一个函数,即:MyAnonFunc(SomeInputValue).

请注意,您当然可以将您编写的任何函数包装在匿名函数中,即:

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

是完全有效的。

编辑:哎呀,刚刚意识到这几乎肯定是另一个问题的重复 - 谢谢 H. Muster,我会标记它。

于 2012-10-05T06:11:58.860 回答