【问题标题】:Integral with variable limits in python与python中的可变限制积分
【发布时间】:2020-08-23 18:22:59
【问题描述】:

我正在尝试计算以下积分

使用 scipy,使用以下程序:

def E(z):
    result = 1/np.sqrt(Om*(1 + z)**3 + Ode + Ox*(1 + z)**2)
    return result 

def r(z, E): 
    result, error  = quad(E, 0, z) # integrate E(z) from 0 to z
    return result

z 是自变量,而 Om Ode 和 Ox 是简单的常量(之前已分配)。 然后当我尝试调用该函数时:

z = np.linspace(1e-3, 4, 300)
plt.plot(z, r(z))

我得到了错误

flip, a, b = b < a, min(a, b), max(a, b)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() 
or a.all()

有什么问题? scipy.quad 是否无法集成到变量? 非常感谢您的帮助

【问题讨论】:

  • 您能否为您的客户提供样本值?
  • 您将numpy 数组提供给scipy.integrate.quad,但它只接受float
  • Om = 0.32 Ode = 0.68 Ox = 0
  • 没错!那么我怎样才能将一个浮点数传递给 quad,但仍然获得一个函数而不仅仅是一个数字呢?
  • 你可以这样做vals = [r(zi,E) for zi in z](虽然不确定这是否是最有效的方式)

标签: python variables scipy integral quad


【解决方案1】:

您可以结合使用 Python 的 map(function, iterable, ...) 函数,

返回一个迭代器,它将函数应用于可迭代的每个项目,并产生结果。

functoolspartial(func[,*args][, **keywords])方法:

返回一个新的部分对象,当调用它时,它的行为类似于使用位置参数 args 和关键字参数关键字调用的 func。

import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
from functools import partial


def E(z):
    Om = 0.32
    Ode = 0.68
    Ox = 0
    result = 1/np.sqrt(Om*(1 + z)**3 + Ode + Ox*(1 + z)**2)

    return result


def r(z):
    result = np.array(
        list(map(partial(quad, E, 0), z))
    )[:, 0]  # integrate E(z) from 0 to z

    return result


z = np.linspace(1e-3, 4, 300)
fig, ax = plt.subplots()
ax.plot(z, r(z))
fig.show()

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2012-11-27
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多