使用Scipy进行单变量多重积分

3

我有一个加速度函数a(t),知道对t进行两次积分,可以得到位置函数x(t)。我试图找到t=10秒时的位置。

由于a(t)不是多元函数,我在使用Scipy dblquad函数计算所需的二重积分时遇到了麻烦。请看我目前的代码:

  def a(t):
      return (2.5 / (1 + math.exp((t-8)/0.8)))

  def upperbound():
       return 10

  def lowerbound():
      return 0

  x = dblquad(a,0,10,lowerbound,upperbound)

据我所知,这种方法不起作用,因为dblquad需要一个多变量的a(t)。有人能帮忙吗?


什么是 dblquad?你能更广泛地解释一下吗? - Hari_pb
请在此处查找文档:https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.integrate.dblquad.html - Will C
请解释一下你的函数是“至少有两个变量的Python函数或方法”的意思: - hpaulj
1个回答

4
你可以使用scipy的单变量积分两次来实现这个。
import math
from scipy.integrate import quad

def a(t):
    return (2.5 / (1 + math.exp((t-8)/0.8)))

lb, ub = 0, 10

integral = quad(lambda t: quad(a, 0, t)[0], lb, ub)[0]
print(integral)
# 86.28470375472537

这是必要的,因为您想要实现的不是将两个变量的函数整合在一起,而是将一个变量的函数整合两次。在上面的积分语句中,内部的 quad 函数将函数积分一次,但保持积分作为 t 的函数。外部的 quad 函数将函数第二次积分到定义的限制范围内。
请注意,需要从 quad 函数的输出中获取第一个参数,因为它输出一个元组。第二个参数是数值积分误差的上限。

嗨,Chris。我知道这个问题已经有几年了,但我正在尝试对一个单变量函数执行双重积分,然后绘制该函数和双重积分函数。您能否解释一下为什么在上面的integral = ...行中使用方括号以及为什么要将a(t)函数定义为lambda? - user2882635
方括号是因为答案的最后一句话。quad返回一个元组,你只需要第一个元素。lambda用于创建一个变量(t)的函数,该函数返回从0到t的函数a的积分,这可以再次通过quad进行积分。t中的函数表示a的不定积分。a函数也可以是普通函数。与lambda没有区别。 - hidde-jan
@user2882635 重申之前的评论。使用 lambda 只是定义函数的一种快捷方式。它也可以单独写成 def first_integral(t); return quad(a, 0, t)[0]。在每次调用 quad 后加上 [0] 是因为 quad 返回了很多关于积分的额外信息,这在这种情况下是不需要的。第一个返回参数是积分的值,也是唯一需要的。 - Chris Mueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接