我正在尝试使用Python解决这个积分方程:
其中z的范围是0到1.
scipy.quad函数仅提供某个时间间隔的数值解,但它不提供该时间间隔内的解。
def f(z,Om,Ol): return 1./p.sqrt((1+z)**2 * (1+Om*z) - z*(2+z)*Ol)
quad(lambda r:f(r,Om,Ol),0,1)
(0.77142706642781111, 8.5645609096719596e-15)
但我不知道如何在此区间内获得完整的向量,就像使用scipy.odeint来求解微分方程一样。
另一方面,sympy.integrate无法做到。我得到一个堆栈溢出。另外,我无法弄清楚如何用符号代替符号,即:
sy.integrate(x**2,x).subs(x,1)
1/3
sy.integrate(x**2,x).subs(x,[1,2])
TypeError: unhashable type: 'list'
所以问题是:有没有人知道如何使用python解决积分方程?
答案 0 :(得分:4)
我知道您想要在不同位置求解微分方程dF/dz1 = f(z1, Om, Ol)
并希望F(z1)
。如果是这种情况,那么SciPy的Ordinary Differential Equation (ODE) routines就可以了。您可能希望check odeint()
,因为它可以在您指定的位置为您提供积分值。
答案 1 :(得分:1)
我认为积分之前的z是一个拼写错误,应该是z1,而你正在寻找给定DL的z1。
首先,您必须实施右侧(rhs):
def f(z,Om,Ol):
return 1./p.sqrt((1+z)**2 * (1+Om*z) - z*(2+z)*Ol)
def rhs(z1, Om, Ol, c, H0):
return c/H0*(1+z1)*quad(lambda r:f(r, Om, Ol), 0, z1)[0]
现在你必须找到一个z0,使rhs(z1,...)= DL,这与
相同rhs(z1, ...) - DL = 0
这意味着您的问题减少为找到零(只有一个,因为rhs是单调的),
f(z1) = rhs(z1, ...) - DL
在这里,您可以从http://en.wikipedia.org/wiki/Root-finding_algorithm
应用许多方法进行根查找(请参阅http://docs.scipy.org/doc/scipy/reference/optimize.html#root-finding)答案 2 :(得分:0)
在http://docs.sympy.org/0.7.1/modules/integrals.html的症状示例部分,他们展示了几乎相同问题的解决方案。你能发表你的问卷代码吗?
对于scipy,您是否尝试使用可以清除的元组而不是列表? e.g:
sy.integrate(x**2,x).subs(x,(1,2,))
答案 3 :(得分:0)
我最后使用带有for语句的“quad”函数来解决我的问题:
import pylab as p
import scipy as s
from scipy.integrate import odeint,quad
def Dl_lflrw(z,Om,Ol):
c = 1.
H0 = 1.
y = []
for i in z:
y1 = (c/H0)*(1+i)*quad(lambda r:f(r,Om,Ol),0,i)[0]
y.append(y1)
return p.asarray(y)
def f(z,Om,Ol):
return 1./p.sqrt((1+z)**2 * (1+Om*z) - z*(2+z)*Ol)
谢谢大家的意见,他们真的很有帮助。