Симпи: решение дифференциального уравнения с ошибкой начальных условий - PullRequest
1 голос
/ 20 сентября 2019

Начиная с Sympy версии 1.2 в python Sympy реализована возможность поиска констант в простом дифференциальном уравнении с учетом некоторых начальных условий.Я пытался протестировать эту функцию, но получаю ошибку, которую не знаю, как ее решить.

Документация указывает следующий формат для начальных условий, и я попытался следовать тому, что было указано в фактическом запросе на извлечение, в котором реализована эта функция.Вот код и ошибка.

import sympy as sp

t = sp.symbols('t')
x = sp.Function('x')(t)

diffeq = sp.Eq(x.diff(t,t) - x, sp.cos(t))
res = sp.dsolve(diffeq, t, ics={x(0): 0, 
                            x.diff(t).subs(t, 0): 0})

Ошибка:

Traceback (most recent call last):

  File "<ipython-input-20-75c3e1d53138>", line 1, in <module>
    res = sp.dsolve(diffeq, t, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})

TypeError: 'x' object is not callable

1 Ответ

1 голос
/ 20 сентября 2019

Я не большой пользователь sympy, но у меня все получилось - проблема в том, что когда вы определяете x = sp.Function('x')(t), вы уже получили параметр t и больше не можете передавать 0 для негов строке res = sp.dsolve(diffeq, t, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0}) - вызов x с (t) делает его «определенной функцией».

Таким образом, оставляя x в качестве неопределенной функции и просто передавая ей tв точках, необходимых при создании дифференциального уравнения, есть путь:


import sympy as sp

t = sp.symbols('t')
x = sp.Function('x')

diffeq = sp.Eq(x(t).diff(t, t) - x(t), sp.cos(t)) 
res = sp.dsolve(diffeq, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})

(Кроме того, попытка передать t во втором параметре do dsolve дает еще одну ошибку. Документация скажите, что sympy должен быть в состоянии правильно угадать его, поэтому я пропустил это - только для того, чтобы найти правильный аргумент, будет x(t) позже)

Это дает мне res =

Eq(x(t), exp(t)/4 - cos(t)/2 + exp(-t)/4)
...