我是Python的新手,所以我的一些问题或想法可能很愚蠢,但是......
我想绘制分布D(x)。 m和s2是一些给定的实数。有人告诉我,绘制D(x)的最好方法是编写一个函数来解决每个x的积分(在函数D(x)内)。
其中chi2如此定义:
所以,尽管我知道数学,但我应该首先进行整合然后我可以为每个x求解,如果我错了,请纠正我。
我也被告知用数字计算积分,但我不知道怎么做,因为函数包括符号。 我已经尝试过使用符号集成(尽管我被告知),但内核永远不会结束集成过程,以及当我尝试用数字计算它时。当我尝试整合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))
错误来自返回行并说:
TypeError: unsupported operand type(s) for *: 'float' and 'rv_frozen'
我认为这里出现的问题是因为chi2是rv_frozen,但如何让它起作用?我的代码中有什么错误吗?我不知道我写的是不对,以及如何解决这个问题...... 我已经在这方面工作了很长时间而且有点绝望,所以欢迎任何帮助。
答案 0 :(得分:1)
我应该首先整合,然后我可以解决每个x,如果我错了,请纠正我。
不,你选择x然后整合。集成此函数的唯一机会是数字,因此必须给出除积分变量(z)之外的所有符号的值。
m和s2是一些给定的实数。
然后给他们。此外,必须指定n。函数D(x)取决于符号参数m,n,s(不是z,因为z被积分)。图形化需要数值评估,并且在选择m,n,s的某些值之前,不能以数字方式评估此函数。
这里出现的问题是chi2,即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()
答案 1 :(得分:1)
对于积分除了积分变量之外的符号的方程式,您必须使用 sympy 库。
您需要做的是将符号定义为符号(Python不知道这些字母(符号)是否代表某些实数值,并且在集成期间是否被遗漏)。
完成整合后,您可以用符号替换符号的值。
请查看以下链接,了解使用符号积分方程式的示例代码
用户检查答案:链接中的MSD,它会清除