У меня есть следующий набор связанных дифференциальных уравнений. Я хочу получить аналитическое решение с помощью 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.