【问题标题】:Python: double integration on an infinite domainPython:无限域上的双重积分
【发布时间】:2013-10-26 08:21:42
【问题描述】:

我正在尝试将我的函数集成到 uxx 上,然后将值存储在矩阵中,以便我可以使用 imshowpcolormesh 绘制它们。集成的界限是0 < u < inf-inf < xx < inf。目前,我只将边界设为 10,直到我弄清楚这一点。

import numpy as np
import pylab as pl
from scipy.integrate import dblquad

b = 50.0

x = np.linspace(-10, 10, 1000)
y = np.linspace(0, 10, 1000)

T = pl.zeros([len(x), len(y)])


for xi in enumerate(x):
    for yi in enumerate(y):
        def f(xi, yi, u, xx):
            return ((np.exp(u * (b - yi)) - np.exp(-u * (b - yi))) /
                    (np.exp(u * b) - np.exp(-u * b)) * np.cos(u * (xx - xi)))


def fint(u, xx):
    return T + dblquad(f, -10, 10, 0.1, 10, args = (u, xx))[0]

这是我目前的代码,但我知道它不能正常工作;不幸的是,我不知道问题是什么。也许我的f 定义中不能有两个for 循环,或者我的fint 是错误的。

【问题讨论】:

  • 是的,在 for 循环中定义是我从未考虑过的事情。您确实意识到,由于您在循环中定义了函数,因此您在不使用它的情况下定义了很多次(这甚至有效吗?)。另外,我没有看到您在示例中调用 fint,您是稍后从外部调用还是根本不调用?
  • @Jblasco 我不想再调用 fint 了。我的集成目标是有一些点矩阵,我可以在指定域上绘制为热图。

标签: python integration numerical-methods


【解决方案1】:

从您的问题中您无法完全清楚您要做什么。但我是这样解释的:你有两个变量uxx的双积分,它也有两个参数xiyi。您希望在xiyj 的许多不同值处评估xxu 的积分,并将这些值存储在T 中。假设这是您想要做的(如果我错了,请纠正我),这就是我的做法。

import numpy as np
from scipy.integrate import dblquad

b = 50.0

x = np.linspace(-10, 10, 1000)
y = np.linspace(0, 10, 1000)

def f(xx, u, xi, yj):
    return ((np.exp(u * (b - yj)) - np.exp(-u * (b - yj))) /
            (np.exp(u * b) - np.exp(-u * b)) * np.cos(u * (xx - xi)))

T = np.zeros([len(x), len(y)])
for i, xi in enumerate(x):
    for j, yj in enumerate(y):
        T[i, j] += dblquad(
            f, -10, 10, lambda x: 0.1, lambda x: 10, args=(xi, yj))[0]

【讨论】:

  • 您正确解释了这个问题。然后我可以设置我的绘图并执行pylab.pcolormesh(x, y, T) 还是必须是pylab.pcolormesh(x, y, T[i, j])
  • 另外,我想整合 u 和 xx 所以我需要将参数更改为正确的?
  • 第一个是正确的:pylab.pcolormesh(x, y, T)。后者只会将T 的一个元素传递给pcolormesh,但你想传递T 的所有元素,所以你只需传递整个T 矩阵。
  • 回答你的第二个问题:不,我现在的方式是,我上面的代码是在 xx 从 -10 到 10 和 u 从 0.1 到 10 进行一百万积分,每个积分在不同的点(xi, yj)。这段代码会花很长时间,所以你可能想从x = np.linspace(-10, 10, 30)开始,y也一样,这样每一个都超过30个xiyj点,然后你只需要做900个积分,但仍然有不错的分辨率。 (注意:dblquad 上的 args 是传递给 f 的额外参数,而不是您要积分的变量。)
【解决方案2】:

fint 是唯一调用 f 的东西。你没有调用 fint,这意味着 f 根本没有被使用,只是定义了大约一百万次。我会考虑只定义一次函数并调用它一百万次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2021-12-10
    • 2017-08-28
    • 2014-07-19
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多