我试图用C语言编写与MATLAB中称为fzero的函数相似的函数,我发现fzero使用Brent方法来查找根。

T=fzero(MyFunction,CATHRESHOLD);


这是我需要的功能,应该在CATHRESHOLD附近给我MyFunction的零。

当我尝试实现Brent方法以查找所需结果时,我发现除了MyFunction外,我还需要两个输入ab

b被认为是MyFunction根目录的当前猜测。
a是使MyFunction(a)MyFunction(b)具有相反符号的点,因此间隔[a, b]包含解。

我可以编写知道所有输入的brent方法的C代码,但不能编写仅知道函数和我称为CATHRESHOLD的代码。
我应该如何选择a的值?

谁能向我解释fzero的工作原理,也许会有所帮助!

最佳答案

fzero(fun,x0)documentation中,您可以看到x0应该在间隔[a,b]之内,以便f(a)f(b)具有不同的符号。

通过在命令窗口中键入edit fzero,我们可以打开函数本身。通过浏览未混淆的代码,这可以帮助您编写自己的版本。在函数的顶部,我们看到了描述:

%   X = FZERO(FUN,X0) tries to find a zero of the function FUN near X0,
%   if X0 is a scalar.  It first finds an interval containing X0 where the
%   function values of the interval endpoints differ in sign, then searches
%   that interval for a zero.


因此fzero仍使用间隔[a,b],它只是找到标量X0周围的间隔。请注意,您还可以将间隔传递给fzero,如第二个输入选项所述:

%   X = FZERO(FUN,X0), where X0 is a vector of length 2, assumes X0 is a
%   finite interval where the sign of FUN(X0(1)) differs from the sign of
%   FUN(X0(2)). An error occurs if this is not true.




具体来说,请参见函数的开始部分

% Interval input


我们在哪里看到以上两个输入选项的处理

if (numel(x) == 2)
    % ...
    a = x(1); savea=a;
    b = x(2); saveb=b;
    % ...
elseif (numel(x) == 1)
    % ...
    % method for calculating a and b
    % ...
end

关于c - 将MATLAB的fzero函数(布伦特方法)转换为C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45694938/

10-11 19:42