我正在尝试在Matlab中解决一个函数:digamma(x) - log(x/5) = 0
我尝试sol = solve(psi(x)-log(x/5),x)
,但digamma函数psi
与solve
函数不兼容。
有什么方法可以解决这个问题吗?
答案 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
是真实的和积极的,这不是一个糟糕的选择。使用fzero
和psi
的数字版本:
f = @(x)psi(max(x,realmin))-log(max(x,realmin)/5)
x = fzero(f,1)
返回
x =
0.407621610906987
我使用max(x,realmin)
来确保x
永远不会太小(只要fzero
的初始猜测足够大,就可能不需要)。接近零的x
为psi(0)-log(0)
,为NaN
,会导致fzero
出错。