Matlab解决digamma函数

时间:2013-11-19 18:18:17

标签: matlab symbolic-math

我正在尝试在Matlab中解决一个函数:digamma(x) - log(x/5) = 0

我尝试sol = solve(psi(x)-log(x/5),x),但digamma函数psisolve函数不兼容。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

Matlab版本R2011b中符号数学工具箱的sym/psi函数was added所以你不能在R2011a中使它工作并不奇怪。

如果无法升级,请尝试以下两种方法。首先,虽然你不能为符号输入调用psi,但是R2011a中的符号引擎仍然可以知道这个函数。我不保证它会起作用,但你可以试试这个:

x = evalin(symengine,'float(solve(psi(x)-log(x/5),x))')

顺便说一下,您可以考虑设置assumptions - 如果指定x,则syms x real返回的内容会有所不同,因为等式有多个根。如果上述方法有效,那么您可以使用:

调用符号psi的矢量化版本
psisym = @(x)evalin(symengine,['map(' char(sym(x)) ',psi)'])

否则,您必须以数字方式解决此等式(solve无论如何都会以数字的形式给出答案)。只要您假设x是真实的和积极的,这不是一个糟糕的选择。使用fzeropsi的数字版本:

f = @(x)psi(max(x,realmin))-log(max(x,realmin)/5)
x = fzero(f,1)

返回

x =

0.407621610906987

我使用max(x,realmin)来确保x永远不会太小(只要fzero的初始猜测足够大,就可能不需要)。接近零的xpsi(0)-log(0),为NaN,会导致fzero出错。