Решение системы связанных дифференциальных уравнений с помощью sympy - PullRequest
1 голос
/ 28 мая 2020

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

from sympy import *
import numpy as np

init_printing(use_unicode=True)
x, y, z, t, w,  V=symbols('x y z t omega V')
c1=Function('c1')
c2=Function('c2')
hq=symbols('hbar',positive=True)

g1=Eq(c2(t)*hq*V*exp(-I*w*t),I*hq*Derivative(c1(t),t))
g2=Eq(c1(t)*hq*V*exp(+I*w*t),I*hq*Derivative(c2(t),t))

eq=(g1,g2)

dsolve(eq,hint='all',ics={c1(0):1,c2(0):0})

Когда я пытаюсь решить систему уравнений, я получаю сообщение об ошибке:

ValueError: функция не может быть автоматически обнаружена для nan.

К сожалению, я не могу вижу мою ошибку.

Edit:

classify_ode(g1) возвращает следующие подсказки:

('factorable', 'nth_algebraic', 'separable', '1st_exact', '1st_linear', 'Bernoulli', '1st_power_series', 'lie_group', 'nth_linear_constant_coeff_variation_of_parameters', 'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters', 'nth_algebraic_Integral', 'separable_Integral', '1st_exact_Integral', '1st_linear_Integral', 'Bernoulli_Integral', 'nth_linear_constant_coeff_variation_of_parameters_Integral', 'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters_Integral')

Каждый из них вызывает ошибку, упомянутую выше.

Вручную эту систему можно решить, применив преобразование Лапласа к c1 и c2. Это превращает систему ОДУ в систему чисто алгебраических c уравнений, которую можно решить, переставив и устранив связь между уравнениями. Результатом является преобразование решения, поэтому необходимо выполнить обратное преобразование с использованием обратного преобразования Лапласа.

Edit 2:

classify_sysode(eq) возвращает следующее:

{'no_of_equation': 2,
 'eq': [-c1(t)*exp(-I*omega*t) + I*Derivative(c2(t), t),
  -c2(t)*exp(I*omega*t) + I*Derivative(c1(t), t)],
 'func': [c2(t), c1(t)],
 'order': {c1(t): 1, c2(t): 1},
 'func_coeff': {(0, c2(t), 0): 0,
  (0, c2(t), 1): I,
  (0, c1(t), 0): -exp(-I*omega*t),
  (0, c1(t), 1): 0,
  (1, c2(t), 0): -exp(I*omega*t),
  (1, c2(t), 1): 0,
  (1, c1(t), 0): 0,
  (1, c1(t), 1): I},
 'is_linear': True,
 'type_of_equation': 'type6'}

Это означает, что будет использоваться решающая программа Линейная, 2 уравнения, Порядок 1, Тип 6 , для системы вида:

x '= f (t) x + g (t) y
y' = a [f (t) + ah (t)] x + a [g (t) - h (t)] y

Но наша система больше похожа на Тип 7 , то есть имеет вид:

x '= f (t) x + g (t) y
y '= h (t) x + p (t) y

, где f (t) и p (t) равны нулю. Предлагаемый метод решения для типа 7, упомянутый в документации, также похож на то, что Lutz Lehmann упоминает в своем комментарии.

Для полноты это ошибка, которая, похоже, возникает из-за возникшего исключения по _preprocess:

Traceback (most recent call last):
  File "problem_ode.py", line 21, in <module>
    dsolve(eq,hint='all',ics={c1(0):1,c2(0):0})
  File "/home/quoniam/anaconda3/envs/data/lib/python3.8/site-packages/sympy/solvers/ode.py", line 634, in dsolve
    sols = solvefunc(match)
  File "/home/quoniam/anaconda3/envs/data/lib/python3.8/site-packages/sympy/solvers/ode.py", line 7405, in sysode_linear_2eq_order1
    sol = _linear_2eq_order1_type6(x, y, t, r, eq)
  File "/home/quoniam/anaconda3/envs/data/lib/python3.8/site-packages/sympy/solvers/ode.py", line 7731, in _linear_2eq_order1_type6
    hint1 = classify_ode(equ)[1]
  File "/home/quoniam/anaconda3/envs/data/lib/python3.8/site-packages/sympy/solvers/ode.py", line 976, in classify_ode
    eq, func_ = _preprocess(eq, func)
  File "/home/quoniam/anaconda3/envs/data/lib/python3.8/site-packages/sympy/solvers/deutils.py", line 84, in _preprocess
    raise ValueError('The function cannot be '
ValueError: The function cannot be automatically detected for nan.
...