python 症状未简化多伽马

oknwwptz  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(128)

我有一个python脚本,它可以找到一个函数的导数,其中有一个gamma函数。当代入值时,sympy只返回polygamma (0, 1.05)或任何输出,而不是找到值的digamma并将其作为一个浮点数返回。下面是我的代码:

import mpmath
import time
import sympy
x = sympy.symbols ('x')
s = sympy.symbols ('s')
from sympy import S, I, pi, gamma, lambdify

Original = ((((sympy.pi**(x/2))*(s**x))/sympy.gamma((x/2)+1))-(((2*s)/(x**0.5))**x))
Prime = Original.diff (x)
Prime = lambdify ((x, s), Prime, modules = 'sympy')
for s_times_10 in range (1, 31):
    s = float (int (s_times_10) / 10)
    for x_times_10 in range (1, 151):
        x = float ((int (x_times_10) / 10))
        print ("x: " + str (x) + ", s: " + str (s))
        print (Prime (x, s))
        if (x > 0.3):
            if (Prime (x + 0.1, s) < Prime (x, s)):
                print ("MAXIMUM N LOCATED: " + str (x))
                time.sleep (1)
                break
        print ("=======")
        time.sleep (0.5)

下面是for循环中x的前5个值的输出:

x: 0.1, s: 0.1
-0.579691734344519 - 0.432005861274674*polygamma(0, 1.05)
=======
x: 0.2, s: 0.1
-0.175935858863424 - 0.371829906705536*polygamma(0, 1.1)
=======
x: 0.3, s: 0.1
0.0107518316667914 - 0.31889065255819*polygamma(0, 1.15)
=======
x: 0.4, s: 0.1
0.098684205215577 - 0.27256963654143*polygamma(0, 1.2)
=======
x: 0.5, s: 0.1
0.133891927091406 - 0.232239660951436*polygamma(0, 1.25)
MAXIMUM N LOCATED: 0.5

正如你所看到的,它不是给我一个简单的浮点数答案,而是返回一个未解的polygamma函数,我如何摆脱这个问题,并最终得到一个浮点数作为最终答案呢?
TLDR:将值替换为差分Gamma函数,并且返回未求解的polygamma函数,而不是返回浮点数。

sr4lhrrt

sr4lhrrt1#

通常,将浮点值替换为符号SymPy函数将导致自动浮点计算:

In [36]: sin(1)
Out[36]: sin(1)

In [37]: sin(1.0)
Out[37]: 0.841470984807897

在您的情况下,表达式既有整数又有浮点数,因此不会自动以浮点计算:

In [38]: polygamma(0, 0.1)
Out[38]: polygamma(0, 0.1)

In [39]: polygamma(0.0, 0.1)
Out[39]: -10.4237549404111

实际上,如果你想要浮点计算,你应该明确地要求它,而不是依赖于它隐式地发生:

In [40]: polygamma(0, 0.1).evalf()
Out[40]: -10.4237549404111

相关问题