Python 中符号函数的数值积分

Numerical integration of symbolic function in Python

我是 Python 的新手,所以我的一些问题或想法可能很愚蠢,但是...

我想绘制分布 D(x)。 m 和 s2 是一些给定的实数。有人告诉我绘制 D(x) 的最佳方法是编写一个函数来求解每个 x 的积分(在函数 D(x) 中)。

其中chi2是这样定义的:

所以,据我所知,我应该先积分,然后我才能解决每个 x,如果我错了,请纠正我。

我也被告知要用数值计算积分,但我不知道该怎么做,因为函数中包含符号。 我已经尝试过使用符号积分(尽管有人告诉我),但是内核永远不会结束积分过程,以及当我尝试对其进行数值计算时。当我尝试 integrationg numericaly 时,我当然使用了 lamdify。

所以这是我的代码: 1. 尝试求解符号积分

from sympy import symbols, integrate, sqrt, exp, oo

s2= 0.0628777415586
m= 5.02422436191

x, n, z=symbols ('x, n, z')
integrate(exp(-n/(z+1) * (x-m)**2/2*s2)  *  1/2 / sqrt(z+1), (z, 0, oo))

不工作,内核永远不会停止。 [我在公式里放了1/2而不是chi2,打算以后改]

另一种方法是尝试求解数值积分(从函数 D(x) 调用它)

import scipy.integrate
from scipy.stats import chi2
from math import *


s2= 0.0628777415586
m= 5.02422436191

def numint(z, n, x):
    return exp(-n/(z+1) * (x-m)**2/2*s2)  *  scipy.stats.chi2(z) / sqrt(z+1)

scipy.integrate.quad(numint, 0, np.inf, args=(1, 2))

错误来自 return 行并表示:

TypeError: unsupported operand type(s) for *: 'float' and 'rv_frozen'

我想这里的问题是因为 chi2 是 rv_frozen,但是如何让它工作呢?我的代码中有什么错误吗?我不知道我写的是否正确以及如何解决这个问题...... 我已经为此工作了很长时间,有点绝望,所以欢迎任何帮助。

I am supposed to integrate first and then I can solve for each x, correct me if I am wrong.

不,你选x然后积分。对该函数进行积分的唯一机会是数值,为此必须给出除积分变量 (z) 之外的所有符号的值。

m and s2 are some given real numbers.

然后给他们。此外,必须指定 n。函数 D(x) 取决于符号参数 m、n、s(不是 z,因为 z 正在被积分出来)。绘图需要数值评估,并且在选择 m、n、s 的某些值之前,无法对此函数进行数值评估。

the problem here comes becaue of chi2 which is rv_frozen

是的,chi2 是一个随机变量,您需要该随机变量的概率密度函数,可通过 .pdf 方法访问。 Read the docs.

一个完整的例子。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
from scipy.stats import chi2
integrand = lambda z, x, m, n, s: np.exp(-(n/(z+1))*(x-m)**2/(2*s**2)) * chi2.pdf(z, n)/np.sqrt(z+1)
D = lambda x, m, n, s: np.sqrt(n/2*np.pi*s**2) * quad(integrand, 0, np.inf, args=(x, m, n, s))[0]
x = np.linspace(0, 5, 100)
y = np.vectorize(D)(x, 3, 10, 1.5)  # some values of m, n, s
plt.plot(x, y)
plt.show()

要对具有除积分变量以外的符号的方程进行积分,您必须使用 sympy 库。

您实际上需要做的是将符号定义为符号(Python 不知道这些字母(符号)是否代表一些实数值并且在积分过程中应该被忽略)。

积分完成后,您可以用一些数字替换符号的值。

请查看下面的link以获取带符号积分方程的示例代码

检查用户的答案:link中的MSD,它会清楚