【问题标题】:Getting the derivatives of Legendre polynomials in Python在 Python 中获取勒让德多项式的导数
【发布时间】:2017-02-10 06:52:44
【问题描述】:

我有一个引力势的表达式(来自here 的方程 15),为了计算轨道,我需要评估作为局部梯度的引力,对我来说这意味着评估 @ 的导数987654322@P2、P4、P6在单个值上万次。

我可以使用this question 中的表达式来计算它,但我想知道是否有一种方法可以向 python 询问导数,而不会明确涉及我将导数评估为有限差分。

我在 SciPy 中找不到任何可以自动执行此操作的内容。在numpy.polynomial.legendre.Legendre 中有一个deriv() 方法,但我没有使用多项式类的经验。

评估低阶勒让德多项式的一阶导数的最快方法是什么,一次一个值适合数值积分?

【问题讨论】:

  • 你可以试试 sympy 模块,如果我没记错的话,它是 SciPy 的一部分。它允许您进行非常简单的微分和积分等操作,但您需要首先处理这个无限和,也许 SymPy 可以处理它,并且它非常擅长评估限制和类似的东西。
  • @ForceBru 谢谢我认为sympy 不适合这里的工作。我可以自己做象征性的部分 - 答案就在链接的问题中。我需要的是快速的数值评估,而sympy 不会这样做。

标签: python numpy scipy numerical-methods


【解决方案1】:

我知道这是一个老问题,但仍然没有关于如何使用 numpy/scipy 计算导数的答案。

这仅适用于 numpy 和 scipy:

from scipy.special import legendre
import numpy as np
n = 2               # degree of Legendre polynomial
poly = legendre(n)  # coefficients of n^th degree Legendre polynomial 
polyd= poly.deriv() # coefficients of derivative of n^th degree Legendre Polynomial
x = np.linspace(0,1,10000)  # arbitrary coordinates
evald = np.polyval(polyd,x) # evaluate derivative at desired coordinates(s)

上面接受的答案也包含一个小错误(我无法发表评论,但也许有人可以编辑答案): 导数应为P2' = 3*x

【讨论】:

  • +1 再投一票,您就可以发表评论了 :-) 感谢您的回答!是的,这是一个老问题,但我仍然不时 struggle with the algebra 以及 Python,我只是再次研究这个一般性话题真是巧合!
  • 仅供参考,在早期的某个时候,您将能够编辑其他人的帖子以进行更正,并且编辑将进入审核队列。只要它们是适当的,它们通常会被帖子作者或其他审阅编辑的人接受。有时可能需要一天左右的时间。
【解决方案2】:

如果您只需要P2P4P6 的导数,那很容易手动计算然后写成代码...例如

P2 = .5 * (3 * x^2 - 1)

因此:

P2' = .75 * x

你可以在 python 中这样写:

def P2_deriv(x):
    return .75 * x

事情并没有比这快得多;-)。如果你需要任意的 Legendre 多项式,那么……事情开始变得有点棘手……

【讨论】:

  • 好的,因为我已经提到我只需要几个低阶多项式,你是对的。我可以停止将它们视为需要特殊方法的奇异物体,只需将铅笔放在纸上即可。谢谢你把我带回地球——花太多时间“在土星周围的轨道上”会腐蚀大脑! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多