首页 > 解决方案 > matlab中的`fzero`函数找不到根并不断产生错误

问题描述

我正在使用 MATLAB,我想找到方程 F(x)-u=0 的根。这里u=0.2861

F=normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1)).

lambda和的值mu都是 1。

我输入了以下代码

[x,fval] = fzero(@(t) normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1))-u, 10);

并希望这可以帮助我找到根源。我可以在数学上证明这个方程有唯一的根。但是,我不断收到以下错误

使用erfc 输入的错误必须是真实且完整的。

normcdf>中的错误localnormcdf(第 128 行)p(todo) = 0.5 * erfc(-z ./ sqrt(2));

错误normcdf(第 50 行)[varargout{1:max(1,nargout)}] = localnormcdf(uflag,x,varargin{:});

错误 Test>@(t)normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1))-u

错误fzero(第 363 行) a = x - dx; fa = FunFcn(a,varargin{:});

然后我做了一个“蛮力”的方法。

t = [0:0.001:20];
F = normcdf(sqrt(lambda./t).*(t/mu-1))+exp(2*lambda/mu).*normcdf(-sqrt(lambda./t).*(t/mu+1))-u;
plot(t,F)

我可以清楚地看到F(t)-u正在增加的眼球,t根在 0.4 左右。我的问题是为什么fzero在这种情况下不起作用,有没有办法使fzero工作?

标签: matlabnumerical-methods

解决方案


问题是该函数不会改变符号,正如文档所说,这是必需的:

x = fzero(fun,x0)试图找到一个xfun(x) = 0。这个解决方案是fun(x)改变符号的地方——fzero找不到函数的根,例如x^2.

我分解了您的代码以使其更清晰(至少对我而言)。

lambda = 1;
mu = 1;
u = 1;

% break up function code
arg1 = @(t) +sqrt(lambda./t).*(t./mu-1);
arg2 = @(t) -sqrt(lambda./t).*(t./mu+1);
fnc = @(t) normcdf(arg1(t))+exp(2*lambda/mu).*normcdf(arg2(t))-u;
% call fzero to find the root
% [x,fval] = fzero(fnc, 10);

% plot
x = 0:0.01:10;
plot(x,fnc(x))

t由于sqrt在我的函数句柄中,没有为任何输入 < 0 定义该函数arg。因此,如果您将其绘制为t大于 0 的值,您会发现它永远不会超过零。

已编辑:参数中的符号混淆。感谢 flxx指出这一点。情节和代码更新。这个论点仍然成立。

fnc(t)


推荐阅读