【问题标题】:Cannot differentiate wrt a complicated variable in Sympy无法区分 Sympy 中的复杂变量
【发布时间】:2014-08-07 16:54:38
【问题描述】:

(我知道这个标题听起来像是对Sympy Can't differentiate wrt the variable 的重复问题,但我很确定它完全不同。如果我弄错了,我提前道歉)

我正在尝试使用哈密顿力学解决双摆,但 Sympy 在使用其中一种导数时遇到了麻烦。代码如下,不过看iPython Notebook over at nbviewer.ipython.org要容易很多

from __future__ import division
from sympy import *
init_session()
r_1,r_2,l_1,l_2, m_1, m_2, rdot_1, rdot_2,g = symbols("r_1 r_2 l_1 l_2 m_1 m_2 \dot{r_1} \dot{r_2} g")
phi_1, phi_2 = symbols("phi_1 phi_2", cls=Function)
phi_1 = phi_1(t)
phi_2 = phi_2(t)

r_1 = Matrix([l_1 * sin(phi_1), -l_1 * cos(phi_1)])
rdot_1 = r_1.diff(t)
r_2 = Matrix([r_1[0] + l_2 * sin(phi_2), r_1[1] -l_2 * cos(phi_2)])
rdot_2 = r_2.diff(t)

T = (1/2) * m_1 * rdot_1.T * rdot_1 + (1/2) * m_2 * rdot_2.T * rdot_2
T = T[0]

U = -g * ((m_1 * r_1[1]) + (m_2 * r_2[1]))

L = symbols("\mathcal{L}")
L = T - U

H = symbols("\mathcal{H}")
H = T + U

p_1, p_2 = symbols("p_1 p_2")
p_1 = L.diff(phi_1.diff(t))
p_2 = L.diff(phi_2.diff(t))

eq1_1 = p_1.diff(t) + H.diff(phi_1)
eq1_2 = p_2.diff(t) + H.diff(phi_2)
eq2_1 = phi_1.diff(t) - H.diff(p_1)

最后一行产生以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-96-83bfafadd08f> in <module>()
----> 1 eq2_1 = phi_1.diff(t) - H.diff(p_1)
      2 eq2_2 = phi_2.diff(t) - H.diff(p_2)

/Library/Python/2.7/site-packages/sympy/core/expr.pyc in diff(self, *symbols, **assumptions)
   2773         new_symbols = list(map(sympify, symbols))  # e.g. x, 2, y, z
   2774         assumptions.setdefault("evaluate", True)
-> 2775         return Derivative(self, *new_symbols, **assumptions)
   2776 
   2777     ###########################################################################

/Library/Python/2.7/site-packages/sympy/core/function.pyc in __new__(cls, expr, *variables, **assumptions)
   1027                 from sympy.utilities.misc import filldedent
   1028                 raise ValueError(filldedent('''
-> 1029                 Can\'t differentiate wrt the variable: %s, %s''' % (v, count)))
   1030 
   1031             if all_zero and not count == 0:
ValueError: 
Can't differentiate wrt the variable:
1.0*l_1*(l_1*m_1*Derivative(phi_1(t), t) +
l_1*m_2*Derivative(phi_1(t), t) + l_2*m_2*cos(phi_1(t) -
phi_2(t))*Derivative(phi_2(t), t)), 1

表达式是否太复杂?还是我误解了如何使用 diff()?

【问题讨论】:

  • 这出现在一个相当不相关的 Google 搜索中,但请记住,Sympy 的行为在 1.2 中发生了变化,如果您在第三方库,尝试Sympy 1.0 instead 之类的东西可能是个好主意。

标签: python physics sympy


【解决方案1】:

您是否可能无意中覆盖了 p_1?

p_1, p_2 = symbols("p_1 p_2")
p_1 = L.diff(phi_1.diff(t))

您创建了一个符号,但随后通过创建一个具有相同名称的 Python 变量将其销毁,因此当您尝试区分 p_1 时,您(正如 Aaron 指出的)区分的是表达式,而不是您创建的符号。

【讨论】:

    【解决方案2】:

    本质上是同样的问题。 diff 的第二个参数(或作为方法调用的唯一参数)应该是单个符号,而不是表达式。在这种情况下,您的微分“变量”是一个完整的表达式,在数学上甚至没有意义。

    【讨论】:

    • 当我区分 L wrt phi_1.diff(t) 时,这不是也区分函数 wrt 表达式吗?如果我仍然错了,如何执行汉密尔顿方程中表达的操作?顺便说一句,非常感谢您的帮助。
    • 允许对单个函数或单个导数进行微分,因为这是有道理的(您只需在任何地方用一个虚拟符号替换该函数或导数并对此进行微分)。见docs.sympy.org/latest/modules/…
    • 啊。这是有道理的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多