时间:2011-08-23 12:19:42

标签: python integration scipy equation

我正在尝试使用Python解决这个积分方程:

enter image description here

其中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解决积分方程?

4 个答案:

答案 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)

谢谢大家的意见,他们真的很有帮助。