Lambidfy с dynamicymbol дает неверный синтаксис - PullRequest
0 голосов
/ 26 сентября 2019

Найдя уравнение движения, я хочу определить его так, чтобы я мог легко найти ускорение, учитывая текущее состояние (положение, скорость) и приложенную силу.

В процессе получения уравненияmotion, dynamicsymbols используется для представления функций времени (положения) и его производных (скорость, ускорение).

Код похож на следующий

from sympy.physics.vector import dynamicsymbols
from sympy.utilities.lambdify import lambdify
from sympy import Symbol, diff

t = Symbol('t')
theta1 = dynamicsymbols('theta1')
theta1_d = diff(theta1, t)
# theta1 = Symbol('theta1') # Uncommenting this works
# theta1_d = Symbol('theta1_d') # Uncommenting this works

tau1 = Symbol('tau1')

theta1_dd_eom = theta1 + theta1_d + tau1

calc_theta1_dd = lambdify([theta1, theta1_d, tau1], 
        theta1_dd_eom)

Однако, это бросаетследующая ошибка

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    theta1_dd_eom)
  File "/usr/lib/python3/dist-packages/sympy/utilities/lambdify.py", line 434, in lambdify
    func = eval(lstr, namespace)
  File "<string>", line 1
    lambda _Dummy_140,Derivative(theta1(t), t),_Dummy_141: (Derivative(_Dummy_140, t) + _Dummy_140 + _Dummy_141)
                                ^
SyntaxError: invalid syntax

Я использую sympy 1.1.1

1 Ответ

0 голосов
/ 26 сентября 2019

Как видно, выражения, содержащие dynamicsymbols, не могут быть напрямую определены.Все dynamicsymbols должны быть сначала заменены обычными символами

from sympy.physics.vector import dynamicsymbols
from sympy.utilities.lambdify import lambdify, implemented_function
from sympy import Symbol, diff, Derivative
import pdb

t = Symbol('t')
theta1 = dynamicsymbols('theta1')
theta1_d = diff(theta1, t)
theta1_0 = Symbol('theta1_0')
theta1_d_0 = Symbol('theta1_d_0')

# ORDER IS IMPORTANT!
# We want to substitute theta1_d before theta1 because Derivative(theta1, t) != Derivative(theta1_0, t)
# Substitution will fail if we substituted theta1 first
substitutions = [
        (theta1_d, theta1_d_0),
        (theta1, theta1_0)]

tau1 = Symbol('tau1')

theta1_dd_eom = theta1 + theta1_d + tau1
theta1_dd_eom_0 = theta1_dd_eom.subs(substitutions)

calc_theta1_dd = lambdify([theta1_0, theta1_d_0, tau1], theta1_dd_eom_0)
print(calc_theta1_dd(1.0, 2.0, 3.0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...