【问题标题】:Numerically solve a gamma parameter estimation数值求解伽马参数估计
【发布时间】:2017-06-24 21:24:02
【问题描述】:

我正在尝试在 Matlab 中使用 fzero 对方程进行数值求解。这是一个更大的练习的一部分。我在这里发布的内容不多,因此不确定您需要多少有关此练习的背景信息,因此尽量保持简短。

这是我的代码:

fun = @(a)log(a/xBar) + (1/n) * log(dataProd) + diff(gamma(a))/gamma(a);
x0 = 0.8014;
x = fzero(fun,x0)

这些是值: n = 209 xBar 为 0.6078 dataProd = 3.1554e-77

我在 Matlab 中收到以下错误消息:

|| 的操作数和 && 运算符必须可转换为逻辑 标量值。

fzero 中的错误(第 306 行)

elseif ~isfinite(fx) || ~isreal(fx)

知道为什么我会收到此错误消息吗?

【问题讨论】:

  • diff 对你来说是什么?因为diff 计算数组中相邻值之间的差异。 1 值数组中的值之间的差异是“不存在”或[],因此diff(gamma(a))[]。当a 是单个值时,这使得fun(a) 返回[],这fzero 失败。实际上你的fun 只为单个值定义,所以它总是返回[]
  • 如果您所说的 diff 是伽马函数的导数,那么请查看 Matlab 函数 psi。您可以使用它来计算 Gamma 的导数。但由于我们不知道您要做什么,这只是一个猜测。
  • 我在看这个页面:se.mathworks.com/help/symbolic/differentiation.html。这就是为什么我认为 diff 是函数的微分。所以我想要的是伽玛在点a处的导数除以伽玛。我似乎这就是 psi(a) 是什么。我将 diff(gamma(a))/gamma(a) 更改为 psi(a)。谢谢:)

标签: matlab numerical


【解决方案1】:

我猜想,在寻找解决方案期间,fzero 会尝试在 a=0 处评估您的函数,从而导致无穷大。要检查是否是这种情况,请查看是否可以将优化参数“display”设置为“iter”,或者在您的 Matlab 版本中设置类似的参数。否则,您可以简单地将函数移动到单独的 m 文件并在第一行调用 disp(a)。这样,您将能够看到 fzero 正在做什么以及导致问题的 a 值。

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2013-08-04
    • 2021-12-23
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多