将MATLAB(Brent方法)的fzero函数转换为C代码

时间:2017-08-15 14:25:55

标签: c matlab

我正在尝试用C语言编写一个类似于MATLAB的函数fzero,我发现fzero使用Brent方法来查找根。

T=fzero(MyFunction,CATHRESHOLD); 

这是我需要的功能,假设给我CATHRESHOLD附近的MyFunction零。

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

b被认为是MyFunction根目前的猜测。 aMyFunction(a)MyFunction(b)具有相反符号的点,因此区间[a, b]包含解决方案。

我可以在知道所有输入的情况下编写brent方法的C代码,但我不能只知道函数和我称之为CATHRESHOLD的函数。 我该如何选择a的价值?!

任何人都可以向我解释fzero如何运作可能会有所帮助!

1 个答案:

答案 0 :(得分:0)

fzero(fun,x0)的{​​{3}},您可以看到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

我们看到上述两个输入选项的处理

{{1}}