我试图用C语言编写与MATLAB中称为fzero
的函数相似的函数,我发现fzero使用Brent方法来查找根。
T=fzero(MyFunction,CATHRESHOLD);
这是我需要的功能,应该在
CATHRESHOLD
附近给我MyFunction的零。当我尝试实现Brent方法以查找所需结果时,我发现除了MyFunction外,我还需要两个输入
a
和b
。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/