matlab - 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
工作?
解决方案
问题是该函数不会改变符号,正如文档所说,这是必需的:
x = fzero(fun,x0)
试图找到一个x
点fun(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指出这一点。情节和代码更新。这个论点仍然成立。
推荐阅读
- c# - OpenTK 中的最近邻插值模式存在吗?
- javascript - 隐藏和显示 PC 和移动浏览器中的功能切换
- python - 如何使用 pk selected 在多对多关系中使用 prefetch_related
- python - 将同名对象传递给字典正在修改旧对象(通过引用传递)
- c++ - 这段代码使用 std::sort 按值对 CPP 中的地图进行排序有什么问题?
- javascript - (jQuery) 使用 extend() 访问自定义属性时出现问题
- asp.net-core - 如何通过 FTP 从 Azure DevOps 发布到服务器?
- javascript - 如何仅在第一次调用函数时在函数内定义变量?
- python - 如何在Python中处理字符串列包含只有小时、分钟和秒的日期
- css - 离子图标周围的阴影/轮廓