高斯-拉盖尔积分在处理大限制时如何工作?

3
我想了解高斯-拉盖尔算法在大限制条件下的工作原理。例如,我有一个二维函数,在两个维度上从(0,+inf)变化。当我使用Python中的高斯-拉盖尔算法通过权重和横坐标采样函数并将它们相加时,与使用dblquad得到的结果不接近。以下是用于积分的示例代码。lgw输出权重和横坐标,然后使用两个for循环在双重积分中使用它们。我没有看到如何捕获像x,y = 1e8,1e8这样的样本点。增加n并不会给出高横坐标(至少不需要非常高的值)。
kzas,kzws = lgw(n)
for kta,ktw, in zip(kzas,kzws):
   for kza,kzw in zip(kzas,kzws):
      fval = integrand(kza,kta)
      wghtx = kzw*numpy.exp(kza)
      wghty = ktw*numpy.exp(kta)
      integral += wghtx*wghty*fval

有人能解释一下如何捕捉更高的采样点吗?我的正交有误吗?我可以对小限制范围内的函数进行积分,例如 1e2 左右。如果限制很大,例如 1e15,该怎么办?我知道理论上的定义,但我不知道如何捕捉更高的权重和横坐标。
谢谢。
编辑:无法进一步减少我的函数。积分的不同部分通过数值计算得出,因此我没有任何分析表达式。我只能说函数是平滑的,并具有正弦行为。

当参数趋近于+inf时,您的函数会表现出什么样的行为?我怀疑如果您只对“足够远”的点进行采样,那么您永远无法获得良好的数值近似,并且该函数在“足够远”之外的行为在某种程度上是非平凡的。您能否定义一个半径,在该半径内应用数值方法,并通过解析估计其余部分? - 9000
@9000 这个函数即使对于像1e10这样的值也是非零的,并且只有在5e10之后才会变为零。在此期间,它以正弦方式在0和1之间变化(不总是这样,但我可以说它具有那种变化)。它的函数值并不很高,也没有任何奇点。 - user3840530
1个回答

0

如果我正确地阅读了this,第n个Laguerre多项式的根是有界的,上限为

n + (n-1) sqrt(n)

这意味着你必须使用极高的次数才能从积分中更远的点进行采样。

如果你的被积函数波动不太快,你可以尝试重新调整坐标轴。更具体地说,你可以使用以下公式来调整被积函数的支撑:

\lambda \int_0^\infty f(\lambda x) dx = \int_0^\infty f(x) dx

在你的情况下,你可能需要使用一个相当大的\lambda。

更具体地说,尝试用以下代码替换你最内层循环的第一行:

  fval = lam*lam * integrand(lam*kza, lam*kta)

该方法的主要目的是轻松集成取极限为(0,inf)的函数。如果需要高度限制,则会违背其目的。特别是当内置程序无法提供如此高的程度时。我并不是说它不能被计算。应该有一种方法使其适用于这样的极限,因为人们已经使用该方法很长时间了。 - user3840530
首先,这种类型的不定积分要存在,被积函数必须足够快地衰减。我必须承认,我对高斯-勒让德公式中特定长度尺度的来源没有直觉,但它们就是它们。而且它们似乎与您的被积函数的尺度不匹配。但正如我所说,您可以尝试使用c int_0^infty f(cx) dx = int_0^infty f(x) dx 进行重新缩放。如果您选择足够大的c,您可以将被积函数的支撑带到可管理的范围内。 - Paul Panzer
你在哪里出现溢出?在你的被积函数中吗?为了确保:你必须在第一行中拉伸kza和kta,但不要在第二和第三行中拉伸。 - Paul Panzer
我查看了dblquad和误差估计。我知道它使用自适应积分,通常比从头开始编写代码更好,这就是为什么我喜欢远离设计自定义方法,除非我真的很确定。我还尝试将积分限制分解成部分,然后进行求和,令人惊讶的是,我从分解积分和一次性计算所有内容中得到了相同的结果。唯一改变的是误差,分解积分的误差较小。误差估计可能为1e11(这也很令人困惑)。 - user3840530
感谢您的评论。 - user3840530
显示剩余6条评论

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