ai-content-maker/.venv/Lib/site-packages/sympy/solvers/ode/tests/test_systems.py

2561 lines
126 KiB
Python

from sympy.core.function import (Derivative, Function, diff)
from sympy.core.mul import Mul
from sympy.core.numbers import (I, Rational, pi)
from sympy.core.relational import Eq
from sympy.core.singleton import S
from sympy.core.symbol import (Symbol, symbols)
from sympy.functions.elementary.hyperbolic import sinh
from sympy.functions.elementary.miscellaneous import sqrt
from sympy.matrices.dense import Matrix
from sympy.core.containers import Tuple
from sympy.functions import exp, cos, sin, log, Ci, Si, erf, erfi
from sympy.matrices import dotprodsimp, NonSquareMatrixError
from sympy.solvers.ode import dsolve
from sympy.solvers.ode.ode import constant_renumber
from sympy.solvers.ode.subscheck import checksysodesol
from sympy.solvers.ode.systems import (_classify_linear_system, linear_ode_to_matrix,
ODEOrderError, ODENonlinearError, _simpsol,
_is_commutative_anti_derivative, linodesolve,
canonical_odes, dsolve_system, _component_division,
_eqs2dict, _dict2graph)
from sympy.functions import airyai, airybi
from sympy.integrals.integrals import Integral
from sympy.simplify.ratsimp import ratsimp
from sympy.testing.pytest import ON_CI, raises, slow, skip, XFAIL
C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10 = symbols('C0:11')
x = symbols('x')
f = Function('f')
g = Function('g')
h = Function('h')
def test_linear_ode_to_matrix():
f, g, h = symbols("f, g, h", cls=Function)
t = Symbol("t")
funcs = [f(t), g(t), h(t)]
f1 = f(t).diff(t)
g1 = g(t).diff(t)
h1 = h(t).diff(t)
f2 = f(t).diff(t, 2)
g2 = g(t).diff(t, 2)
h2 = h(t).diff(t, 2)
eqs_1 = [Eq(f1, g(t)), Eq(g1, f(t))]
sol_1 = ([Matrix([[1, 0], [0, 1]]), Matrix([[ 0, 1], [1, 0]])], Matrix([[0],[0]]))
assert linear_ode_to_matrix(eqs_1, funcs[:-1], t, 1) == sol_1
eqs_2 = [Eq(f1, f(t) + 2*g(t)), Eq(g1, h(t)), Eq(h1, g(t) + h(t) + f(t))]
sol_2 = ([Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), Matrix([[1, 2, 0], [ 0, 0, 1], [1, 1, 1]])],
Matrix([[0], [0], [0]]))
assert linear_ode_to_matrix(eqs_2, funcs, t, 1) == sol_2
eqs_3 = [Eq(2*f1 + 3*h1, f(t) + g(t)), Eq(4*h1 + 5*g1, f(t) + h(t)), Eq(5*f1 + 4*g1, g(t) + h(t))]
sol_3 = ([Matrix([[2, 0, 3], [0, 5, 4], [5, 4, 0]]), Matrix([[1, 1, 0], [1, 0, 1], [0, 1, 1]])],
Matrix([[0], [0], [0]]))
assert linear_ode_to_matrix(eqs_3, funcs, t, 1) == sol_3
eqs_4 = [Eq(f2 + h(t), f1 + g(t)), Eq(2*h2 + g2 + g1 + g(t), 0), Eq(3*h1, 4)]
sol_4 = ([Matrix([[1, 0, 0], [0, 1, 2], [0, 0, 0]]), Matrix([[1, 0, 0], [0, -1, 0], [0, 0, -3]]),
Matrix([[0, 1, -1], [0, -1, 0], [0, 0, 0]])], Matrix([[0], [0], [4]]))
assert linear_ode_to_matrix(eqs_4, funcs, t, 2) == sol_4
eqs_5 = [Eq(f2, g(t)), Eq(f1 + g1, f(t))]
raises(ODEOrderError, lambda: linear_ode_to_matrix(eqs_5, funcs[:-1], t, 1))
eqs_6 = [Eq(f1, f(t)**2), Eq(g1, f(t) + g(t))]
raises(ODENonlinearError, lambda: linear_ode_to_matrix(eqs_6, funcs[:-1], t, 1))
def test__classify_linear_system():
x, y, z, w = symbols('x, y, z, w', cls=Function)
t, k, l = symbols('t k l')
x1 = diff(x(t), t)
y1 = diff(y(t), t)
z1 = diff(z(t), t)
w1 = diff(w(t), t)
x2 = diff(x(t), t, t)
y2 = diff(y(t), t, t)
funcs = [x(t), y(t)]
funcs_2 = funcs + [z(t), w(t)]
eqs_1 = (5 * x1 + 12 * x(t) - 6 * (y(t)), (2 * y1 - 11 * t * x(t) + 3 * y(t) + t))
assert _classify_linear_system(eqs_1, funcs, t) is None
eqs_2 = (5 * (x1**2) + 12 * x(t) - 6 * (y(t)), (2 * y1 - 11 * t * x(t) + 3 * y(t) + t))
sol2 = {'is_implicit': True,
'canon_eqs': [[Eq(Derivative(x(t), t), -sqrt(-12*x(t)/5 + 6*y(t)/5)),
Eq(Derivative(y(t), t), 11*t*x(t)/2 - t/2 - 3*y(t)/2)],
[Eq(Derivative(x(t), t), sqrt(-12*x(t)/5 + 6*y(t)/5)),
Eq(Derivative(y(t), t), 11*t*x(t)/2 - t/2 - 3*y(t)/2)]]}
assert _classify_linear_system(eqs_2, funcs, t) == sol2
eqs_2_1 = [Eq(Derivative(x(t), t), -sqrt(-12*x(t)/5 + 6*y(t)/5)),
Eq(Derivative(y(t), t), 11*t*x(t)/2 - t/2 - 3*y(t)/2)]
assert _classify_linear_system(eqs_2_1, funcs, t) is None
eqs_2_2 = [Eq(Derivative(x(t), t), sqrt(-12*x(t)/5 + 6*y(t)/5)),
Eq(Derivative(y(t), t), 11*t*x(t)/2 - t/2 - 3*y(t)/2)]
assert _classify_linear_system(eqs_2_2, funcs, t) is None
eqs_3 = (5 * x1 + 12 * x(t) - 6 * (y(t)), (2 * y1 - 11 * x(t) + 3 * y(t)), (5 * w1 + z(t)), (z1 + w(t)))
answer_3 = {'no_of_equation': 4,
'eq': (12*x(t) - 6*y(t) + 5*Derivative(x(t), t),
-11*x(t) + 3*y(t) + 2*Derivative(y(t), t),
z(t) + 5*Derivative(w(t), t),
w(t) + Derivative(z(t), t)),
'func': [x(t), y(t), z(t), w(t)],
'order': {x(t): 1, y(t): 1, z(t): 1, w(t): 1},
'is_linear': True,
'is_constant': True,
'is_homogeneous': True,
'func_coeff': -Matrix([
[Rational(12, 5), Rational(-6, 5), 0, 0],
[Rational(-11, 2), Rational(3, 2), 0, 0],
[0, 0, 0, 1],
[0, 0, Rational(1, 5), 0]]),
'type_of_equation': 'type1',
'is_general': True}
assert _classify_linear_system(eqs_3, funcs_2, t) == answer_3
eqs_4 = (5 * x1 + 12 * x(t) - 6 * (y(t)), (2 * y1 - 11 * x(t) + 3 * y(t)), (z1 - w(t)), (w1 - z(t)))
answer_4 = {'no_of_equation': 4,
'eq': (12 * x(t) - 6 * y(t) + 5 * Derivative(x(t), t),
-11 * x(t) + 3 * y(t) + 2 * Derivative(y(t), t),
-w(t) + Derivative(z(t), t),
-z(t) + Derivative(w(t), t)),
'func': [x(t), y(t), z(t), w(t)],
'order': {x(t): 1, y(t): 1, z(t): 1, w(t): 1},
'is_linear': True,
'is_constant': True,
'is_homogeneous': True,
'func_coeff': -Matrix([
[Rational(12, 5), Rational(-6, 5), 0, 0],
[Rational(-11, 2), Rational(3, 2), 0, 0],
[0, 0, 0, -1],
[0, 0, -1, 0]]),
'type_of_equation': 'type1',
'is_general': True}
assert _classify_linear_system(eqs_4, funcs_2, t) == answer_4
eqs_5 = (5*x1 + 12*x(t) - 6*(y(t)) + x2, (2*y1 - 11*x(t) + 3*y(t)), (z1 - w(t)), (w1 - z(t)))
answer_5 = {'no_of_equation': 4, 'eq': (12*x(t) - 6*y(t) + 5*Derivative(x(t), t) + Derivative(x(t), (t, 2)),
-11*x(t) + 3*y(t) + 2*Derivative(y(t), t), -w(t) + Derivative(z(t), t), -z(t) + Derivative(w(t),
t)), 'func': [x(t), y(t), z(t), w(t)], 'order': {x(t): 2, y(t): 1, z(t): 1, w(t): 1}, 'is_linear':
True, 'is_homogeneous': True, 'is_general': True, 'type_of_equation': 'type0', 'is_higher_order': True}
assert _classify_linear_system(eqs_5, funcs_2, t) == answer_5
eqs_6 = (Eq(x1, 3*y(t) - 11*z(t)), Eq(y1, 7*z(t) - 3*x(t)), Eq(z1, 11*x(t) - 7*y(t)))
answer_6 = {'no_of_equation': 3, 'eq': (Eq(Derivative(x(t), t), 3*y(t) - 11*z(t)), Eq(Derivative(y(t), t), -3*x(t) + 7*z(t)),
Eq(Derivative(z(t), t), 11*x(t) - 7*y(t))), 'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1},
'is_linear': True, 'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[ 0, -3, 11],
[ 3, 0, -7],
[-11, 7, 0]]),
'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eqs_6, funcs_2[:-1], t) == answer_6
eqs_7 = (Eq(x1, y(t)), Eq(y1, x(t)))
answer_7 = {'no_of_equation': 2, 'eq': (Eq(Derivative(x(t), t), y(t)), Eq(Derivative(y(t), t), x(t))),
'func': [x(t), y(t)], 'order': {x(t): 1, y(t): 1}, 'is_linear': True, 'is_constant': True,
'is_homogeneous': True, 'func_coeff': -Matrix([
[ 0, -1],
[-1, 0]]),
'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eqs_7, funcs, t) == answer_7
eqs_8 = (Eq(x1, 21*x(t)), Eq(y1, 17*x(t) + 3*y(t)), Eq(z1, 5*x(t) + 7*y(t) + 9*z(t)))
answer_8 = {'no_of_equation': 3, 'eq': (Eq(Derivative(x(t), t), 21*x(t)), Eq(Derivative(y(t), t), 17*x(t) + 3*y(t)),
Eq(Derivative(z(t), t), 5*x(t) + 7*y(t) + 9*z(t))), 'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1},
'is_linear': True, 'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[-21, 0, 0],
[-17, -3, 0],
[ -5, -7, -9]]),
'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eqs_8, funcs_2[:-1], t) == answer_8
eqs_9 = (Eq(x1, 4*x(t) + 5*y(t) + 2*z(t)), Eq(y1, x(t) + 13*y(t) + 9*z(t)), Eq(z1, 32*x(t) + 41*y(t) + 11*z(t)))
answer_9 = {'no_of_equation': 3, 'eq': (Eq(Derivative(x(t), t), 4*x(t) + 5*y(t) + 2*z(t)),
Eq(Derivative(y(t), t), x(t) + 13*y(t) + 9*z(t)), Eq(Derivative(z(t), t), 32*x(t) + 41*y(t) + 11*z(t))),
'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True,
'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[ -4, -5, -2],
[ -1, -13, -9],
[-32, -41, -11]]),
'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eqs_9, funcs_2[:-1], t) == answer_9
eqs_10 = (Eq(3*x1, 4*5*(y(t) - z(t))), Eq(4*y1, 3*5*(z(t) - x(t))), Eq(5*z1, 3*4*(x(t) - y(t))))
answer_10 = {'no_of_equation': 3, 'eq': (Eq(3*Derivative(x(t), t), 20*y(t) - 20*z(t)),
Eq(4*Derivative(y(t), t), -15*x(t) + 15*z(t)), Eq(5*Derivative(z(t), t), 12*x(t) - 12*y(t))),
'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True,
'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[ 0, Rational(-20, 3), Rational(20, 3)],
[Rational(15, 4), 0, Rational(-15, 4)],
[Rational(-12, 5), Rational(12, 5), 0]]),
'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eqs_10, funcs_2[:-1], t) == answer_10
eq11 = (Eq(x1, 3*y(t) - 11*z(t)), Eq(y1, 7*z(t) - 3*x(t)), Eq(z1, 11*x(t) - 7*y(t)))
sol11 = {'no_of_equation': 3, 'eq': (Eq(Derivative(x(t), t), 3*y(t) - 11*z(t)), Eq(Derivative(y(t), t), -3*x(t) + 7*z(t)),
Eq(Derivative(z(t), t), 11*x(t) - 7*y(t))), 'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1},
'is_linear': True, 'is_constant': True, 'is_homogeneous': True, 'func_coeff': -Matrix([
[ 0, -3, 11], [ 3, 0, -7], [-11, 7, 0]]), 'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eq11, funcs_2[:-1], t) == sol11
eq12 = (Eq(Derivative(x(t), t), y(t)), Eq(Derivative(y(t), t), x(t)))
sol12 = {'no_of_equation': 2, 'eq': (Eq(Derivative(x(t), t), y(t)), Eq(Derivative(y(t), t), x(t))),
'func': [x(t), y(t)], 'order': {x(t): 1, y(t): 1}, 'is_linear': True, 'is_constant': True,
'is_homogeneous': True, 'func_coeff': -Matrix([
[0, -1],
[-1, 0]]), 'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eq12, [x(t), y(t)], t) == sol12
eq13 = (Eq(Derivative(x(t), t), 21*x(t)), Eq(Derivative(y(t), t), 17*x(t) + 3*y(t)),
Eq(Derivative(z(t), t), 5*x(t) + 7*y(t) + 9*z(t)))
sol13 = {'no_of_equation': 3, 'eq': (
Eq(Derivative(x(t), t), 21 * x(t)), Eq(Derivative(y(t), t), 17 * x(t) + 3 * y(t)),
Eq(Derivative(z(t), t), 5 * x(t) + 7 * y(t) + 9 * z(t))), 'func': [x(t), y(t), z(t)],
'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True, 'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[-21, 0, 0],
[-17, -3, 0],
[-5, -7, -9]]), 'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eq13, [x(t), y(t), z(t)], t) == sol13
eq14 = (
Eq(Derivative(x(t), t), 4*x(t) + 5*y(t) + 2*z(t)), Eq(Derivative(y(t), t), x(t) + 13*y(t) + 9*z(t)),
Eq(Derivative(z(t), t), 32*x(t) + 41*y(t) + 11*z(t)))
sol14 = {'no_of_equation': 3, 'eq': (
Eq(Derivative(x(t), t), 4 * x(t) + 5 * y(t) + 2 * z(t)), Eq(Derivative(y(t), t), x(t) + 13 * y(t) + 9 * z(t)),
Eq(Derivative(z(t), t), 32 * x(t) + 41 * y(t) + 11 * z(t))), 'func': [x(t), y(t), z(t)],
'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True, 'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[-4, -5, -2],
[-1, -13, -9],
[-32, -41, -11]]), 'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eq14, [x(t), y(t), z(t)], t) == sol14
eq15 = (Eq(3*Derivative(x(t), t), 20*y(t) - 20*z(t)), Eq(4*Derivative(y(t), t), -15*x(t) + 15*z(t)),
Eq(5*Derivative(z(t), t), 12*x(t) - 12*y(t)))
sol15 = {'no_of_equation': 3, 'eq': (
Eq(3 * Derivative(x(t), t), 20 * y(t) - 20 * z(t)), Eq(4 * Derivative(y(t), t), -15 * x(t) + 15 * z(t)),
Eq(5 * Derivative(z(t), t), 12 * x(t) - 12 * y(t))), 'func': [x(t), y(t), z(t)],
'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True, 'is_constant': True, 'is_homogeneous': True,
'func_coeff': -Matrix([
[0, Rational(-20, 3), Rational(20, 3)],
[Rational(15, 4), 0, Rational(-15, 4)],
[Rational(-12, 5), Rational(12, 5), 0]]), 'type_of_equation': 'type1', 'is_general': True}
assert _classify_linear_system(eq15, [x(t), y(t), z(t)], t) == sol15
# Constant coefficient homogeneous ODEs
eq1 = (Eq(diff(x(t), t), x(t) + y(t) + 9), Eq(diff(y(t), t), 2*x(t) + 5*y(t) + 23))
sol1 = {'no_of_equation': 2, 'eq': (Eq(Derivative(x(t), t), x(t) + y(t) + 9),
Eq(Derivative(y(t), t), 2*x(t) + 5*y(t) + 23)), 'func': [x(t), y(t)],
'order': {x(t): 1, y(t): 1}, 'is_linear': True, 'is_constant': True, 'is_homogeneous': False, 'is_general': True,
'func_coeff': -Matrix([[-1, -1], [-2, -5]]), 'rhs': Matrix([[ 9], [23]]), 'type_of_equation': 'type2'}
assert _classify_linear_system(eq1, funcs, t) == sol1
# Non constant coefficient homogeneous ODEs
eq1 = (Eq(diff(x(t), t), 5*t*x(t) + 2*y(t)), Eq(diff(y(t), t), 2*x(t) + 5*t*y(t)))
sol1 = {'no_of_equation': 2, 'eq': (Eq(Derivative(x(t), t), 5*t*x(t) + 2*y(t)), Eq(Derivative(y(t), t), 5*t*y(t) + 2*x(t))),
'func': [x(t), y(t)], 'order': {x(t): 1, y(t): 1}, 'is_linear': True, 'is_constant': False,
'is_homogeneous': True, 'func_coeff': -Matrix([ [-5*t, -2], [ -2, -5*t]]), 'commutative_antiderivative': Matrix([
[5*t**2/2, 2*t], [ 2*t, 5*t**2/2]]), 'type_of_equation': 'type3', 'is_general': True}
assert _classify_linear_system(eq1, funcs, t) == sol1
# Non constant coefficient non-homogeneous ODEs
eq1 = [Eq(x1, x(t) + t*y(t) + t), Eq(y1, t*x(t) + y(t))]
sol1 = {'no_of_equation': 2, 'eq': [Eq(Derivative(x(t), t), t*y(t) + t + x(t)), Eq(Derivative(y(t), t),
t*x(t) + y(t))], 'func': [x(t), y(t)], 'order': {x(t): 1, y(t): 1}, 'is_linear': True,
'is_constant': False, 'is_homogeneous': False, 'is_general': True, 'func_coeff': -Matrix([ [-1, -t],
[-t, -1]]), 'commutative_antiderivative': Matrix([ [ t, t**2/2], [t**2/2, t]]), 'rhs':
Matrix([ [t], [0]]), 'type_of_equation': 'type4'}
assert _classify_linear_system(eq1, funcs, t) == sol1
eq2 = [Eq(x1, t*x(t) + t*y(t) + t), Eq(y1, t*x(t) + t*y(t) + cos(t))]
sol2 = {'no_of_equation': 2, 'eq': [Eq(Derivative(x(t), t), t*x(t) + t*y(t) + t), Eq(Derivative(y(t), t),
t*x(t) + t*y(t) + cos(t))], 'func': [x(t), y(t)], 'order': {x(t): 1, y(t): 1}, 'is_linear': True,
'is_homogeneous': False, 'is_general': True, 'rhs': Matrix([ [ t], [cos(t)]]), 'func_coeff':
Matrix([ [t, t], [t, t]]), 'is_constant': False, 'type_of_equation': 'type4',
'commutative_antiderivative': Matrix([ [t**2/2, t**2/2], [t**2/2, t**2/2]])}
assert _classify_linear_system(eq2, funcs, t) == sol2
eq3 = [Eq(x1, t*(x(t) + y(t) + z(t) + 1)), Eq(y1, t*(x(t) + y(t) + z(t))), Eq(z1, t*(x(t) + y(t) + z(t)))]
sol3 = {'no_of_equation': 3, 'eq': [Eq(Derivative(x(t), t), t*(x(t) + y(t) + z(t) + 1)),
Eq(Derivative(y(t), t), t*(x(t) + y(t) + z(t))), Eq(Derivative(z(t), t), t*(x(t) + y(t) + z(t)))],
'func': [x(t), y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True, 'is_constant':
False, 'is_homogeneous': False, 'is_general': True, 'func_coeff': -Matrix([ [-t, -t, -t], [-t, -t,
-t], [-t, -t, -t]]), 'commutative_antiderivative': Matrix([ [t**2/2, t**2/2, t**2/2], [t**2/2,
t**2/2, t**2/2], [t**2/2, t**2/2, t**2/2]]), 'rhs': Matrix([ [t], [0], [0]]), 'type_of_equation':
'type4'}
assert _classify_linear_system(eq3, funcs_2[:-1], t) == sol3
eq4 = [Eq(x1, x(t) + y(t) + t*z(t) + 1), Eq(y1, x(t) + t*y(t) + z(t) + 10), Eq(z1, t*x(t) + y(t) + z(t) + t)]
sol4 = {'no_of_equation': 3, 'eq': [Eq(Derivative(x(t), t), t*z(t) + x(t) + y(t) + 1), Eq(Derivative(y(t),
t), t*y(t) + x(t) + z(t) + 10), Eq(Derivative(z(t), t), t*x(t) + t + y(t) + z(t))], 'func': [x(t),
y(t), z(t)], 'order': {x(t): 1, y(t): 1, z(t): 1}, 'is_linear': True, 'is_constant': False,
'is_homogeneous': False, 'is_general': True, 'func_coeff': -Matrix([ [-1, -1, -t], [-1, -t, -1], [-t,
-1, -1]]), 'commutative_antiderivative': Matrix([ [ t, t, t**2/2], [ t, t**2/2,
t], [t**2/2, t, t]]), 'rhs': Matrix([ [ 1], [10], [ t]]), 'type_of_equation': 'type4'}
assert _classify_linear_system(eq4, funcs_2[:-1], t) == sol4
sum_terms = t*(x(t) + y(t) + z(t) + w(t))
eq5 = [Eq(x1, sum_terms), Eq(y1, sum_terms), Eq(z1, sum_terms + 1), Eq(w1, sum_terms)]
sol5 = {'no_of_equation': 4, 'eq': [Eq(Derivative(x(t), t), t*(w(t) + x(t) + y(t) + z(t))),
Eq(Derivative(y(t), t), t*(w(t) + x(t) + y(t) + z(t))), Eq(Derivative(z(t), t), t*(w(t) + x(t) +
y(t) + z(t)) + 1), Eq(Derivative(w(t), t), t*(w(t) + x(t) + y(t) + z(t)))], 'func': [x(t), y(t),
z(t), w(t)], 'order': {x(t): 1, y(t): 1, z(t): 1, w(t): 1}, 'is_linear': True, 'is_constant': False,
'is_homogeneous': False, 'is_general': True, 'func_coeff': -Matrix([ [-t, -t, -t, -t], [-t, -t, -t,
-t], [-t, -t, -t, -t], [-t, -t, -t, -t]]), 'commutative_antiderivative': Matrix([ [t**2/2, t**2/2,
t**2/2, t**2/2], [t**2/2, t**2/2, t**2/2, t**2/2], [t**2/2, t**2/2, t**2/2, t**2/2], [t**2/2,
t**2/2, t**2/2, t**2/2]]), 'rhs': Matrix([ [0], [0], [1], [0]]), 'type_of_equation': 'type4'}
assert _classify_linear_system(eq5, funcs_2, t) == sol5
# Second Order
t_ = symbols("t_")
eq1 = (Eq(9*x(t) + 7*y(t) + 4*Derivative(x(t), t) + Derivative(x(t), (t, 2)) + 3*Derivative(y(t), t), 11*exp(I*t)),
Eq(3*x(t) + 12*y(t) + 5*Derivative(x(t), t) + 8*Derivative(y(t), t) + Derivative(y(t), (t, 2)), 2*exp(I*t)))
sol1 = {'no_of_equation': 2, 'eq': (Eq(9*x(t) + 7*y(t) + 4*Derivative(x(t), t) + Derivative(x(t), (t, 2)) +
3*Derivative(y(t), t), 11*exp(I*t)), Eq(3*x(t) + 12*y(t) + 5*Derivative(x(t), t) +
8*Derivative(y(t), t) + Derivative(y(t), (t, 2)), 2*exp(I*t))), 'func': [x(t), y(t)], 'order':
{x(t): 2, y(t): 2}, 'is_linear': True, 'is_homogeneous': False, 'is_general': True, 'rhs': Matrix([
[11*exp(I*t)], [ 2*exp(I*t)]]), 'type_of_equation': 'type0', 'is_second_order': True,
'is_higher_order': True}
assert _classify_linear_system(eq1, funcs, t) == sol1
eq2 = (Eq((4*t**2 + 7*t + 1)**2*Derivative(x(t), (t, 2)), 5*x(t) + 35*y(t)),
Eq((4*t**2 + 7*t + 1)**2*Derivative(y(t), (t, 2)), x(t) + 9*y(t)))
sol2 = {'no_of_equation': 2, 'eq': (Eq((4*t**2 + 7*t + 1)**2*Derivative(x(t), (t, 2)), 5*x(t) + 35*y(t)),
Eq((4*t**2 + 7*t + 1)**2*Derivative(y(t), (t, 2)), x(t) + 9*y(t))), 'func': [x(t), y(t)], 'order':
{x(t): 2, y(t): 2}, 'is_linear': True, 'is_homogeneous': True, 'is_general': True,
'type_of_equation': 'type2', 'A0': Matrix([ [Rational(53, 4), 35], [ 1, Rational(69, 4)]]), 'g(t)': sqrt(4*t**2 + 7*t
+ 1), 'tau': sqrt(33)*log(t - sqrt(33)/8 + Rational(7, 8))/33 - sqrt(33)*log(t + sqrt(33)/8 + Rational(7, 8))/33,
'is_transformed': True, 't_': t_, 'is_second_order': True, 'is_higher_order': True}
assert _classify_linear_system(eq2, funcs, t) == sol2
eq3 = ((t*Derivative(x(t), t) - x(t))*log(t) + (t*Derivative(y(t), t) - y(t))*exp(t) + Derivative(x(t), (t, 2)),
t**2*(t*Derivative(x(t), t) - x(t)) + t*(t*Derivative(y(t), t) - y(t)) + Derivative(y(t), (t, 2)))
sol3 = {'no_of_equation': 2, 'eq': ((t*Derivative(x(t), t) - x(t))*log(t) + (t*Derivative(y(t), t) -
y(t))*exp(t) + Derivative(x(t), (t, 2)), t**2*(t*Derivative(x(t), t) - x(t)) + t*(t*Derivative(y(t),
t) - y(t)) + Derivative(y(t), (t, 2))), 'func': [x(t), y(t)], 'order': {x(t): 2, y(t): 2},
'is_linear': True, 'is_homogeneous': True, 'is_general': True, 'type_of_equation': 'type1', 'A1':
Matrix([ [-t*log(t), -t*exp(t)], [ -t**3, -t**2]]), 'is_second_order': True,
'is_higher_order': True}
assert _classify_linear_system(eq3, funcs, t) == sol3
eq4 = (Eq(x2, k*x(t) - l*y1), Eq(y2, l*x1 + k*y(t)))
sol4 = {'no_of_equation': 2, 'eq': (Eq(Derivative(x(t), (t, 2)), k*x(t) - l*Derivative(y(t), t)),
Eq(Derivative(y(t), (t, 2)), k*y(t) + l*Derivative(x(t), t))), 'func': [x(t), y(t)], 'order': {x(t):
2, y(t): 2}, 'is_linear': True, 'is_homogeneous': True, 'is_general': True, 'type_of_equation':
'type0', 'is_second_order': True, 'is_higher_order': True}
assert _classify_linear_system(eq4, funcs, t) == sol4
# Multiple matches
f, g = symbols("f g", cls=Function)
y, t_ = symbols("y t_")
funcs = [f(t), g(t)]
eq1 = [Eq(Derivative(f(t), t)**2 - 2*Derivative(f(t), t) + 1, 4),
Eq(-y*f(t) + Derivative(g(t), t), 0)]
sol1 = {'is_implicit': True,
'canon_eqs': [[Eq(Derivative(f(t), t), -1), Eq(Derivative(g(t), t), y*f(t))],
[Eq(Derivative(f(t), t), 3), Eq(Derivative(g(t), t), y*f(t))]]}
assert _classify_linear_system(eq1, funcs, t) == sol1
raises(ValueError, lambda: _classify_linear_system(eq1, funcs[:1], t))
eq2 = [Eq(Derivative(f(t), t), (2*f(t) + g(t) + 1)/t), Eq(Derivative(g(t), t), (f(t) + 2*g(t))/t)]
sol2 = {'no_of_equation': 2, 'eq': [Eq(Derivative(f(t), t), (2*f(t) + g(t) + 1)/t), Eq(Derivative(g(t), t),
(f(t) + 2*g(t))/t)], 'func': [f(t), g(t)], 'order': {f(t): 1, g(t): 1}, 'is_linear': True,
'is_homogeneous': False, 'is_general': True, 'rhs': Matrix([ [1], [0]]), 'func_coeff': Matrix([ [2,
1], [1, 2]]), 'is_constant': False, 'type_of_equation': 'type6', 't_': t_, 'tau': log(t),
'commutative_antiderivative': Matrix([ [2*log(t), log(t)], [ log(t), 2*log(t)]])}
assert _classify_linear_system(eq2, funcs, t) == sol2
eq3 = [Eq(Derivative(f(t), t), (2*f(t) + g(t))/t), Eq(Derivative(g(t), t), (f(t) + 2*g(t))/t)]
sol3 = {'no_of_equation': 2, 'eq': [Eq(Derivative(f(t), t), (2*f(t) + g(t))/t), Eq(Derivative(g(t), t),
(f(t) + 2*g(t))/t)], 'func': [f(t), g(t)], 'order': {f(t): 1, g(t): 1}, 'is_linear': True,
'is_homogeneous': True, 'is_general': True, 'func_coeff': Matrix([ [2, 1], [1, 2]]), 'is_constant':
False, 'type_of_equation': 'type5', 't_': t_, 'rhs': Matrix([ [0], [0]]), 'tau': log(t),
'commutative_antiderivative': Matrix([ [2*log(t), log(t)], [ log(t), 2*log(t)]])}
assert _classify_linear_system(eq3, funcs, t) == sol3
def test_matrix_exp():
from sympy.matrices.dense import Matrix, eye, zeros
from sympy.solvers.ode.systems import matrix_exp
t = Symbol('t')
for n in range(1, 6+1):
assert matrix_exp(zeros(n), t) == eye(n)
for n in range(1, 6+1):
A = eye(n)
expAt = exp(t) * eye(n)
assert matrix_exp(A, t) == expAt
for n in range(1, 6+1):
A = Matrix(n, n, lambda i,j: i+1 if i==j else 0)
expAt = Matrix(n, n, lambda i,j: exp((i+1)*t) if i==j else 0)
assert matrix_exp(A, t) == expAt
A = Matrix([[0, 1], [-1, 0]])
expAt = Matrix([[cos(t), sin(t)], [-sin(t), cos(t)]])
assert matrix_exp(A, t) == expAt
A = Matrix([[2, -5], [2, -4]])
expAt = Matrix([
[3*exp(-t)*sin(t) + exp(-t)*cos(t), -5*exp(-t)*sin(t)],
[2*exp(-t)*sin(t), -3*exp(-t)*sin(t) + exp(-t)*cos(t)]
])
assert matrix_exp(A, t) == expAt
A = Matrix([[21, 17, 6], [-5, -1, -6], [4, 4, 16]])
# TO update this.
# expAt = Matrix([
# [(8*t*exp(12*t) + 5*exp(12*t) - 1)*exp(4*t)/4,
# (8*t*exp(12*t) + 5*exp(12*t) - 5)*exp(4*t)/4,
# (exp(12*t) - 1)*exp(4*t)/2],
# [(-8*t*exp(12*t) - exp(12*t) + 1)*exp(4*t)/4,
# (-8*t*exp(12*t) - exp(12*t) + 5)*exp(4*t)/4,
# (-exp(12*t) + 1)*exp(4*t)/2],
# [4*t*exp(16*t), 4*t*exp(16*t), exp(16*t)]])
expAt = Matrix([
[2*t*exp(16*t) + 5*exp(16*t)/4 - exp(4*t)/4, 2*t*exp(16*t) + 5*exp(16*t)/4 - 5*exp(4*t)/4, exp(16*t)/2 - exp(4*t)/2],
[ -2*t*exp(16*t) - exp(16*t)/4 + exp(4*t)/4, -2*t*exp(16*t) - exp(16*t)/4 + 5*exp(4*t)/4, -exp(16*t)/2 + exp(4*t)/2],
[ 4*t*exp(16*t), 4*t*exp(16*t), exp(16*t)]
])
assert matrix_exp(A, t) == expAt
A = Matrix([[1, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 1, -S(1)/8],
[0, 0, S(1)/2, S(1)/2]])
expAt = Matrix([
[exp(t), t*exp(t), 4*t*exp(3*t/4) + 8*t*exp(t) + 48*exp(3*t/4) - 48*exp(t),
-2*t*exp(3*t/4) - 2*t*exp(t) - 16*exp(3*t/4) + 16*exp(t)],
[0, exp(t), -t*exp(3*t/4) - 8*exp(3*t/4) + 8*exp(t), t*exp(3*t/4)/2 + 2*exp(3*t/4) - 2*exp(t)],
[0, 0, t*exp(3*t/4)/4 + exp(3*t/4), -t*exp(3*t/4)/8],
[0, 0, t*exp(3*t/4)/2, -t*exp(3*t/4)/4 + exp(3*t/4)]
])
assert matrix_exp(A, t) == expAt
A = Matrix([
[ 0, 1, 0, 0],
[-1, 0, 0, 0],
[ 0, 0, 0, 1],
[ 0, 0, -1, 0]])
expAt = Matrix([
[ cos(t), sin(t), 0, 0],
[-sin(t), cos(t), 0, 0],
[ 0, 0, cos(t), sin(t)],
[ 0, 0, -sin(t), cos(t)]])
assert matrix_exp(A, t) == expAt
A = Matrix([
[ 0, 1, 1, 0],
[-1, 0, 0, 1],
[ 0, 0, 0, 1],
[ 0, 0, -1, 0]])
expAt = Matrix([
[ cos(t), sin(t), t*cos(t), t*sin(t)],
[-sin(t), cos(t), -t*sin(t), t*cos(t)],
[ 0, 0, cos(t), sin(t)],
[ 0, 0, -sin(t), cos(t)]])
assert matrix_exp(A, t) == expAt
# This case is unacceptably slow right now but should be solvable...
#a, b, c, d, e, f = symbols('a b c d e f')
#A = Matrix([
#[-a, b, c, d],
#[ a, -b, e, 0],
#[ 0, 0, -c - e - f, 0],
#[ 0, 0, f, -d]])
A = Matrix([[0, I], [I, 0]])
expAt = Matrix([
[exp(I*t)/2 + exp(-I*t)/2, exp(I*t)/2 - exp(-I*t)/2],
[exp(I*t)/2 - exp(-I*t)/2, exp(I*t)/2 + exp(-I*t)/2]])
assert matrix_exp(A, t) == expAt
# Testing Errors
M = Matrix([[1, 2, 3], [4, 5, 6], [7, 7, 7]])
M1 = Matrix([[t, 1], [1, 1]])
raises(ValueError, lambda: matrix_exp(M[:, :2], t))
raises(ValueError, lambda: matrix_exp(M[:2, :], t))
raises(ValueError, lambda: matrix_exp(M1, t))
raises(ValueError, lambda: matrix_exp(M1[:1, :1], t))
def test_canonical_odes():
f, g, h = symbols('f g h', cls=Function)
x = symbols('x')
funcs = [f(x), g(x), h(x)]
eqs1 = [Eq(f(x).diff(x, x), f(x) + 2*g(x)), Eq(g(x) + 1, g(x).diff(x) + f(x))]
sol1 = [[Eq(Derivative(f(x), (x, 2)), f(x) + 2*g(x)), Eq(Derivative(g(x), x), -f(x) + g(x) + 1)]]
assert canonical_odes(eqs1, funcs[:2], x) == sol1
eqs2 = [Eq(f(x).diff(x), h(x).diff(x) + f(x)), Eq(g(x).diff(x)**2, f(x) + h(x)), Eq(h(x).diff(x), f(x))]
sol2 = [[Eq(Derivative(f(x), x), 2*f(x)), Eq(Derivative(g(x), x), -sqrt(f(x) + h(x))), Eq(Derivative(h(x), x), f(x))],
[Eq(Derivative(f(x), x), 2*f(x)), Eq(Derivative(g(x), x), sqrt(f(x) + h(x))), Eq(Derivative(h(x), x), f(x))]]
assert canonical_odes(eqs2, funcs, x) == sol2
def test_sysode_linear_neq_order1_type1():
f, g, x, y, h = symbols('f g x y h', cls=Function)
a, b, c, t = symbols('a b c t')
eqs1 = [Eq(Derivative(x(t), t), x(t)),
Eq(Derivative(y(t), t), y(t))]
sol1 = [Eq(x(t), C1*exp(t)),
Eq(y(t), C2*exp(t))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
eqs2 = [Eq(Derivative(x(t), t), 2*x(t)),
Eq(Derivative(y(t), t), 3*y(t))]
sol2 = [Eq(x(t), C1*exp(2*t)),
Eq(y(t), C2*exp(3*t))]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = [Eq(Derivative(x(t), t), a*x(t)),
Eq(Derivative(y(t), t), a*y(t))]
sol3 = [Eq(x(t), C1*exp(a*t)),
Eq(y(t), C2*exp(a*t))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0])
# Regression test case for issue #15474
# https://github.com/sympy/sympy/issues/15474
eqs4 = [Eq(Derivative(x(t), t), a*x(t)),
Eq(Derivative(y(t), t), b*y(t))]
sol4 = [Eq(x(t), C1*exp(a*t)),
Eq(y(t), C2*exp(b*t))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0])
eqs5 = [Eq(Derivative(x(t), t), -y(t)),
Eq(Derivative(y(t), t), x(t))]
sol5 = [Eq(x(t), -C1*sin(t) - C2*cos(t)),
Eq(y(t), C1*cos(t) - C2*sin(t))]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0])
eqs6 = [Eq(Derivative(x(t), t), -2*y(t)),
Eq(Derivative(y(t), t), 2*x(t))]
sol6 = [Eq(x(t), -C1*sin(2*t) - C2*cos(2*t)),
Eq(y(t), C1*cos(2*t) - C2*sin(2*t))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0])
eqs7 = [Eq(Derivative(x(t), t), I*y(t)),
Eq(Derivative(y(t), t), I*x(t))]
sol7 = [Eq(x(t), -C1*exp(-I*t) + C2*exp(I*t)),
Eq(y(t), C1*exp(-I*t) + C2*exp(I*t))]
assert dsolve(eqs7) == sol7
assert checksysodesol(eqs7, sol7) == (True, [0, 0])
eqs8 = [Eq(Derivative(x(t), t), -a*y(t)),
Eq(Derivative(y(t), t), a*x(t))]
sol8 = [Eq(x(t), -I*C1*exp(-I*a*t) + I*C2*exp(I*a*t)),
Eq(y(t), C1*exp(-I*a*t) + C2*exp(I*a*t))]
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0])
eqs9 = [Eq(Derivative(x(t), t), x(t) + y(t)),
Eq(Derivative(y(t), t), x(t) - y(t))]
sol9 = [Eq(x(t), C1*(1 - sqrt(2))*exp(-sqrt(2)*t) + C2*(1 + sqrt(2))*exp(sqrt(2)*t)),
Eq(y(t), C1*exp(-sqrt(2)*t) + C2*exp(sqrt(2)*t))]
assert dsolve(eqs9) == sol9
assert checksysodesol(eqs9, sol9) == (True, [0, 0])
eqs10 = [Eq(Derivative(x(t), t), x(t) + y(t)),
Eq(Derivative(y(t), t), x(t) + y(t))]
sol10 = [Eq(x(t), -C1 + C2*exp(2*t)),
Eq(y(t), C1 + C2*exp(2*t))]
assert dsolve(eqs10) == sol10
assert checksysodesol(eqs10, sol10) == (True, [0, 0])
eqs11 = [Eq(Derivative(x(t), t), 2*x(t) + y(t)),
Eq(Derivative(y(t), t), -x(t) + 2*y(t))]
sol11 = [Eq(x(t), C1*exp(2*t)*sin(t) + C2*exp(2*t)*cos(t)),
Eq(y(t), C1*exp(2*t)*cos(t) - C2*exp(2*t)*sin(t))]
assert dsolve(eqs11) == sol11
assert checksysodesol(eqs11, sol11) == (True, [0, 0])
eqs12 = [Eq(Derivative(x(t), t), x(t) + 2*y(t)),
Eq(Derivative(y(t), t), 2*x(t) + y(t))]
sol12 = [Eq(x(t), -C1*exp(-t) + C2*exp(3*t)),
Eq(y(t), C1*exp(-t) + C2*exp(3*t))]
assert dsolve(eqs12) == sol12
assert checksysodesol(eqs12, sol12) == (True, [0, 0])
eqs13 = [Eq(Derivative(x(t), t), 4*x(t) + y(t)),
Eq(Derivative(y(t), t), -x(t) + 2*y(t))]
sol13 = [Eq(x(t), C2*t*exp(3*t) + (C1 + C2)*exp(3*t)),
Eq(y(t), -C1*exp(3*t) - C2*t*exp(3*t))]
assert dsolve(eqs13) == sol13
assert checksysodesol(eqs13, sol13) == (True, [0, 0])
eqs14 = [Eq(Derivative(x(t), t), a*y(t)),
Eq(Derivative(y(t), t), a*x(t))]
sol14 = [Eq(x(t), -C1*exp(-a*t) + C2*exp(a*t)),
Eq(y(t), C1*exp(-a*t) + C2*exp(a*t))]
assert dsolve(eqs14) == sol14
assert checksysodesol(eqs14, sol14) == (True, [0, 0])
eqs15 = [Eq(Derivative(x(t), t), a*y(t)),
Eq(Derivative(y(t), t), b*x(t))]
sol15 = [Eq(x(t), -C1*a*exp(-t*sqrt(a*b))/sqrt(a*b) + C2*a*exp(t*sqrt(a*b))/sqrt(a*b)),
Eq(y(t), C1*exp(-t*sqrt(a*b)) + C2*exp(t*sqrt(a*b)))]
assert dsolve(eqs15) == sol15
assert checksysodesol(eqs15, sol15) == (True, [0, 0])
eqs16 = [Eq(Derivative(x(t), t), a*x(t) + b*y(t)),
Eq(Derivative(y(t), t), c*x(t))]
sol16 = [Eq(x(t), -2*C1*b*exp(t*(a + sqrt(a**2 + 4*b*c))/2)/(a - sqrt(a**2 + 4*b*c)) - 2*C2*b*exp(t*(a -
sqrt(a**2 + 4*b*c))/2)/(a + sqrt(a**2 + 4*b*c))),
Eq(y(t), C1*exp(t*(a + sqrt(a**2 + 4*b*c))/2) + C2*exp(t*(a - sqrt(a**2 + 4*b*c))/2))]
assert dsolve(eqs16) == sol16
assert checksysodesol(eqs16, sol16) == (True, [0, 0])
# Regression test case for issue #18562
# https://github.com/sympy/sympy/issues/18562
eqs17 = [Eq(Derivative(x(t), t), a*y(t) + x(t)),
Eq(Derivative(y(t), t), a*x(t) - y(t))]
sol17 = [Eq(x(t), C1*a*exp(t*sqrt(a**2 + 1))/(sqrt(a**2 + 1) - 1) - C2*a*exp(-t*sqrt(a**2 + 1))/(sqrt(a**2 +
1) + 1)),
Eq(y(t), C1*exp(t*sqrt(a**2 + 1)) + C2*exp(-t*sqrt(a**2 + 1)))]
assert dsolve(eqs17) == sol17
assert checksysodesol(eqs17, sol17) == (True, [0, 0])
eqs18 = [Eq(Derivative(x(t), t), 0),
Eq(Derivative(y(t), t), 0)]
sol18 = [Eq(x(t), C1),
Eq(y(t), C2)]
assert dsolve(eqs18) == sol18
assert checksysodesol(eqs18, sol18) == (True, [0, 0])
eqs19 = [Eq(Derivative(x(t), t), 2*x(t) - y(t)),
Eq(Derivative(y(t), t), x(t))]
sol19 = [Eq(x(t), C2*t*exp(t) + (C1 + C2)*exp(t)),
Eq(y(t), C1*exp(t) + C2*t*exp(t))]
assert dsolve(eqs19) == sol19
assert checksysodesol(eqs19, sol19) == (True, [0, 0])
eqs20 = [Eq(Derivative(x(t), t), x(t)),
Eq(Derivative(y(t), t), x(t) + y(t))]
sol20 = [Eq(x(t), C1*exp(t)),
Eq(y(t), C1*t*exp(t) + C2*exp(t))]
assert dsolve(eqs20) == sol20
assert checksysodesol(eqs20, sol20) == (True, [0, 0])
eqs21 = [Eq(Derivative(x(t), t), 3*x(t)),
Eq(Derivative(y(t), t), x(t) + y(t))]
sol21 = [Eq(x(t), 2*C1*exp(3*t)),
Eq(y(t), C1*exp(3*t) + C2*exp(t))]
assert dsolve(eqs21) == sol21
assert checksysodesol(eqs21, sol21) == (True, [0, 0])
eqs22 = [Eq(Derivative(x(t), t), 3*x(t)),
Eq(Derivative(y(t), t), y(t))]
sol22 = [Eq(x(t), C1*exp(3*t)),
Eq(y(t), C2*exp(t))]
assert dsolve(eqs22) == sol22
assert checksysodesol(eqs22, sol22) == (True, [0, 0])
@slow
def test_sysode_linear_neq_order1_type1_slow():
t = Symbol('t')
Z0 = Function('Z0')
Z1 = Function('Z1')
Z2 = Function('Z2')
Z3 = Function('Z3')
k01, k10, k20, k21, k23, k30 = symbols('k01 k10 k20 k21 k23 k30')
eqs1 = [Eq(Derivative(Z0(t), t), -k01*Z0(t) + k10*Z1(t) + k20*Z2(t) + k30*Z3(t)),
Eq(Derivative(Z1(t), t), k01*Z0(t) - k10*Z1(t) + k21*Z2(t)),
Eq(Derivative(Z2(t), t), (-k20 - k21 - k23)*Z2(t)),
Eq(Derivative(Z3(t), t), k23*Z2(t) - k30*Z3(t))]
sol1 = [Eq(Z0(t), C1*k10/k01 - C2*(k10 - k30)*exp(-k30*t)/(k01 + k10 - k30) - C3*(k10*(k20 + k21 - k30) -
k20**2 - k20*(k21 + k23 - k30) + k23*k30)*exp(-t*(k20 + k21 + k23))/(k23*(-k01 - k10 + k20 + k21 +
k23)) - C4*exp(-t*(k01 + k10))),
Eq(Z1(t), C1 - C2*k01*exp(-k30*t)/(k01 + k10 - k30) + C3*(-k01*(k20 + k21 - k30) + k20*k21 + k21**2
+ k21*(k23 - k30))*exp(-t*(k20 + k21 + k23))/(k23*(-k01 - k10 + k20 + k21 + k23)) + C4*exp(-t*(k01 +
k10))),
Eq(Z2(t), -C3*(k20 + k21 + k23 - k30)*exp(-t*(k20 + k21 + k23))/k23),
Eq(Z3(t), C2*exp(-k30*t) + C3*exp(-t*(k20 + k21 + k23)))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0, 0, 0])
x, y, z, u, v, w = symbols('x y z u v w', cls=Function)
k2, k3 = symbols('k2 k3')
a_b, a_c = symbols('a_b a_c', real=True)
eqs2 = [Eq(Derivative(z(t), t), k2*y(t)),
Eq(Derivative(x(t), t), k3*y(t)),
Eq(Derivative(y(t), t), (-k2 - k3)*y(t))]
sol2 = [Eq(z(t), C1 - C2*k2*exp(-t*(k2 + k3))/(k2 + k3)),
Eq(x(t), -C2*k3*exp(-t*(k2 + k3))/(k2 + k3) + C3),
Eq(y(t), C2*exp(-t*(k2 + k3)))]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0, 0])
eqs3 = [4*u(t) - v(t) - 2*w(t) + Derivative(u(t), t),
2*u(t) + v(t) - 2*w(t) + Derivative(v(t), t),
5*u(t) + v(t) - 3*w(t) + Derivative(w(t), t)]
sol3 = [Eq(u(t), C3*exp(-2*t) + (C1/2 + sqrt(3)*C2/6)*cos(sqrt(3)*t) + sin(sqrt(3)*t)*(sqrt(3)*C1/6 +
C2*Rational(-1, 2))),
Eq(v(t), (C1/2 + sqrt(3)*C2/6)*cos(sqrt(3)*t) + sin(sqrt(3)*t)*(sqrt(3)*C1/6 + C2*Rational(-1, 2))),
Eq(w(t), C1*cos(sqrt(3)*t) - C2*sin(sqrt(3)*t) + C3*exp(-2*t))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0, 0])
eqs4 = [Eq(Derivative(x(t), t), w(t)*Rational(-2, 9) + 2*x(t) + y(t) + z(t)*Rational(-8, 9)),
Eq(Derivative(y(t), t), w(t)*Rational(4, 9) + 2*y(t) + z(t)*Rational(16, 9)),
Eq(Derivative(z(t), t), w(t)*Rational(-2, 9) + z(t)*Rational(37, 9)),
Eq(Derivative(w(t), t), w(t)*Rational(44, 9) + z(t)*Rational(-4, 9))]
sol4 = [Eq(x(t), C1*exp(2*t) + C2*t*exp(2*t)),
Eq(y(t), C2*exp(2*t) + 2*C3*exp(4*t)),
Eq(z(t), 2*C3*exp(4*t) + C4*exp(5*t)*Rational(-1, 4)),
Eq(w(t), C3*exp(4*t) + C4*exp(5*t))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0, 0, 0])
# Regression test case for issue #15574
# https://github.com/sympy/sympy/issues/15574
eq5 = [Eq(x(t).diff(t), x(t)), Eq(y(t).diff(t), y(t)), Eq(z(t).diff(t), z(t)), Eq(w(t).diff(t), w(t))]
sol5 = [Eq(x(t), C1*exp(t)), Eq(y(t), C2*exp(t)), Eq(z(t), C3*exp(t)), Eq(w(t), C4*exp(t))]
assert dsolve(eq5) == sol5
assert checksysodesol(eq5, sol5) == (True, [0, 0, 0, 0])
eqs6 = [Eq(Derivative(x(t), t), x(t) + y(t)),
Eq(Derivative(y(t), t), y(t) + z(t)),
Eq(Derivative(z(t), t), w(t)*Rational(-1, 8) + z(t)),
Eq(Derivative(w(t), t), w(t)/2 + z(t)/2)]
sol6 = [Eq(x(t), C1*exp(t) + C2*t*exp(t) + 4*C4*t*exp(t*Rational(3, 4)) + (4*C3 + 48*C4)*exp(t*Rational(3,
4))),
Eq(y(t), C2*exp(t) - C4*t*exp(t*Rational(3, 4)) - (C3 + 8*C4)*exp(t*Rational(3, 4))),
Eq(z(t), C4*t*exp(t*Rational(3, 4))/4 + (C3/4 + C4)*exp(t*Rational(3, 4))),
Eq(w(t), C3*exp(t*Rational(3, 4))/2 + C4*t*exp(t*Rational(3, 4))/2)]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0, 0, 0])
# Regression test case for issue #15574
# https://github.com/sympy/sympy/issues/15574
eq7 = [Eq(Derivative(x(t), t), x(t)), Eq(Derivative(y(t), t), y(t)), Eq(Derivative(z(t), t), z(t)),
Eq(Derivative(w(t), t), w(t)), Eq(Derivative(u(t), t), u(t))]
sol7 = [Eq(x(t), C1*exp(t)), Eq(y(t), C2*exp(t)), Eq(z(t), C3*exp(t)), Eq(w(t), C4*exp(t)),
Eq(u(t), C5*exp(t))]
assert dsolve(eq7) == sol7
assert checksysodesol(eq7, sol7) == (True, [0, 0, 0, 0, 0])
eqs8 = [Eq(Derivative(x(t), t), 2*x(t) + y(t)),
Eq(Derivative(y(t), t), 2*y(t)),
Eq(Derivative(z(t), t), 4*z(t)),
Eq(Derivative(w(t), t), u(t) + 5*w(t)),
Eq(Derivative(u(t), t), 5*u(t))]
sol8 = [Eq(x(t), C1*exp(2*t) + C2*t*exp(2*t)),
Eq(y(t), C2*exp(2*t)),
Eq(z(t), C3*exp(4*t)),
Eq(w(t), C4*exp(5*t) + C5*t*exp(5*t)),
Eq(u(t), C5*exp(5*t))]
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0, 0, 0, 0])
# Regression test case for issue #15574
# https://github.com/sympy/sympy/issues/15574
eq9 = [Eq(Derivative(x(t), t), x(t)), Eq(Derivative(y(t), t), y(t)), Eq(Derivative(z(t), t), z(t))]
sol9 = [Eq(x(t), C1*exp(t)), Eq(y(t), C2*exp(t)), Eq(z(t), C3*exp(t))]
assert dsolve(eq9) == sol9
assert checksysodesol(eq9, sol9) == (True, [0, 0, 0])
# Regression test case for issue #15407
# https://github.com/sympy/sympy/issues/15407
eqs10 = [Eq(Derivative(x(t), t), (-a_b - a_c)*x(t)),
Eq(Derivative(y(t), t), a_b*y(t)),
Eq(Derivative(z(t), t), a_c*x(t))]
sol10 = [Eq(x(t), -C1*(a_b + a_c)*exp(-t*(a_b + a_c))/a_c),
Eq(y(t), C2*exp(a_b*t)),
Eq(z(t), C1*exp(-t*(a_b + a_c)) + C3)]
assert dsolve(eqs10) == sol10
assert checksysodesol(eqs10, sol10) == (True, [0, 0, 0])
# Regression test case for issue #14312
# https://github.com/sympy/sympy/issues/14312
eqs11 = [Eq(Derivative(x(t), t), k3*y(t)),
Eq(Derivative(y(t), t), (-k2 - k3)*y(t)),
Eq(Derivative(z(t), t), k2*y(t))]
sol11 = [Eq(x(t), C1 + C2*k3*exp(-t*(k2 + k3))/k2),
Eq(y(t), -C2*(k2 + k3)*exp(-t*(k2 + k3))/k2),
Eq(z(t), C2*exp(-t*(k2 + k3)) + C3)]
assert dsolve(eqs11) == sol11
assert checksysodesol(eqs11, sol11) == (True, [0, 0, 0])
# Regression test case for issue #14312
# https://github.com/sympy/sympy/issues/14312
eqs12 = [Eq(Derivative(z(t), t), k2*y(t)),
Eq(Derivative(x(t), t), k3*y(t)),
Eq(Derivative(y(t), t), (-k2 - k3)*y(t))]
sol12 = [Eq(z(t), C1 - C2*k2*exp(-t*(k2 + k3))/(k2 + k3)),
Eq(x(t), -C2*k3*exp(-t*(k2 + k3))/(k2 + k3) + C3),
Eq(y(t), C2*exp(-t*(k2 + k3)))]
assert dsolve(eqs12) == sol12
assert checksysodesol(eqs12, sol12) == (True, [0, 0, 0])
f, g, h = symbols('f, g, h', cls=Function)
a, b, c = symbols('a, b, c')
# Regression test case for issue #15474
# https://github.com/sympy/sympy/issues/15474
eqs13 = [Eq(Derivative(f(t), t), 2*f(t) + g(t)),
Eq(Derivative(g(t), t), a*f(t))]
sol13 = [Eq(f(t), C1*exp(t*(sqrt(a + 1) + 1))/(sqrt(a + 1) - 1) - C2*exp(-t*(sqrt(a + 1) - 1))/(sqrt(a + 1) +
1)),
Eq(g(t), C1*exp(t*(sqrt(a + 1) + 1)) + C2*exp(-t*(sqrt(a + 1) - 1)))]
assert dsolve(eqs13) == sol13
assert checksysodesol(eqs13, sol13) == (True, [0, 0])
eqs14 = [Eq(Derivative(f(t), t), 2*g(t) - 3*h(t)),
Eq(Derivative(g(t), t), -2*f(t) + 4*h(t)),
Eq(Derivative(h(t), t), 3*f(t) - 4*g(t))]
sol14 = [Eq(f(t), 2*C1 - sin(sqrt(29)*t)*(sqrt(29)*C2*Rational(3, 25) + C3*Rational(-8, 25)) -
cos(sqrt(29)*t)*(C2*Rational(8, 25) + sqrt(29)*C3*Rational(3, 25))),
Eq(g(t), C1*Rational(3, 2) + sin(sqrt(29)*t)*(sqrt(29)*C2*Rational(4, 25) + C3*Rational(6, 25)) -
cos(sqrt(29)*t)*(C2*Rational(6, 25) + sqrt(29)*C3*Rational(-4, 25))),
Eq(h(t), C1 + C2*cos(sqrt(29)*t) - C3*sin(sqrt(29)*t))]
assert dsolve(eqs14) == sol14
assert checksysodesol(eqs14, sol14) == (True, [0, 0, 0])
eqs15 = [Eq(2*Derivative(f(t), t), 12*g(t) - 12*h(t)),
Eq(3*Derivative(g(t), t), -8*f(t) + 8*h(t)),
Eq(4*Derivative(h(t), t), 6*f(t) - 6*g(t))]
sol15 = [Eq(f(t), C1 - sin(sqrt(29)*t)*(sqrt(29)*C2*Rational(6, 13) + C3*Rational(-16, 13)) -
cos(sqrt(29)*t)*(C2*Rational(16, 13) + sqrt(29)*C3*Rational(6, 13))),
Eq(g(t), C1 + sin(sqrt(29)*t)*(sqrt(29)*C2*Rational(8, 39) + C3*Rational(16, 13)) -
cos(sqrt(29)*t)*(C2*Rational(16, 13) + sqrt(29)*C3*Rational(-8, 39))),
Eq(h(t), C1 + C2*cos(sqrt(29)*t) - C3*sin(sqrt(29)*t))]
assert dsolve(eqs15) == sol15
assert checksysodesol(eqs15, sol15) == (True, [0, 0, 0])
eq16 = (Eq(diff(x(t), t), 21*x(t)), Eq(diff(y(t), t), 17*x(t) + 3*y(t)),
Eq(diff(z(t), t), 5*x(t) + 7*y(t) + 9*z(t)))
sol16 = [Eq(x(t), 216*C1*exp(21*t)/209),
Eq(y(t), 204*C1*exp(21*t)/209 - 6*C2*exp(3*t)/7),
Eq(z(t), C1*exp(21*t) + C2*exp(3*t) + C3*exp(9*t))]
assert dsolve(eq16) == sol16
assert checksysodesol(eq16, sol16) == (True, [0, 0, 0])
eqs17 = [Eq(Derivative(x(t), t), 3*y(t) - 11*z(t)),
Eq(Derivative(y(t), t), -3*x(t) + 7*z(t)),
Eq(Derivative(z(t), t), 11*x(t) - 7*y(t))]
sol17 = [Eq(x(t), C1*Rational(7, 3) - sin(sqrt(179)*t)*(sqrt(179)*C2*Rational(11, 170) + C3*Rational(-21,
170)) - cos(sqrt(179)*t)*(C2*Rational(21, 170) + sqrt(179)*C3*Rational(11, 170))),
Eq(y(t), C1*Rational(11, 3) + sin(sqrt(179)*t)*(sqrt(179)*C2*Rational(7, 170) + C3*Rational(33,
170)) - cos(sqrt(179)*t)*(C2*Rational(33, 170) + sqrt(179)*C3*Rational(-7, 170))),
Eq(z(t), C1 + C2*cos(sqrt(179)*t) - C3*sin(sqrt(179)*t))]
assert dsolve(eqs17) == sol17
assert checksysodesol(eqs17, sol17) == (True, [0, 0, 0])
eqs18 = [Eq(3*Derivative(x(t), t), 20*y(t) - 20*z(t)),
Eq(4*Derivative(y(t), t), -15*x(t) + 15*z(t)),
Eq(5*Derivative(z(t), t), 12*x(t) - 12*y(t))]
sol18 = [Eq(x(t), C1 - sin(5*sqrt(2)*t)*(sqrt(2)*C2*Rational(4, 3) - C3) - cos(5*sqrt(2)*t)*(C2 +
sqrt(2)*C3*Rational(4, 3))),
Eq(y(t), C1 + sin(5*sqrt(2)*t)*(sqrt(2)*C2*Rational(3, 4) + C3) - cos(5*sqrt(2)*t)*(C2 +
sqrt(2)*C3*Rational(-3, 4))),
Eq(z(t), C1 + C2*cos(5*sqrt(2)*t) - C3*sin(5*sqrt(2)*t))]
assert dsolve(eqs18) == sol18
assert checksysodesol(eqs18, sol18) == (True, [0, 0, 0])
eqs19 = [Eq(Derivative(x(t), t), 4*x(t) - z(t)),
Eq(Derivative(y(t), t), 2*x(t) + 2*y(t) - z(t)),
Eq(Derivative(z(t), t), 3*x(t) + y(t))]
sol19 = [Eq(x(t), C2*t**2*exp(2*t)/2 + t*(2*C2 + C3)*exp(2*t) + (C1 + C2 + 2*C3)*exp(2*t)),
Eq(y(t), C2*t**2*exp(2*t)/2 + t*(2*C2 + C3)*exp(2*t) + (C1 + 2*C3)*exp(2*t)),
Eq(z(t), C2*t**2*exp(2*t) + t*(3*C2 + 2*C3)*exp(2*t) + (2*C1 + 3*C3)*exp(2*t))]
assert dsolve(eqs19) == sol19
assert checksysodesol(eqs19, sol19) == (True, [0, 0, 0])
eqs20 = [Eq(Derivative(x(t), t), 4*x(t) - y(t) - 2*z(t)),
Eq(Derivative(y(t), t), 2*x(t) + y(t) - 2*z(t)),
Eq(Derivative(z(t), t), 5*x(t) - 3*z(t))]
sol20 = [Eq(x(t), C1*exp(2*t) - sin(t)*(C2*Rational(3, 5) + C3/5) - cos(t)*(C2/5 + C3*Rational(-3, 5))),
Eq(y(t), -sin(t)*(C2*Rational(3, 5) + C3/5) - cos(t)*(C2/5 + C3*Rational(-3, 5))),
Eq(z(t), C1*exp(2*t) - C2*sin(t) + C3*cos(t))]
assert dsolve(eqs20) == sol20
assert checksysodesol(eqs20, sol20) == (True, [0, 0, 0])
eq21 = (Eq(diff(x(t), t), 9*y(t)), Eq(diff(y(t), t), 12*x(t)))
sol21 = [Eq(x(t), -sqrt(3)*C1*exp(-6*sqrt(3)*t)/2 + sqrt(3)*C2*exp(6*sqrt(3)*t)/2),
Eq(y(t), C1*exp(-6*sqrt(3)*t) + C2*exp(6*sqrt(3)*t))]
assert dsolve(eq21) == sol21
assert checksysodesol(eq21, sol21) == (True, [0, 0])
eqs22 = [Eq(Derivative(x(t), t), 2*x(t) + 4*y(t)),
Eq(Derivative(y(t), t), 12*x(t) + 41*y(t))]
sol22 = [Eq(x(t), C1*(39 - sqrt(1713))*exp(t*(sqrt(1713) + 43)/2)*Rational(-1, 24) + C2*(39 +
sqrt(1713))*exp(t*(43 - sqrt(1713))/2)*Rational(-1, 24)),
Eq(y(t), C1*exp(t*(sqrt(1713) + 43)/2) + C2*exp(t*(43 - sqrt(1713))/2))]
assert dsolve(eqs22) == sol22
assert checksysodesol(eqs22, sol22) == (True, [0, 0])
eqs23 = [Eq(Derivative(x(t), t), x(t) + y(t)),
Eq(Derivative(y(t), t), -2*x(t) + 2*y(t))]
sol23 = [Eq(x(t), (C1/4 + sqrt(7)*C2/4)*cos(sqrt(7)*t/2)*exp(t*Rational(3, 2)) +
sin(sqrt(7)*t/2)*(sqrt(7)*C1/4 + C2*Rational(-1, 4))*exp(t*Rational(3, 2))),
Eq(y(t), C1*cos(sqrt(7)*t/2)*exp(t*Rational(3, 2)) - C2*sin(sqrt(7)*t/2)*exp(t*Rational(3, 2)))]
assert dsolve(eqs23) == sol23
assert checksysodesol(eqs23, sol23) == (True, [0, 0])
# Regression test case for issue #15474
# https://github.com/sympy/sympy/issues/15474
a = Symbol("a", real=True)
eq24 = [x(t).diff(t) - a*y(t), y(t).diff(t) + a*x(t)]
sol24 = [Eq(x(t), C1*sin(a*t) + C2*cos(a*t)), Eq(y(t), C1*cos(a*t) - C2*sin(a*t))]
assert dsolve(eq24) == sol24
assert checksysodesol(eq24, sol24) == (True, [0, 0])
# Regression test case for issue #19150
# https://github.com/sympy/sympy/issues/19150
eqs25 = [Eq(Derivative(f(t), t), 0),
Eq(Derivative(g(t), t), (f(t) - 2*g(t) + x(t))/(b*c)),
Eq(Derivative(x(t), t), (g(t) - 2*x(t) + y(t))/(b*c)),
Eq(Derivative(y(t), t), (h(t) + x(t) - 2*y(t))/(b*c)),
Eq(Derivative(h(t), t), 0)]
sol25 = [Eq(f(t), -3*C1 + 4*C2),
Eq(g(t), -2*C1 + 3*C2 - C3*exp(-2*t/(b*c)) + C4*exp(-t*(sqrt(2) + 2)/(b*c)) + C5*exp(-t*(2 -
sqrt(2))/(b*c))),
Eq(x(t), -C1 + 2*C2 - sqrt(2)*C4*exp(-t*(sqrt(2) + 2)/(b*c)) + sqrt(2)*C5*exp(-t*(2 -
sqrt(2))/(b*c))),
Eq(y(t), C2 + C3*exp(-2*t/(b*c)) + C4*exp(-t*(sqrt(2) + 2)/(b*c)) + C5*exp(-t*(2 - sqrt(2))/(b*c))),
Eq(h(t), C1)]
assert dsolve(eqs25) == sol25
assert checksysodesol(eqs25, sol25) == (True, [0, 0, 0, 0, 0])
eq26 = [Eq(Derivative(f(t), t), 2*f(t)), Eq(Derivative(g(t), t), 3*f(t) + 7*g(t))]
sol26 = [Eq(f(t), -5*C1*exp(2*t)/3), Eq(g(t), C1*exp(2*t) + C2*exp(7*t))]
assert dsolve(eq26) == sol26
assert checksysodesol(eq26, sol26) == (True, [0, 0])
eq27 = [Eq(Derivative(f(t), t), -9*I*f(t) - 4*g(t)), Eq(Derivative(g(t), t), -4*I*g(t))]
sol27 = [Eq(f(t), 4*I*C1*exp(-4*I*t)/5 + C2*exp(-9*I*t)), Eq(g(t), C1*exp(-4*I*t))]
assert dsolve(eq27) == sol27
assert checksysodesol(eq27, sol27) == (True, [0, 0])
eq28 = [Eq(Derivative(f(t), t), -9*I*f(t)), Eq(Derivative(g(t), t), -4*I*g(t))]
sol28 = [Eq(f(t), C1*exp(-9*I*t)), Eq(g(t), C2*exp(-4*I*t))]
assert dsolve(eq28) == sol28
assert checksysodesol(eq28, sol28) == (True, [0, 0])
eq29 = [Eq(Derivative(f(t), t), 0), Eq(Derivative(g(t), t), 0)]
sol29 = [Eq(f(t), C1), Eq(g(t), C2)]
assert dsolve(eq29) == sol29
assert checksysodesol(eq29, sol29) == (True, [0, 0])
eq30 = [Eq(Derivative(f(t), t), f(t)), Eq(Derivative(g(t), t), 0)]
sol30 = [Eq(f(t), C1*exp(t)), Eq(g(t), C2)]
assert dsolve(eq30) == sol30
assert checksysodesol(eq30, sol30) == (True, [0, 0])
eq31 = [Eq(Derivative(f(t), t), g(t)), Eq(Derivative(g(t), t), 0)]
sol31 = [Eq(f(t), C1 + C2*t), Eq(g(t), C2)]
assert dsolve(eq31) == sol31
assert checksysodesol(eq31, sol31) == (True, [0, 0])
eq32 = [Eq(Derivative(f(t), t), 0), Eq(Derivative(g(t), t), f(t))]
sol32 = [Eq(f(t), C1), Eq(g(t), C1*t + C2)]
assert dsolve(eq32) == sol32
assert checksysodesol(eq32, sol32) == (True, [0, 0])
eq33 = [Eq(Derivative(f(t), t), 0), Eq(Derivative(g(t), t), g(t))]
sol33 = [Eq(f(t), C1), Eq(g(t), C2*exp(t))]
assert dsolve(eq33) == sol33
assert checksysodesol(eq33, sol33) == (True, [0, 0])
eq34 = [Eq(Derivative(f(t), t), f(t)), Eq(Derivative(g(t), t), I*g(t))]
sol34 = [Eq(f(t), C1*exp(t)), Eq(g(t), C2*exp(I*t))]
assert dsolve(eq34) == sol34
assert checksysodesol(eq34, sol34) == (True, [0, 0])
eq35 = [Eq(Derivative(f(t), t), I*f(t)), Eq(Derivative(g(t), t), -I*g(t))]
sol35 = [Eq(f(t), C1*exp(I*t)), Eq(g(t), C2*exp(-I*t))]
assert dsolve(eq35) == sol35
assert checksysodesol(eq35, sol35) == (True, [0, 0])
eq36 = [Eq(Derivative(f(t), t), I*g(t)), Eq(Derivative(g(t), t), 0)]
sol36 = [Eq(f(t), I*C1 + I*C2*t), Eq(g(t), C2)]
assert dsolve(eq36) == sol36
assert checksysodesol(eq36, sol36) == (True, [0, 0])
eq37 = [Eq(Derivative(f(t), t), I*g(t)), Eq(Derivative(g(t), t), I*f(t))]
sol37 = [Eq(f(t), -C1*exp(-I*t) + C2*exp(I*t)), Eq(g(t), C1*exp(-I*t) + C2*exp(I*t))]
assert dsolve(eq37) == sol37
assert checksysodesol(eq37, sol37) == (True, [0, 0])
# Multiple systems
eq1 = [Eq(Derivative(f(t), t)**2, g(t)**2), Eq(-f(t) + Derivative(g(t), t), 0)]
sol1 = [[Eq(f(t), -C1*sin(t) - C2*cos(t)),
Eq(g(t), C1*cos(t) - C2*sin(t))],
[Eq(f(t), -C1*exp(-t) + C2*exp(t)),
Eq(g(t), C1*exp(-t) + C2*exp(t))]]
assert dsolve(eq1) == sol1
for sol in sol1:
assert checksysodesol(eq1, sol) == (True, [0, 0])
def test_sysode_linear_neq_order1_type2():
f, g, h, k = symbols('f g h k', cls=Function)
x, t, a, b, c, d, y = symbols('x t a b c d y')
k1, k2 = symbols('k1 k2')
eqs1 = [Eq(Derivative(f(x), x), f(x) + g(x) + 5),
Eq(Derivative(g(x), x), -f(x) - g(x) + 7)]
sol1 = [Eq(f(x), C1 + C2 + 6*x**2 + x*(C2 + 5)),
Eq(g(x), -C1 - 6*x**2 - x*(C2 - 7))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
eqs2 = [Eq(Derivative(f(x), x), f(x) + g(x) + 5),
Eq(Derivative(g(x), x), f(x) + g(x) + 7)]
sol2 = [Eq(f(x), -C1 + C2*exp(2*x) - x - 3),
Eq(g(x), C1 + C2*exp(2*x) + x - 3)]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = [Eq(Derivative(f(x), x), f(x) + 5),
Eq(Derivative(g(x), x), f(x) + 7)]
sol3 = [Eq(f(x), C1*exp(x) - 5),
Eq(g(x), C1*exp(x) + C2 + 2*x - 5)]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0])
eqs4 = [Eq(Derivative(f(x), x), f(x) + exp(x)),
Eq(Derivative(g(x), x), x*exp(x) + f(x) + g(x))]
sol4 = [Eq(f(x), C1*exp(x) + x*exp(x)),
Eq(g(x), C1*x*exp(x) + C2*exp(x) + x**2*exp(x))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0])
eqs5 = [Eq(Derivative(f(x), x), 5*x + f(x) + g(x)),
Eq(Derivative(g(x), x), f(x) - g(x))]
sol5 = [Eq(f(x), C1*(1 + sqrt(2))*exp(sqrt(2)*x) + C2*(1 - sqrt(2))*exp(-sqrt(2)*x) + x*Rational(-5, 2) +
Rational(-5, 2)),
Eq(g(x), C1*exp(sqrt(2)*x) + C2*exp(-sqrt(2)*x) + x*Rational(-5, 2))]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0])
eqs6 = [Eq(Derivative(f(x), x), -9*f(x) - 4*g(x)),
Eq(Derivative(g(x), x), -4*g(x)),
Eq(Derivative(h(x), x), h(x) + exp(x))]
sol6 = [Eq(f(x), C2*exp(-4*x)*Rational(-4, 5) + C1*exp(-9*x)),
Eq(g(x), C2*exp(-4*x)),
Eq(h(x), C3*exp(x) + x*exp(x))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0, 0])
# Regression test case for issue #8859
# https://github.com/sympy/sympy/issues/8859
eqs7 = [Eq(Derivative(f(t), t), 3*t + f(t)),
Eq(Derivative(g(t), t), g(t))]
sol7 = [Eq(f(t), C1*exp(t) - 3*t - 3),
Eq(g(t), C2*exp(t))]
assert dsolve(eqs7) == sol7
assert checksysodesol(eqs7, sol7) == (True, [0, 0])
# Regression test case for issue #8567
# https://github.com/sympy/sympy/issues/8567
eqs8 = [Eq(Derivative(f(t), t), f(t) + 2*g(t)),
Eq(Derivative(g(t), t), -2*f(t) + g(t) + 2*exp(t))]
sol8 = [Eq(f(t), C1*exp(t)*sin(2*t) + C2*exp(t)*cos(2*t)
+ exp(t)*sin(2*t)**2 + exp(t)*cos(2*t)**2),
Eq(g(t), C1*exp(t)*cos(2*t) - C2*exp(t)*sin(2*t))]
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0])
# Regression test case for issue #19150
# https://github.com/sympy/sympy/issues/19150
eqs9 = [Eq(Derivative(f(t), t), (c - 2*f(t) + g(t))/(a*b)),
Eq(Derivative(g(t), t), (f(t) - 2*g(t) + h(t))/(a*b)),
Eq(Derivative(h(t), t), (d + g(t) - 2*h(t))/(a*b))]
sol9 = [Eq(f(t), -C1*exp(-2*t/(a*b)) + C2*exp(-t*(sqrt(2) + 2)/(a*b)) + C3*exp(-t*(2 - sqrt(2))/(a*b)) +
Mul(Rational(1, 4), 3*c + d, evaluate=False)),
Eq(g(t), -sqrt(2)*C2*exp(-t*(sqrt(2) + 2)/(a*b)) + sqrt(2)*C3*exp(-t*(2 - sqrt(2))/(a*b)) +
Mul(Rational(1, 2), c + d, evaluate=False)),
Eq(h(t), C1*exp(-2*t/(a*b)) + C2*exp(-t*(sqrt(2) + 2)/(a*b)) + C3*exp(-t*(2 - sqrt(2))/(a*b)) +
Mul(Rational(1, 4), c + 3*d, evaluate=False))]
assert dsolve(eqs9) == sol9
assert checksysodesol(eqs9, sol9) == (True, [0, 0, 0])
# Regression test case for issue #16635
# https://github.com/sympy/sympy/issues/16635
eqs10 = [Eq(Derivative(f(t), t), 15*t + f(t) - g(t) - 10),
Eq(Derivative(g(t), t), -15*t + f(t) - g(t) - 5)]
sol10 = [Eq(f(t), C1 + C2 + 5*t**3 + 5*t**2 + t*(C2 - 10)),
Eq(g(t), C1 + 5*t**3 - 10*t**2 + t*(C2 - 5))]
assert dsolve(eqs10) == sol10
assert checksysodesol(eqs10, sol10) == (True, [0, 0])
# Multiple solutions
eqs11 = [Eq(Derivative(f(t), t)**2 - 2*Derivative(f(t), t) + 1, 4),
Eq(-y*f(t) + Derivative(g(t), t), 0)]
sol11 = [[Eq(f(t), C1 - t), Eq(g(t), C1*t*y + C2*y + t**2*y*Rational(-1, 2))],
[Eq(f(t), C1 + 3*t), Eq(g(t), C1*t*y + C2*y + t**2*y*Rational(3, 2))]]
assert dsolve(eqs11) == sol11
for s11 in sol11:
assert checksysodesol(eqs11, s11) == (True, [0, 0])
# test case for issue #19831
# https://github.com/sympy/sympy/issues/19831
n = symbols('n', positive=True)
x0 = symbols('x_0')
t0 = symbols('t_0')
x_0 = symbols('x_0')
t_0 = symbols('t_0')
t = symbols('t')
x = Function('x')
y = Function('y')
T = symbols('T')
eqs12 = [Eq(Derivative(y(t), t), x(t)),
Eq(Derivative(x(t), t), n*(y(t) + 1))]
sol12 = [Eq(y(t), C1*exp(sqrt(n)*t)*n**Rational(-1, 2) - C2*exp(-sqrt(n)*t)*n**Rational(-1, 2) - 1),
Eq(x(t), C1*exp(sqrt(n)*t) + C2*exp(-sqrt(n)*t))]
assert dsolve(eqs12) == sol12
assert checksysodesol(eqs12, sol12) == (True, [0, 0])
sol12b = [
Eq(y(t), (T*exp(-sqrt(n)*t_0)/2 + exp(-sqrt(n)*t_0)/2 +
x_0*exp(-sqrt(n)*t_0)/(2*sqrt(n)))*exp(sqrt(n)*t) +
(T*exp(sqrt(n)*t_0)/2 + exp(sqrt(n)*t_0)/2 -
x_0*exp(sqrt(n)*t_0)/(2*sqrt(n)))*exp(-sqrt(n)*t) - 1),
Eq(x(t), (T*sqrt(n)*exp(-sqrt(n)*t_0)/2 + sqrt(n)*exp(-sqrt(n)*t_0)/2
+ x_0*exp(-sqrt(n)*t_0)/2)*exp(sqrt(n)*t)
- (T*sqrt(n)*exp(sqrt(n)*t_0)/2 + sqrt(n)*exp(sqrt(n)*t_0)/2 -
x_0*exp(sqrt(n)*t_0)/2)*exp(-sqrt(n)*t))
]
assert dsolve(eqs12, ics={y(t0): T, x(t0): x0}) == sol12b
assert checksysodesol(eqs12, sol12b) == (True, [0, 0])
#Test cases added for the issue 19763
#https://github.com/sympy/sympy/issues/19763
eq13 = [Eq(Derivative(f(t), t), f(t) + g(t) + 9),
Eq(Derivative(g(t), t), 2*f(t) + 5*g(t) + 23)]
sol13 = [Eq(f(t), -C1*(2 + sqrt(6))*exp(t*(3 - sqrt(6)))/2 - C2*(2 - sqrt(6))*exp(t*(sqrt(6) + 3))/2 -
Rational(22,3)),
Eq(g(t), C1*exp(t*(3 - sqrt(6))) + C2*exp(t*(sqrt(6) + 3)) - Rational(5,3))]
assert dsolve(eq13) == sol13
assert checksysodesol(eq13, sol13) == (True, [0, 0])
eq14 = [Eq(Derivative(f(t), t), f(t) + g(t) + 81),
Eq(Derivative(g(t), t), -2*f(t) + g(t) + 23)]
sol14 = [Eq(f(t), sqrt(2)*C1*exp(t)*sin(sqrt(2)*t)/2
+ sqrt(2)*C2*exp(t)*cos(sqrt(2)*t)/2
- 58*sin(sqrt(2)*t)**2/3 - 58*cos(sqrt(2)*t)**2/3),
Eq(g(t), C1*exp(t)*cos(sqrt(2)*t) - C2*exp(t)*sin(sqrt(2)*t)
- 185*sin(sqrt(2)*t)**2/3 - 185*cos(sqrt(2)*t)**2/3)]
assert dsolve(eq14) == sol14
assert checksysodesol(eq14, sol14) == (True, [0,0])
eq15 = [Eq(Derivative(f(t), t), f(t) + 2*g(t) + k1),
Eq(Derivative(g(t), t), 3*f(t) + 4*g(t) + k2)]
sol15 = [Eq(f(t), -C1*(3 - sqrt(33))*exp(t*(5 + sqrt(33))/2)/6 -
C2*(3 + sqrt(33))*exp(t*(5 - sqrt(33))/2)/6 + 2*k1 - k2),
Eq(g(t), C1*exp(t*(5 + sqrt(33))/2) + C2*exp(t*(5 - sqrt(33))/2) -
Mul(Rational(1,2), 3*k1 - k2, evaluate = False))]
assert dsolve(eq15) == sol15
assert checksysodesol(eq15, sol15) == (True, [0,0])
eq16 = [Eq(Derivative(f(t), t), k1),
Eq(Derivative(g(t), t), k2)]
sol16 = [Eq(f(t), C1 + k1*t),
Eq(g(t), C2 + k2*t)]
assert dsolve(eq16) == sol16
assert checksysodesol(eq16, sol16) == (True, [0,0])
eq17 = [Eq(Derivative(f(t), t), 0),
Eq(Derivative(g(t), t), c*f(t) + k2)]
sol17 = [Eq(f(t), C1),
Eq(g(t), C2*c + t*(C1*c + k2))]
assert dsolve(eq17) == sol17
assert checksysodesol(eq17 , sol17) == (True , [0,0])
eq18 = [Eq(Derivative(f(t), t), k1),
Eq(Derivative(g(t), t), f(t) + k2)]
sol18 = [Eq(f(t), C1 + k1*t),
Eq(g(t), C2 + k1*t**2/2 + t*(C1 + k2))]
assert dsolve(eq18) == sol18
assert checksysodesol(eq18 , sol18) == (True , [0,0])
eq19 = [Eq(Derivative(f(t), t), k1),
Eq(Derivative(g(t), t), f(t) + 2*g(t) + k2)]
sol19 = [Eq(f(t), -2*C1 + k1*t),
Eq(g(t), C1 + C2*exp(2*t) - k1*t/2 - Mul(Rational(1,4), k1 + 2*k2 , evaluate = False))]
assert dsolve(eq19) == sol19
assert checksysodesol(eq19 , sol19) == (True , [0,0])
eq20 = [Eq(diff(f(t), t), f(t) + k1),
Eq(diff(g(t), t), k2)]
sol20 = [Eq(f(t), C1*exp(t) - k1),
Eq(g(t), C2 + k2*t)]
assert dsolve(eq20) == sol20
assert checksysodesol(eq20 , sol20) == (True , [0,0])
eq21 = [Eq(diff(f(t), t), g(t) + k1),
Eq(diff(g(t), t), 0)]
sol21 = [Eq(f(t), C1 + t*(C2 + k1)),
Eq(g(t), C2)]
assert dsolve(eq21) == sol21
assert checksysodesol(eq21 , sol21) == (True , [0,0])
eq22 = [Eq(Derivative(f(t), t), f(t) + 2*g(t) + k1),
Eq(Derivative(g(t), t), k2)]
sol22 = [Eq(f(t), -2*C1 + C2*exp(t) - k1 - 2*k2*t - 2*k2),
Eq(g(t), C1 + k2*t)]
assert dsolve(eq22) == sol22
assert checksysodesol(eq22 , sol22) == (True , [0,0])
eq23 = [Eq(Derivative(f(t), t), g(t) + k1),
Eq(Derivative(g(t), t), 2*g(t) + k2)]
sol23 = [Eq(f(t), C1 + C2*exp(2*t)/2 - k2/4 + t*(2*k1 - k2)/2),
Eq(g(t), C2*exp(2*t) - k2/2)]
assert dsolve(eq23) == sol23
assert checksysodesol(eq23 , sol23) == (True , [0,0])
eq24 = [Eq(Derivative(f(t), t), f(t) + k1),
Eq(Derivative(g(t), t), 2*f(t) + k2)]
sol24 = [Eq(f(t), C1*exp(t)/2 - k1),
Eq(g(t), C1*exp(t) + C2 - 2*k1 - t*(2*k1 - k2))]
assert dsolve(eq24) == sol24
assert checksysodesol(eq24 , sol24) == (True , [0,0])
eq25 = [Eq(Derivative(f(t), t), f(t) + 2*g(t) + k1),
Eq(Derivative(g(t), t), 3*f(t) + 6*g(t) + k2)]
sol25 = [Eq(f(t), -2*C1 + C2*exp(7*t)/3 + 2*t*(3*k1 - k2)/7 -
Mul(Rational(1,49), k1 + 2*k2 , evaluate = False)),
Eq(g(t), C1 + C2*exp(7*t) - t*(3*k1 - k2)/7 -
Mul(Rational(3,49), k1 + 2*k2 , evaluate = False))]
assert dsolve(eq25) == sol25
assert checksysodesol(eq25 , sol25) == (True , [0,0])
eq26 = [Eq(Derivative(f(t), t), 2*f(t) - g(t) + k1),
Eq(Derivative(g(t), t), 4*f(t) - 2*g(t) + 2*k1)]
sol26 = [Eq(f(t), C1 + 2*C2 + t*(2*C1 + k1)),
Eq(g(t), 4*C2 + t*(4*C1 + 2*k1))]
assert dsolve(eq26) == sol26
assert checksysodesol(eq26 , sol26) == (True , [0,0])
# Test Case added for issue #22715
# https://github.com/sympy/sympy/issues/22715
eq27 = [Eq(diff(x(t),t),-1*y(t)+10), Eq(diff(y(t),t),5*x(t)-2*y(t)+3)]
sol27 = [Eq(x(t), (C1/5 - 2*C2/5)*exp(-t)*cos(2*t)
- (2*C1/5 + C2/5)*exp(-t)*sin(2*t)
+ 17*sin(2*t)**2/5 + 17*cos(2*t)**2/5),
Eq(y(t), C1*exp(-t)*cos(2*t) - C2*exp(-t)*sin(2*t)
+ 10*sin(2*t)**2 + 10*cos(2*t)**2)]
assert dsolve(eq27) == sol27
assert checksysodesol(eq27 , sol27) == (True , [0,0])
def test_sysode_linear_neq_order1_type3():
f, g, h, k, x0 , y0 = symbols('f g h k x0 y0', cls=Function)
x, t, a = symbols('x t a')
r = symbols('r', real=True)
eqs1 = [Eq(Derivative(f(r), r), r*g(r) + f(r)),
Eq(Derivative(g(r), r), -r*f(r) + g(r))]
sol1 = [Eq(f(r), C1*exp(r)*sin(r**2/2) + C2*exp(r)*cos(r**2/2)),
Eq(g(r), C1*exp(r)*cos(r**2/2) - C2*exp(r)*sin(r**2/2))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
eqs2 = [Eq(Derivative(f(x), x), x**2*g(x) + x*f(x)),
Eq(Derivative(g(x), x), 2*x**2*f(x) + (3*x**2 + x)*g(x))]
sol2 = [Eq(f(x), (sqrt(17)*C1/17 + C2*(17 - 3*sqrt(17))/34)*exp(x**3*(3 + sqrt(17))/6 + x**2/2) -
exp(x**3*(3 - sqrt(17))/6 + x**2/2)*(sqrt(17)*C1/17 + C2*(3*sqrt(17) + 17)*Rational(-1, 34))),
Eq(g(x), exp(x**3*(3 - sqrt(17))/6 + x**2/2)*(C1*(17 - 3*sqrt(17))/34 + sqrt(17)*C2*Rational(-2,
17)) + exp(x**3*(3 + sqrt(17))/6 + x**2/2)*(C1*(3*sqrt(17) + 17)/34 + sqrt(17)*C2*Rational(2, 17)))]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = [Eq(f(x).diff(x), x*f(x) + g(x)),
Eq(g(x).diff(x), -f(x) + x*g(x))]
sol3 = [Eq(f(x), (C1/2 + I*C2/2)*exp(x**2/2 - I*x) + exp(x**2/2 + I*x)*(C1/2 + I*C2*Rational(-1, 2))),
Eq(g(x), (I*C1/2 + C2/2)*exp(x**2/2 + I*x) - exp(x**2/2 - I*x)*(I*C1/2 + C2*Rational(-1, 2)))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0])
eqs4 = [Eq(f(x).diff(x), x*(f(x) + g(x) + h(x))), Eq(g(x).diff(x), x*(f(x) + g(x) + h(x))),
Eq(h(x).diff(x), x*(f(x) + g(x) + h(x)))]
sol4 = [Eq(f(x), -C1/3 - C2/3 + 2*C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2)),
Eq(g(x), 2*C1/3 - C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2)),
Eq(h(x), -C1/3 + 2*C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0, 0])
eqs5 = [Eq(f(x).diff(x), x**2*(f(x) + g(x) + h(x))), Eq(g(x).diff(x), x**2*(f(x) + g(x) + h(x))),
Eq(h(x).diff(x), x**2*(f(x) + g(x) + h(x)))]
sol5 = [Eq(f(x), -C1/3 - C2/3 + 2*C3/3 + (C1/3 + C2/3 + C3/3)*exp(x**3)),
Eq(g(x), 2*C1/3 - C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(x**3)),
Eq(h(x), -C1/3 + 2*C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(x**3))]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0, 0])
eqs6 = [Eq(Derivative(f(x), x), x*(f(x) + g(x) + h(x) + k(x))),
Eq(Derivative(g(x), x), x*(f(x) + g(x) + h(x) + k(x))),
Eq(Derivative(h(x), x), x*(f(x) + g(x) + h(x) + k(x))),
Eq(Derivative(k(x), x), x*(f(x) + g(x) + h(x) + k(x)))]
sol6 = [Eq(f(x), -C1/4 - C2/4 - C3/4 + 3*C4/4 + (C1/4 + C2/4 + C3/4 + C4/4)*exp(2*x**2)),
Eq(g(x), 3*C1/4 - C2/4 - C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 + C4/4)*exp(2*x**2)),
Eq(h(x), -C1/4 + 3*C2/4 - C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 + C4/4)*exp(2*x**2)),
Eq(k(x), -C1/4 - C2/4 + 3*C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 + C4/4)*exp(2*x**2))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0, 0, 0])
y = symbols("y", real=True)
eqs7 = [Eq(Derivative(f(y), y), y*f(y) + g(y)),
Eq(Derivative(g(y), y), y*g(y) - f(y))]
sol7 = [Eq(f(y), C1*exp(y**2/2)*sin(y) + C2*exp(y**2/2)*cos(y)),
Eq(g(y), C1*exp(y**2/2)*cos(y) - C2*exp(y**2/2)*sin(y))]
assert dsolve(eqs7) == sol7
assert checksysodesol(eqs7, sol7) == (True, [0, 0])
#Test cases added for the issue 19763
#https://github.com/sympy/sympy/issues/19763
eqs8 = [Eq(Derivative(f(t), t), 5*t*f(t) + 2*h(t)),
Eq(Derivative(h(t), t), 2*f(t) + 5*t*h(t))]
sol8 = [Eq(f(t), Mul(-1, (C1/2 - C2/2), evaluate = False)*exp(5*t**2/2 - 2*t) + (C1/2 + C2/2)*exp(5*t**2/2 + 2*t)),
Eq(h(t), (C1/2 - C2/2)*exp(5*t**2/2 - 2*t) + (C1/2 + C2/2)*exp(5*t**2/2 + 2*t))]
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0])
eqs9 = [Eq(diff(f(t), t), 5*t*f(t) + t**2*g(t)),
Eq(diff(g(t), t), -t**2*f(t) + 5*t*g(t))]
sol9 = [Eq(f(t), (C1/2 - I*C2/2)*exp(I*t**3/3 + 5*t**2/2) + (C1/2 + I*C2/2)*exp(-I*t**3/3 + 5*t**2/2)),
Eq(g(t), Mul(-1, (I*C1/2 - C2/2) , evaluate = False)*exp(-I*t**3/3 + 5*t**2/2) + (I*C1/2 + C2/2)*exp(I*t**3/3 + 5*t**2/2))]
assert dsolve(eqs9) == sol9
assert checksysodesol(eqs9 , sol9) == (True , [0,0])
eqs10 = [Eq(diff(f(t), t), t**2*g(t) + 5*t*f(t)),
Eq(diff(g(t), t), -t**2*f(t) + (9*t**2 + 5*t)*g(t))]
sol10 = [Eq(f(t), (C1*(77 - 9*sqrt(77))/154 + sqrt(77)*C2/77)*exp(t**3*(sqrt(77) + 9)/6 + 5*t**2/2) + (C1*(77 + 9*sqrt(77))/154 - sqrt(77)*C2/77)*exp(t**3*(9 - sqrt(77))/6 + 5*t**2/2)),
Eq(g(t), (sqrt(77)*C1/77 + C2*(77 - 9*sqrt(77))/154)*exp(t**3*(9 - sqrt(77))/6 + 5*t**2/2) - (sqrt(77)*C1/77 - C2*(77 + 9*sqrt(77))/154)*exp(t**3*(sqrt(77) + 9)/6 + 5*t**2/2))]
assert dsolve(eqs10) == sol10
assert checksysodesol(eqs10 , sol10) == (True , [0,0])
eqs11 = [Eq(diff(f(t), t), 5*t*f(t) + t**2*g(t)),
Eq(diff(g(t), t), (1-t**2)*f(t) + (5*t + 9*t**2)*g(t))]
sol11 = [Eq(f(t), C1*x0(t) + C2*x0(t)*Integral(t**2*exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)**2, t)),
Eq(g(t), C1*y0(t) + C2*(y0(t)*Integral(t**2*exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)**2, t) + exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)))]
assert dsolve(eqs11) == sol11
@slow
def test_sysode_linear_neq_order1_type4():
f, g, h, k = symbols('f g h k', cls=Function)
x, t, a = symbols('x t a')
r = symbols('r', real=True)
eqs1 = [Eq(diff(f(r), r), f(r) + r*g(r) + r**2), Eq(diff(g(r), r), -r*f(r) + g(r) + r)]
sol1 = [Eq(f(r), C1*exp(r)*sin(r**2/2) + C2*exp(r)*cos(r**2/2) + exp(r)*sin(r**2/2)*Integral(r**2*exp(-r)*sin(r**2/2) +
r*exp(-r)*cos(r**2/2), r) + exp(r)*cos(r**2/2)*Integral(r**2*exp(-r)*cos(r**2/2) - r*exp(-r)*sin(r**2/2), r)),
Eq(g(r), C1*exp(r)*cos(r**2/2) - C2*exp(r)*sin(r**2/2) - exp(r)*sin(r**2/2)*Integral(r**2*exp(-r)*cos(r**2/2) -
r*exp(-r)*sin(r**2/2), r) + exp(r)*cos(r**2/2)*Integral(r**2*exp(-r)*sin(r**2/2) + r*exp(-r)*cos(r**2/2), r))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
eqs2 = [Eq(diff(f(r), r), f(r) + r*g(r) + r), Eq(diff(g(r), r), -r*f(r) + g(r) + log(r))]
sol2 = [Eq(f(r), C1*exp(r)*sin(r**2/2) + C2*exp(r)*cos(r**2/2) + exp(r)*sin(r**2/2)*Integral(r*exp(-r)*sin(r**2/2) +
exp(-r)*log(r)*cos(r**2/2), r) + exp(r)*cos(r**2/2)*Integral(r*exp(-r)*cos(r**2/2) - exp(-r)*log(r)*sin(
r**2/2), r)),
Eq(g(r), C1*exp(r)*cos(r**2/2) - C2*exp(r)*sin(r**2/2) - exp(r)*sin(r**2/2)*Integral(r*exp(-r)*cos(r**2/2) -
exp(-r)*log(r)*sin(r**2/2), r) + exp(r)*cos(r**2/2)*Integral(r*exp(-r)*sin(r**2/2) + exp(-r)*log(r)*cos(
r**2/2), r))]
# XXX: dsolve hangs for this in integration
assert dsolve_system(eqs2, simplify=False, doit=False) == [sol2]
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = [Eq(Derivative(f(x), x), x*(f(x) + g(x) + h(x)) + x),
Eq(Derivative(g(x), x), x*(f(x) + g(x) + h(x)) + x),
Eq(Derivative(h(x), x), x*(f(x) + g(x) + h(x)) + 1)]
sol3 = [Eq(f(x), C1*Rational(-1, 3) + C2*Rational(-1, 3) + C3*Rational(2, 3) + x**2/6 + x*Rational(-1, 3) +
(C1/3 + C2/3 + C3/3)*exp(x**2*Rational(3, 2)) +
sqrt(6)*sqrt(pi)*erf(sqrt(6)*x/2)*exp(x**2*Rational(3, 2))/18 + Rational(-2, 9)),
Eq(g(x), C1*Rational(2, 3) + C2*Rational(-1, 3) + C3*Rational(-1, 3) + x**2/6 + x*Rational(-1, 3) +
(C1/3 + C2/3 + C3/3)*exp(x**2*Rational(3, 2)) +
sqrt(6)*sqrt(pi)*erf(sqrt(6)*x/2)*exp(x**2*Rational(3, 2))/18 + Rational(-2, 9)),
Eq(h(x), C1*Rational(-1, 3) + C2*Rational(2, 3) + C3*Rational(-1, 3) + x**2*Rational(-1, 3) +
x*Rational(2, 3) + (C1/3 + C2/3 + C3/3)*exp(x**2*Rational(3, 2)) +
sqrt(6)*sqrt(pi)*erf(sqrt(6)*x/2)*exp(x**2*Rational(3, 2))/18 + Rational(-2, 9))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0, 0])
eqs4 = [Eq(Derivative(f(x), x), x*(f(x) + g(x) + h(x)) + sin(x)),
Eq(Derivative(g(x), x), x*(f(x) + g(x) + h(x)) + sin(x)),
Eq(Derivative(h(x), x), x*(f(x) + g(x) + h(x)) + sin(x))]
sol4 = [Eq(f(x), C1*Rational(-1, 3) + C2*Rational(-1, 3) + C3*Rational(2, 3) + (C1/3 + C2/3 +
C3/3)*exp(x**2*Rational(3, 2)) + Integral(sin(x)*exp(x**2*Rational(-3, 2)), x)*exp(x**2*Rational(3,
2))),
Eq(g(x), C1*Rational(2, 3) + C2*Rational(-1, 3) + C3*Rational(-1, 3) + (C1/3 + C2/3 +
C3/3)*exp(x**2*Rational(3, 2)) + Integral(sin(x)*exp(x**2*Rational(-3, 2)), x)*exp(x**2*Rational(3,
2))),
Eq(h(x), C1*Rational(-1, 3) + C2*Rational(2, 3) + C3*Rational(-1, 3) + (C1/3 + C2/3 +
C3/3)*exp(x**2*Rational(3, 2)) + Integral(sin(x)*exp(x**2*Rational(-3, 2)), x)*exp(x**2*Rational(3,
2)))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0, 0])
eqs5 = [Eq(Derivative(f(x), x), x*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(g(x), x), x*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(h(x), x), x*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(k(x), x), x*(f(x) + g(x) + h(x) + k(x) + 1))]
sol5 = [Eq(f(x), C1*Rational(-1, 4) + C2*Rational(-1, 4) + C3*Rational(-1, 4) + C4*Rational(3, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(2*x**2) + Rational(-1, 4)),
Eq(g(x), C1*Rational(3, 4) + C2*Rational(-1, 4) + C3*Rational(-1, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(2*x**2) + Rational(-1, 4)),
Eq(h(x), C1*Rational(-1, 4) + C2*Rational(3, 4) + C3*Rational(-1, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(2*x**2) + Rational(-1, 4)),
Eq(k(x), C1*Rational(-1, 4) + C2*Rational(-1, 4) + C3*Rational(3, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(2*x**2) + Rational(-1, 4))]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0, 0, 0])
eqs6 = [Eq(Derivative(f(x), x), x**2*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(g(x), x), x**2*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(h(x), x), x**2*(f(x) + g(x) + h(x) + k(x) + 1)),
Eq(Derivative(k(x), x), x**2*(f(x) + g(x) + h(x) + k(x) + 1))]
sol6 = [Eq(f(x), C1*Rational(-1, 4) + C2*Rational(-1, 4) + C3*Rational(-1, 4) + C4*Rational(3, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(x**3*Rational(4, 3)) + Rational(-1, 4)),
Eq(g(x), C1*Rational(3, 4) + C2*Rational(-1, 4) + C3*Rational(-1, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(x**3*Rational(4, 3)) + Rational(-1, 4)),
Eq(h(x), C1*Rational(-1, 4) + C2*Rational(3, 4) + C3*Rational(-1, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(x**3*Rational(4, 3)) + Rational(-1, 4)),
Eq(k(x), C1*Rational(-1, 4) + C2*Rational(-1, 4) + C3*Rational(3, 4) + C4*Rational(-1, 4) + (C1/4 +
C2/4 + C3/4 + C4/4)*exp(x**3*Rational(4, 3)) + Rational(-1, 4))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0, 0, 0])
eqs7 = [Eq(Derivative(f(x), x), (f(x) + g(x) + h(x))*log(x) + sin(x)), Eq(Derivative(g(x), x), (f(x) + g(x)
+ h(x))*log(x) + sin(x)), Eq(Derivative(h(x), x), (f(x) + g(x) + h(x))*log(x) + sin(x))]
sol7 = [Eq(f(x), -C1/3 - C2/3 + 2*C3/3 + (C1/3 + C2/3 +
C3/3)*exp(x*(3*log(x) - 3)) + exp(x*(3*log(x) -
3))*Integral(exp(3*x)*exp(-3*x*log(x))*sin(x), x)),
Eq(g(x), 2*C1/3 - C2/3 - C3/3 + (C1/3 + C2/3 +
C3/3)*exp(x*(3*log(x) - 3)) + exp(x*(3*log(x) -
3))*Integral(exp(3*x)*exp(-3*x*log(x))*sin(x), x)),
Eq(h(x), -C1/3 + 2*C2/3 - C3/3 + (C1/3 + C2/3 +
C3/3)*exp(x*(3*log(x) - 3)) + exp(x*(3*log(x) -
3))*Integral(exp(3*x)*exp(-3*x*log(x))*sin(x), x))]
with dotprodsimp(True):
assert dsolve(eqs7, simplify=False, doit=False) == sol7
assert checksysodesol(eqs7, sol7) == (True, [0, 0, 0])
eqs8 = [Eq(Derivative(f(x), x), (f(x) + g(x) + h(x) + k(x))*log(x) + sin(x)), Eq(Derivative(g(x), x), (f(x)
+ g(x) + h(x) + k(x))*log(x) + sin(x)), Eq(Derivative(h(x), x), (f(x) + g(x) + h(x) + k(x))*log(x) +
sin(x)), Eq(Derivative(k(x), x), (f(x) + g(x) + h(x) + k(x))*log(x) + sin(x))]
sol8 = [Eq(f(x), -C1/4 - C2/4 - C3/4 + 3*C4/4 + (C1/4 + C2/4 + C3/4 +
C4/4)*exp(x*(4*log(x) - 4)) + exp(x*(4*log(x) -
4))*Integral(exp(4*x)*exp(-4*x*log(x))*sin(x), x)),
Eq(g(x), 3*C1/4 - C2/4 - C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 +
C4/4)*exp(x*(4*log(x) - 4)) + exp(x*(4*log(x) -
4))*Integral(exp(4*x)*exp(-4*x*log(x))*sin(x), x)),
Eq(h(x), -C1/4 + 3*C2/4 - C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 +
C4/4)*exp(x*(4*log(x) - 4)) + exp(x*(4*log(x) -
4))*Integral(exp(4*x)*exp(-4*x*log(x))*sin(x), x)),
Eq(k(x), -C1/4 - C2/4 + 3*C3/4 - C4/4 + (C1/4 + C2/4 + C3/4 +
C4/4)*exp(x*(4*log(x) - 4)) + exp(x*(4*log(x) -
4))*Integral(exp(4*x)*exp(-4*x*log(x))*sin(x), x))]
with dotprodsimp(True):
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0, 0, 0])
def test_sysode_linear_neq_order1_type5_type6():
f, g = symbols("f g", cls=Function)
x, x_ = symbols("x x_")
# Type 5
eqs1 = [Eq(Derivative(f(x), x), (2*f(x) + g(x))/x), Eq(Derivative(g(x), x), (f(x) + 2*g(x))/x)]
sol1 = [Eq(f(x), -C1*x + C2*x**3), Eq(g(x), C1*x + C2*x**3)]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
# Type 6
eqs2 = [Eq(Derivative(f(x), x), (2*f(x) + g(x) + 1)/x),
Eq(Derivative(g(x), x), (x + f(x) + 2*g(x))/x)]
sol2 = [Eq(f(x), C2*x**3 - x*(C1 + Rational(1, 4)) + x*log(x)*Rational(-1, 2) + Rational(-2, 3)),
Eq(g(x), C2*x**3 + x*log(x)/2 + x*(C1 + Rational(-1, 4)) + Rational(1, 3))]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
def test_higher_order_to_first_order():
f, g = symbols('f g', cls=Function)
x = symbols('x')
eqs1 = [Eq(Derivative(f(x), (x, 2)), 2*f(x) + g(x)),
Eq(Derivative(g(x), (x, 2)), -f(x))]
sol1 = [Eq(f(x), -C2*x*exp(-x) + C3*x*exp(x) - (C1 - C2)*exp(-x) + (C3 + C4)*exp(x)),
Eq(g(x), C2*x*exp(-x) - C3*x*exp(x) + (C1 + C2)*exp(-x) + (C3 - C4)*exp(x))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
eqs2 = [Eq(f(x).diff(x, 2), 0), Eq(g(x).diff(x, 2), f(x))]
sol2 = [Eq(f(x), C1 + C2*x), Eq(g(x), C1*x**2/2 + C2*x**3/6 + C3 + C4*x)]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = [Eq(Derivative(f(x), (x, 2)), 2*f(x)),
Eq(Derivative(g(x), (x, 2)), -f(x) + 2*g(x))]
sol3 = [Eq(f(x), 4*C1*exp(-sqrt(2)*x) + 4*C2*exp(sqrt(2)*x)),
Eq(g(x), sqrt(2)*C1*x*exp(-sqrt(2)*x) - sqrt(2)*C2*x*exp(sqrt(2)*x) + (C1 +
sqrt(2)*C4)*exp(-sqrt(2)*x) + (C2 - sqrt(2)*C3)*exp(sqrt(2)*x))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0])
eqs4 = [Eq(Derivative(f(x), (x, 2)), 2*f(x) + g(x)),
Eq(Derivative(g(x), (x, 2)), 2*g(x))]
sol4 = [Eq(f(x), C1*x*exp(sqrt(2)*x)/4 + C3*x*exp(-sqrt(2)*x)/4 + (C2/4 + sqrt(2)*C3/8)*exp(-sqrt(2)*x) -
exp(sqrt(2)*x)*(sqrt(2)*C1/8 + C4*Rational(-1, 4))),
Eq(g(x), sqrt(2)*C1*exp(sqrt(2)*x)/2 + sqrt(2)*C3*exp(-sqrt(2)*x)*Rational(-1, 2))]
assert dsolve(eqs4) == sol4
assert checksysodesol(eqs4, sol4) == (True, [0, 0])
eqs5 = [Eq(f(x).diff(x, 2), f(x)), Eq(g(x).diff(x, 2), f(x))]
sol5 = [Eq(f(x), -C1*exp(-x) + C2*exp(x)), Eq(g(x), -C1*exp(-x) + C2*exp(x) + C3 + C4*x)]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0])
eqs6 = [Eq(Derivative(f(x), (x, 2)), f(x) + g(x)),
Eq(Derivative(g(x), (x, 2)), -f(x) - g(x))]
sol6 = [Eq(f(x), C1 + C2*x**2/2 + C2 + C4*x**3/6 + x*(C3 + C4)),
Eq(g(x), -C1 + C2*x**2*Rational(-1, 2) - C3*x + C4*x**3*Rational(-1, 6))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0])
eqs7 = [Eq(Derivative(f(x), (x, 2)), f(x) + g(x) + 1),
Eq(Derivative(g(x), (x, 2)), f(x) + g(x) + 1)]
sol7 = [Eq(f(x), -C1 - C2*x + sqrt(2)*C3*exp(sqrt(2)*x)/2 + sqrt(2)*C4*exp(-sqrt(2)*x)*Rational(-1, 2) +
Rational(-1, 2)),
Eq(g(x), C1 + C2*x + sqrt(2)*C3*exp(sqrt(2)*x)/2 + sqrt(2)*C4*exp(-sqrt(2)*x)*Rational(-1, 2) +
Rational(-1, 2))]
assert dsolve(eqs7) == sol7
assert checksysodesol(eqs7, sol7) == (True, [0, 0])
eqs8 = [Eq(Derivative(f(x), (x, 2)), f(x) + g(x) + 1),
Eq(Derivative(g(x), (x, 2)), -f(x) - g(x) + 1)]
sol8 = [Eq(f(x), C1 + C2 + C4*x**3/6 + x**4/12 + x**2*(C2/2 + Rational(1, 2)) + x*(C3 + C4)),
Eq(g(x), -C1 - C3*x + C4*x**3*Rational(-1, 6) + x**4*Rational(-1, 12) - x**2*(C2/2 + Rational(-1,
2)))]
assert dsolve(eqs8) == sol8
assert checksysodesol(eqs8, sol8) == (True, [0, 0])
x, y = symbols('x, y', cls=Function)
t, l = symbols('t, l')
eqs10 = [Eq(Derivative(x(t), (t, 2)), 5*x(t) + 43*y(t)),
Eq(Derivative(y(t), (t, 2)), x(t) + 9*y(t))]
sol10 = [Eq(x(t), C1*(61 - 9*sqrt(47))*sqrt(sqrt(47) + 7)*exp(-t*sqrt(sqrt(47) + 7))/2 + C2*sqrt(7 -
sqrt(47))*(61 + 9*sqrt(47))*exp(-t*sqrt(7 - sqrt(47)))/2 + C3*(61 - 9*sqrt(47))*sqrt(sqrt(47) +
7)*exp(t*sqrt(sqrt(47) + 7))*Rational(-1, 2) + C4*sqrt(7 - sqrt(47))*(61 + 9*sqrt(47))*exp(t*sqrt(7
- sqrt(47)))*Rational(-1, 2)),
Eq(y(t), C1*(7 - sqrt(47))*sqrt(sqrt(47) + 7)*exp(-t*sqrt(sqrt(47) + 7))*Rational(-1, 2) + C2*sqrt(7
- sqrt(47))*(sqrt(47) + 7)*exp(-t*sqrt(7 - sqrt(47)))*Rational(-1, 2) + C3*(7 -
sqrt(47))*sqrt(sqrt(47) + 7)*exp(t*sqrt(sqrt(47) + 7))/2 + C4*sqrt(7 - sqrt(47))*(sqrt(47) +
7)*exp(t*sqrt(7 - sqrt(47)))/2)]
assert dsolve(eqs10) == sol10
assert checksysodesol(eqs10, sol10) == (True, [0, 0])
eqs11 = [Eq(7*x(t) + Derivative(x(t), (t, 2)) - 9*Derivative(y(t), t), 0),
Eq(7*y(t) + 9*Derivative(x(t), t) + Derivative(y(t), (t, 2)), 0)]
sol11 = [Eq(y(t), C1*(9 - sqrt(109))*sin(sqrt(2)*t*sqrt(9*sqrt(109) + 95)/2)/14 + C2*(9 -
sqrt(109))*cos(sqrt(2)*t*sqrt(9*sqrt(109) + 95)/2)*Rational(-1, 14) + C3*(9 +
sqrt(109))*sin(sqrt(2)*t*sqrt(95 - 9*sqrt(109))/2)/14 + C4*(9 + sqrt(109))*cos(sqrt(2)*t*sqrt(95 -
9*sqrt(109))/2)*Rational(-1, 14)),
Eq(x(t), C1*(9 - sqrt(109))*cos(sqrt(2)*t*sqrt(9*sqrt(109) + 95)/2)*Rational(-1, 14) + C2*(9 -
sqrt(109))*sin(sqrt(2)*t*sqrt(9*sqrt(109) + 95)/2)*Rational(-1, 14) + C3*(9 +
sqrt(109))*cos(sqrt(2)*t*sqrt(95 - 9*sqrt(109))/2)/14 + C4*(9 + sqrt(109))*sin(sqrt(2)*t*sqrt(95 -
9*sqrt(109))/2)/14)]
assert dsolve(eqs11) == sol11
assert checksysodesol(eqs11, sol11) == (True, [0, 0])
# Euler Systems
# Note: To add examples of euler systems solver with non-homogeneous term.
eqs13 = [Eq(Derivative(f(t), (t, 2)), Derivative(f(t), t)/t + f(t)/t**2 + g(t)/t**2),
Eq(Derivative(g(t), (t, 2)), g(t)/t**2)]
sol13 = [Eq(f(t), C1*(sqrt(5) + 3)*Rational(-1, 2)*t**(Rational(1, 2) +
sqrt(5)*Rational(-1, 2)) + C2*t**(Rational(1, 2) +
sqrt(5)/2)*(3 - sqrt(5))*Rational(-1, 2) - C3*t**(1 -
sqrt(2))*(1 + sqrt(2)) - C4*t**(1 + sqrt(2))*(1 - sqrt(2))),
Eq(g(t), C1*(1 + sqrt(5))*Rational(-1, 2)*t**(Rational(1, 2) +
sqrt(5)*Rational(-1, 2)) + C2*t**(Rational(1, 2) +
sqrt(5)/2)*(1 - sqrt(5))*Rational(-1, 2))]
assert dsolve(eqs13) == sol13
assert checksysodesol(eqs13, sol13) == (True, [0, 0])
# Solving systems using dsolve separately
eqs14 = [Eq(Derivative(f(t), (t, 2)), t*f(t)),
Eq(Derivative(g(t), (t, 2)), t*g(t))]
sol14 = [Eq(f(t), C1*airyai(t) + C2*airybi(t)),
Eq(g(t), C3*airyai(t) + C4*airybi(t))]
assert dsolve(eqs14) == sol14
assert checksysodesol(eqs14, sol14) == (True, [0, 0])
eqs15 = [Eq(Derivative(x(t), (t, 2)), t*(4*Derivative(x(t), t) + 8*Derivative(y(t), t))),
Eq(Derivative(y(t), (t, 2)), t*(12*Derivative(x(t), t) - 6*Derivative(y(t), t)))]
sol15 = [Eq(x(t), C1 - erf(sqrt(6)*t)*(sqrt(6)*sqrt(pi)*C2/33 + sqrt(6)*sqrt(pi)*C3*Rational(-1, 44)) +
erfi(sqrt(5)*t)*(sqrt(5)*sqrt(pi)*C2*Rational(2, 55) + sqrt(5)*sqrt(pi)*C3*Rational(4, 55))),
Eq(y(t), C4 + erf(sqrt(6)*t)*(sqrt(6)*sqrt(pi)*C2*Rational(2, 33) + sqrt(6)*sqrt(pi)*C3*Rational(-1,
22)) + erfi(sqrt(5)*t)*(sqrt(5)*sqrt(pi)*C2*Rational(3, 110) + sqrt(5)*sqrt(pi)*C3*Rational(3, 55)))]
assert dsolve(eqs15) == sol15
assert checksysodesol(eqs15, sol15) == (True, [0, 0])
@slow
def test_higher_order_to_first_order_9():
f, g = symbols('f g', cls=Function)
x = symbols('x')
eqs9 = [f(x) + g(x) - 2*exp(I*x) + 2*Derivative(f(x), x) + Derivative(f(x), (x, 2)),
f(x) + g(x) - 2*exp(I*x) + 2*Derivative(g(x), x) + Derivative(g(x), (x, 2))]
sol9 = [Eq(f(x), -C1 + C4*exp(-2*x)/2 - (C2/2 - C3/2)*exp(-x)*cos(x)
+ (C2/2 + C3/2)*exp(-x)*sin(x) + 2*((1 - 2*I)*exp(I*x)*sin(x)**2/5)
+ 2*((1 - 2*I)*exp(I*x)*cos(x)**2/5)),
Eq(g(x), C1 - C4*exp(-2*x)/2 - (C2/2 - C3/2)*exp(-x)*cos(x)
+ (C2/2 + C3/2)*exp(-x)*sin(x) + 2*((1 - 2*I)*exp(I*x)*sin(x)**2/5)
+ 2*((1 - 2*I)*exp(I*x)*cos(x)**2/5))]
assert dsolve(eqs9) == sol9
assert checksysodesol(eqs9, sol9) == (True, [0, 0])
def test_higher_order_to_first_order_12():
f, g = symbols('f g', cls=Function)
x = symbols('x')
x, y = symbols('x, y', cls=Function)
t, l = symbols('t, l')
eqs12 = [Eq(4*x(t) + Derivative(x(t), (t, 2)) + 8*Derivative(y(t), t), 0),
Eq(4*y(t) - 8*Derivative(x(t), t) + Derivative(y(t), (t, 2)), 0)]
sol12 = [Eq(y(t), C1*(2 - sqrt(5))*sin(2*t*sqrt(4*sqrt(5) + 9))*Rational(-1, 2) + C2*(2 -
sqrt(5))*cos(2*t*sqrt(4*sqrt(5) + 9))/2 + C3*(2 + sqrt(5))*sin(2*t*sqrt(9 - 4*sqrt(5)))*Rational(-1,
2) + C4*(2 + sqrt(5))*cos(2*t*sqrt(9 - 4*sqrt(5)))/2),
Eq(x(t), C1*(2 - sqrt(5))*cos(2*t*sqrt(4*sqrt(5) + 9))*Rational(-1, 2) + C2*(2 -
sqrt(5))*sin(2*t*sqrt(4*sqrt(5) + 9))*Rational(-1, 2) + C3*(2 + sqrt(5))*cos(2*t*sqrt(9 -
4*sqrt(5)))/2 + C4*(2 + sqrt(5))*sin(2*t*sqrt(9 - 4*sqrt(5)))/2)]
assert dsolve(eqs12) == sol12
assert checksysodesol(eqs12, sol12) == (True, [0, 0])
def test_second_order_to_first_order_2():
f, g = symbols("f g", cls=Function)
x, t, x_, t_, d, a, m = symbols("x t x_ t_ d a m")
eqs2 = [Eq(f(x).diff(x, 2), 2*(x*g(x).diff(x) - g(x))),
Eq(g(x).diff(x, 2),-2*(x*f(x).diff(x) - f(x)))]
sol2 = [Eq(f(x), C1*x + x*Integral(C2*exp(-x_)*exp(I*exp(2*x_))/2 + C2*exp(-x_)*exp(-I*exp(2*x_))/2 -
I*C3*exp(-x_)*exp(I*exp(2*x_))/2 + I*C3*exp(-x_)*exp(-I*exp(2*x_))/2, (x_, log(x)))),
Eq(g(x), C4*x + x*Integral(I*C2*exp(-x_)*exp(I*exp(2*x_))/2 - I*C2*exp(-x_)*exp(-I*exp(2*x_))/2 +
C3*exp(-x_)*exp(I*exp(2*x_))/2 + C3*exp(-x_)*exp(-I*exp(2*x_))/2, (x_, log(x))))]
# XXX: dsolve hangs for this in integration
assert dsolve_system(eqs2, simplify=False, doit=False) == [sol2]
assert checksysodesol(eqs2, sol2) == (True, [0, 0])
eqs3 = (Eq(diff(f(t),t,t), 9*t*diff(g(t),t)-9*g(t)), Eq(diff(g(t),t,t),7*t*diff(f(t),t)-7*f(t)))
sol3 = [Eq(f(t), C1*t + t*Integral(C2*exp(-t_)*exp(3*sqrt(7)*exp(2*t_)/2)/2 + C2*exp(-t_)*
exp(-3*sqrt(7)*exp(2*t_)/2)/2 + 3*sqrt(7)*C3*exp(-t_)*exp(3*sqrt(7)*exp(2*t_)/2)/14 -
3*sqrt(7)*C3*exp(-t_)*exp(-3*sqrt(7)*exp(2*t_)/2)/14, (t_, log(t)))),
Eq(g(t), C4*t + t*Integral(sqrt(7)*C2*exp(-t_)*exp(3*sqrt(7)*exp(2*t_)/2)/6 - sqrt(7)*C2*exp(-t_)*
exp(-3*sqrt(7)*exp(2*t_)/2)/6 + C3*exp(-t_)*exp(3*sqrt(7)*exp(2*t_)/2)/2 + C3*exp(-t_)*exp(-3*sqrt(7)*
exp(2*t_)/2)/2, (t_, log(t))))]
# XXX: dsolve hangs for this in integration
assert dsolve_system(eqs3, simplify=False, doit=False) == [sol3]
assert checksysodesol(eqs3, sol3) == (True, [0, 0])
# Regression Test case for sympy#19238
# https://github.com/sympy/sympy/issues/19238
# Note: When the doit method is removed, these particular types of systems
# can be divided first so that we have lesser number of big matrices.
eqs5 = [Eq(Derivative(g(t), (t, 2)), a*m),
Eq(Derivative(f(t), (t, 2)), 0)]
sol5 = [Eq(g(t), C1 + C2*t + a*m*t**2/2),
Eq(f(t), C3 + C4*t)]
assert dsolve(eqs5) == sol5
assert checksysodesol(eqs5, sol5) == (True, [0, 0])
# Type 2
eqs6 = [Eq(Derivative(f(t), (t, 2)), f(t)/t**4),
Eq(Derivative(g(t), (t, 2)), d*g(t)/t**4)]
sol6 = [Eq(f(t), C1*sqrt(t**2)*exp(-1/t) - C2*sqrt(t**2)*exp(1/t)),
Eq(g(t), C3*sqrt(t**2)*exp(-sqrt(d)/t)*d**Rational(-1, 2) -
C4*sqrt(t**2)*exp(sqrt(d)/t)*d**Rational(-1, 2))]
assert dsolve(eqs6) == sol6
assert checksysodesol(eqs6, sol6) == (True, [0, 0])
@slow
def test_second_order_to_first_order_slow1():
f, g = symbols("f g", cls=Function)
x, t, x_, t_, d, a, m = symbols("x t x_ t_ d a m")
# Type 1
eqs1 = [Eq(f(x).diff(x, 2), 2/x *(x*g(x).diff(x) - g(x))),
Eq(g(x).diff(x, 2),-2/x *(x*f(x).diff(x) - f(x)))]
sol1 = [Eq(f(x), C1*x + 2*C2*x*Ci(2*x) - C2*sin(2*x) - 2*C3*x*Si(2*x) - C3*cos(2*x)),
Eq(g(x), -2*C2*x*Si(2*x) - C2*cos(2*x) - 2*C3*x*Ci(2*x) + C3*sin(2*x) + C4*x)]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
def test_second_order_to_first_order_slow4():
f, g = symbols("f g", cls=Function)
x, t, x_, t_, d, a, m = symbols("x t x_ t_ d a m")
eqs4 = [Eq(Derivative(f(t), (t, 2)), t*sin(t)*Derivative(g(t), t) - g(t)*sin(t)),
Eq(Derivative(g(t), (t, 2)), t*sin(t)*Derivative(f(t), t) - f(t)*sin(t))]
sol4 = [Eq(f(t), C1*t + t*Integral(C2*exp(-t_)*exp(exp(t_)*cos(exp(t_)))*exp(-sin(exp(t_)))/2 +
C2*exp(-t_)*exp(-exp(t_)*cos(exp(t_)))*exp(sin(exp(t_)))/2 - C3*exp(-t_)*exp(exp(t_)*cos(exp(t_)))*
exp(-sin(exp(t_)))/2 +
C3*exp(-t_)*exp(-exp(t_)*cos(exp(t_)))*exp(sin(exp(t_)))/2, (t_, log(t)))),
Eq(g(t), C4*t + t*Integral(-C2*exp(-t_)*exp(exp(t_)*cos(exp(t_)))*exp(-sin(exp(t_)))/2 +
C2*exp(-t_)*exp(-exp(t_)*cos(exp(t_)))*exp(sin(exp(t_)))/2 + C3*exp(-t_)*exp(exp(t_)*cos(exp(t_)))*
exp(-sin(exp(t_)))/2 + C3*exp(-t_)*exp(-exp(t_)*cos(exp(t_)))*exp(sin(exp(t_)))/2, (t_, log(t))))]
# XXX: dsolve hangs for this in integration
assert dsolve_system(eqs4, simplify=False, doit=False) == [sol4]
assert checksysodesol(eqs4, sol4) == (True, [0, 0])
def test_component_division():
f, g, h, k = symbols('f g h k', cls=Function)
x = symbols("x")
funcs = [f(x), g(x), h(x), k(x)]
eqs1 = [Eq(Derivative(f(x), x), 2*f(x)),
Eq(Derivative(g(x), x), f(x)),
Eq(Derivative(h(x), x), h(x)),
Eq(Derivative(k(x), x), h(x)**4 + k(x))]
sol1 = [Eq(f(x), 2*C1*exp(2*x)),
Eq(g(x), C1*exp(2*x) + C2),
Eq(h(x), C3*exp(x)),
Eq(k(x), C3**4*exp(4*x)/3 + C4*exp(x))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0, 0, 0])
components1 = {((Eq(Derivative(f(x), x), 2*f(x)),), (Eq(Derivative(g(x), x), f(x)),)),
((Eq(Derivative(h(x), x), h(x)),), (Eq(Derivative(k(x), x), h(x)**4 + k(x)),))}
eqsdict1 = ({f(x): set(), g(x): {f(x)}, h(x): set(), k(x): {h(x)}},
{f(x): Eq(Derivative(f(x), x), 2*f(x)),
g(x): Eq(Derivative(g(x), x), f(x)),
h(x): Eq(Derivative(h(x), x), h(x)),
k(x): Eq(Derivative(k(x), x), h(x)**4 + k(x))})
graph1 = [{f(x), g(x), h(x), k(x)}, {(g(x), f(x)), (k(x), h(x))}]
assert {tuple(tuple(scc) for scc in wcc) for wcc in _component_division(eqs1, funcs, x)} == components1
assert _eqs2dict(eqs1, funcs) == eqsdict1
assert [set(element) for element in _dict2graph(eqsdict1[0])] == graph1
eqs2 = [Eq(Derivative(f(x), x), 2*f(x)),
Eq(Derivative(g(x), x), f(x)),
Eq(Derivative(h(x), x), h(x)),
Eq(Derivative(k(x), x), f(x)**4 + k(x))]
sol2 = [Eq(f(x), C1*exp(2*x)),
Eq(g(x), C1*exp(2*x)/2 + C2),
Eq(h(x), C3*exp(x)),
Eq(k(x), C1**4*exp(8*x)/7 + C4*exp(x))]
assert dsolve(eqs2) == sol2
assert checksysodesol(eqs2, sol2) == (True, [0, 0, 0, 0])
components2 = {frozenset([(Eq(Derivative(f(x), x), 2*f(x)),),
(Eq(Derivative(g(x), x), f(x)),),
(Eq(Derivative(k(x), x), f(x)**4 + k(x)),)]),
frozenset([(Eq(Derivative(h(x), x), h(x)),)])}
eqsdict2 = ({f(x): set(), g(x): {f(x)}, h(x): set(), k(x): {f(x)}},
{f(x): Eq(Derivative(f(x), x), 2*f(x)),
g(x): Eq(Derivative(g(x), x), f(x)),
h(x): Eq(Derivative(h(x), x), h(x)),
k(x): Eq(Derivative(k(x), x), f(x)**4 + k(x))})
graph2 = [{f(x), g(x), h(x), k(x)}, {(g(x), f(x)), (k(x), f(x))}]
assert {frozenset(tuple(scc) for scc in wcc) for wcc in _component_division(eqs2, funcs, x)} == components2
assert _eqs2dict(eqs2, funcs) == eqsdict2
assert [set(element) for element in _dict2graph(eqsdict2[0])] == graph2
eqs3 = [Eq(Derivative(f(x), x), 2*f(x)),
Eq(Derivative(g(x), x), x + f(x)),
Eq(Derivative(h(x), x), h(x)),
Eq(Derivative(k(x), x), f(x)**4 + k(x))]
sol3 = [Eq(f(x), C1*exp(2*x)),
Eq(g(x), C1*exp(2*x)/2 + C2 + x**2/2),
Eq(h(x), C3*exp(x)),
Eq(k(x), C1**4*exp(8*x)/7 + C4*exp(x))]
assert dsolve(eqs3) == sol3
assert checksysodesol(eqs3, sol3) == (True, [0, 0, 0, 0])
components3 = {frozenset([(Eq(Derivative(f(x), x), 2*f(x)),),
(Eq(Derivative(g(x), x), x + f(x)),),
(Eq(Derivative(k(x), x), f(x)**4 + k(x)),)]),
frozenset([(Eq(Derivative(h(x), x), h(x)),),])}
eqsdict3 = ({f(x): set(), g(x): {f(x)}, h(x): set(), k(x): {f(x)}},
{f(x): Eq(Derivative(f(x), x), 2*f(x)),
g(x): Eq(Derivative(g(x), x), x + f(x)),
h(x): Eq(Derivative(h(x), x), h(x)),
k(x): Eq(Derivative(k(x), x), f(x)**4 + k(x))})
graph3 = [{f(x), g(x), h(x), k(x)}, {(g(x), f(x)), (k(x), f(x))}]
assert {frozenset(tuple(scc) for scc in wcc) for wcc in _component_division(eqs3, funcs, x)} == components3
assert _eqs2dict(eqs3, funcs) == eqsdict3
assert [set(l) for l in _dict2graph(eqsdict3[0])] == graph3
# Note: To be uncommented when the default option to call dsolve first for
# single ODE system can be rearranged. This can be done after the doit
# option in dsolve is made False by default.
eqs4 = [Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
Eq(Derivative(g(x), x), f(x) + x*g(x) + x),
Eq(Derivative(h(x), x), h(x)),
Eq(Derivative(k(x), x), f(x)**4 + k(x))]
sol4 = [Eq(f(x), (C1/2 - sqrt(2)*C2/2 - sqrt(2)*Integral(x*exp(-x**2/2 - sqrt(2)*x)/2 + x*exp(-x**2/2 +\
sqrt(2)*x)/2, x)/2 + Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2 - sqrt(2)*x*exp(-x**2/2 +\
sqrt(2)*x)/2, x)/2)*exp(x**2/2 - sqrt(2)*x) + (C1/2 + sqrt(2)*C2/2 + sqrt(2)*Integral(x*exp(-x**2/2
- sqrt(2)*x)/2 + x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2 + Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2
- sqrt(2)*x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2)*exp(x**2/2 + sqrt(2)*x)),
Eq(g(x), (-sqrt(2)*C1/4 + C2/2 + Integral(x*exp(-x**2/2 - sqrt(2)*x)/2 + x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2 -\
sqrt(2)*Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2 - sqrt(2)*x*exp(-x**2/2 + sqrt(2)*x)/2,
x)/4)*exp(x**2/2 - sqrt(2)*x) + (sqrt(2)*C1/4 + C2/2 + Integral(x*exp(-x**2/2 - sqrt(2)*x)/2 +
x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2 + sqrt(2)*Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2 -
sqrt(2)*x*exp(-x**2/2 + sqrt(2)*x)/2, x)/4)*exp(x**2/2 + sqrt(2)*x)),
Eq(h(x), C3*exp(x)),
Eq(k(x), C4*exp(x) + exp(x)*Integral((C1*exp(x**2/2 - sqrt(2)*x)/2 + C1*exp(x**2/2 + sqrt(2)*x)/2 -
sqrt(2)*C2*exp(x**2/2 - sqrt(2)*x)/2 + sqrt(2)*C2*exp(x**2/2 + sqrt(2)*x)/2 - sqrt(2)*exp(x**2/2 -
sqrt(2)*x)*Integral(x*exp(-x**2/2 - sqrt(2)*x)/2 + x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2 + exp(x**2/2 -
sqrt(2)*x)*Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2 - sqrt(2)*x*exp(-x**2/2 + sqrt(2)*x)/2,
x)/2 + sqrt(2)*exp(x**2/2 + sqrt(2)*x)*Integral(x*exp(-x**2/2 - sqrt(2)*x)/2 + x*exp(-x**2/2 +
sqrt(2)*x)/2, x)/2 + exp(x**2/2 + sqrt(2)*x)*Integral(sqrt(2)*x*exp(-x**2/2 - sqrt(2)*x)/2 -
sqrt(2)*x*exp(-x**2/2 + sqrt(2)*x)/2, x)/2)**4*exp(-x), x))]
components4 = {(frozenset([Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
Eq(Derivative(g(x), x), x*g(x) + x + f(x))]),
frozenset([Eq(Derivative(k(x), x), f(x)**4 + k(x)),])),
(frozenset([Eq(Derivative(h(x), x), h(x)),]),)}
eqsdict4 = ({f(x): {g(x)}, g(x): {f(x)}, h(x): set(), k(x): {f(x)}},
{f(x): Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
g(x): Eq(Derivative(g(x), x), x*g(x) + x + f(x)),
h(x): Eq(Derivative(h(x), x), h(x)),
k(x): Eq(Derivative(k(x), x), f(x)**4 + k(x))})
graph4 = [{f(x), g(x), h(x), k(x)}, {(f(x), g(x)), (g(x), f(x)), (k(x), f(x))}]
assert {tuple(frozenset(scc) for scc in wcc) for wcc in _component_division(eqs4, funcs, x)} == components4
assert _eqs2dict(eqs4, funcs) == eqsdict4
assert [set(element) for element in _dict2graph(eqsdict4[0])] == graph4
# XXX: dsolve hangs in integration here:
assert dsolve_system(eqs4, simplify=False, doit=False) == [sol4]
assert checksysodesol(eqs4, sol4) == (True, [0, 0, 0, 0])
eqs5 = [Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
Eq(Derivative(g(x), x), x*g(x) + f(x)),
Eq(Derivative(h(x), x), h(x)),
Eq(Derivative(k(x), x), f(x)**4 + k(x))]
sol5 = [Eq(f(x), (C1/2 - sqrt(2)*C2/2)*exp(x**2/2 - sqrt(2)*x) + (C1/2 + sqrt(2)*C2/2)*exp(x**2/2 + sqrt(2)*x)),
Eq(g(x), (-sqrt(2)*C1/4 + C2/2)*exp(x**2/2 - sqrt(2)*x) + (sqrt(2)*C1/4 + C2/2)*exp(x**2/2 + sqrt(2)*x)),
Eq(h(x), C3*exp(x)),
Eq(k(x), C4*exp(x) + exp(x)*Integral((C1*exp(x**2/2 - sqrt(2)*x)/2 + C1*exp(x**2/2 + sqrt(2)*x)/2 -
sqrt(2)*C2*exp(x**2/2 - sqrt(2)*x)/2 + sqrt(2)*C2*exp(x**2/2 + sqrt(2)*x)/2)**4*exp(-x), x))]
components5 = {(frozenset([Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
Eq(Derivative(g(x), x), x*g(x) + f(x))]),
frozenset([Eq(Derivative(k(x), x), f(x)**4 + k(x)),])),
(frozenset([Eq(Derivative(h(x), x), h(x)),]),)}
eqsdict5 = ({f(x): {g(x)}, g(x): {f(x)}, h(x): set(), k(x): {f(x)}},
{f(x): Eq(Derivative(f(x), x), x*f(x) + 2*g(x)),
g(x): Eq(Derivative(g(x), x), x*g(x) + f(x)),
h(x): Eq(Derivative(h(x), x), h(x)),
k(x): Eq(Derivative(k(x), x), f(x)**4 + k(x))})
graph5 = [{f(x), g(x), h(x), k(x)}, {(f(x), g(x)), (g(x), f(x)), (k(x), f(x))}]
assert {tuple(frozenset(scc) for scc in wcc) for wcc in _component_division(eqs5, funcs, x)} == components5
assert _eqs2dict(eqs5, funcs) == eqsdict5
assert [set(element) for element in _dict2graph(eqsdict5[0])] == graph5
# XXX: dsolve hangs in integration here:
assert dsolve_system(eqs5, simplify=False, doit=False) == [sol5]
assert checksysodesol(eqs5, sol5) == (True, [0, 0, 0, 0])
def test_linodesolve():
t, x, a = symbols("t x a")
f, g, h = symbols("f g h", cls=Function)
# Testing the Errors
raises(ValueError, lambda: linodesolve(1, t))
raises(ValueError, lambda: linodesolve(a, t))
A1 = Matrix([[1, 2], [2, 4], [4, 6]])
raises(NonSquareMatrixError, lambda: linodesolve(A1, t))
A2 = Matrix([[1, 2, 1], [3, 1, 2]])
raises(NonSquareMatrixError, lambda: linodesolve(A2, t))
# Testing auto functionality
func = [f(t), g(t)]
eq = [Eq(f(t).diff(t) + g(t).diff(t), g(t)), Eq(g(t).diff(t), f(t))]
ceq = canonical_odes(eq, func, t)
(A1, A0), b = linear_ode_to_matrix(ceq[0], func, t, 1)
A = A0
sol = [C1*(-Rational(1, 2) + sqrt(5)/2)*exp(t*(-Rational(1, 2) + sqrt(5)/2)) + C2*(-sqrt(5)/2 - Rational(1, 2))*
exp(t*(-sqrt(5)/2 - Rational(1, 2))),
C1*exp(t*(-Rational(1, 2) + sqrt(5)/2)) + C2*exp(t*(-sqrt(5)/2 - Rational(1, 2)))]
assert constant_renumber(linodesolve(A, t), variables=Tuple(*eq).free_symbols) == sol
# Testing the Errors
raises(ValueError, lambda: linodesolve(1, t, b=Matrix([t+1])))
raises(ValueError, lambda: linodesolve(a, t, b=Matrix([log(t) + sin(t)])))
raises(ValueError, lambda: linodesolve(Matrix([7]), t, b=t**2))
raises(ValueError, lambda: linodesolve(Matrix([a+10]), t, b=log(t)*cos(t)))
raises(ValueError, lambda: linodesolve(7, t, b=t**2))
raises(ValueError, lambda: linodesolve(a, t, b=log(t) + sin(t)))
A1 = Matrix([[1, 2], [2, 4], [4, 6]])
b1 = Matrix([t, 1, t**2])
raises(NonSquareMatrixError, lambda: linodesolve(A1, t, b=b1))
A2 = Matrix([[1, 2, 1], [3, 1, 2]])
b2 = Matrix([t, t**2])
raises(NonSquareMatrixError, lambda: linodesolve(A2, t, b=b2))
raises(ValueError, lambda: linodesolve(A1[:2, :], t, b=b1))
raises(ValueError, lambda: linodesolve(A1[:2, :], t, b=b1[:1]))
# DOIT check
A1 = Matrix([[1, -1], [1, -1]])
b1 = Matrix([15*t - 10, -15*t - 5])
sol1 = [C1 + C2*t + C2 - 10*t**3 + 10*t**2 + t*(15*t**2 - 5*t) - 10*t,
C1 + C2*t - 10*t**3 - 5*t**2 + t*(15*t**2 - 5*t) - 5*t]
assert constant_renumber(linodesolve(A1, t, b=b1, type="type2", doit=True),
variables=[t]) == sol1
# Testing auto functionality
func = [f(t), g(t)]
eq = [Eq(f(t).diff(t) + g(t).diff(t), g(t) + t), Eq(g(t).diff(t), f(t))]
ceq = canonical_odes(eq, func, t)
(A1, A0), b = linear_ode_to_matrix(ceq[0], func, t, 1)
A = A0
sol = [-C1*exp(-t/2 + sqrt(5)*t/2)/2 + sqrt(5)*C1*exp(-t/2 + sqrt(5)*t/2)/2 - sqrt(5)*C2*exp(-sqrt(5)*t/2 -
t/2)/2 - C2*exp(-sqrt(5)*t/2 - t/2)/2 - exp(-t/2 + sqrt(5)*t/2)*Integral(t*exp(-sqrt(5)*t/2 +
t/2)/(-5 + sqrt(5)) - sqrt(5)*t*exp(-sqrt(5)*t/2 + t/2)/(-5 + sqrt(5)), t)/2 + sqrt(5)*exp(-t/2 +
sqrt(5)*t/2)*Integral(t*exp(-sqrt(5)*t/2 + t/2)/(-5 + sqrt(5)) - sqrt(5)*t*exp(-sqrt(5)*t/2 +
t/2)/(-5 + sqrt(5)), t)/2 - sqrt(5)*exp(-sqrt(5)*t/2 - t/2)*Integral(-sqrt(5)*t*exp(t/2 +
sqrt(5)*t/2)/5, t)/2 - exp(-sqrt(5)*t/2 - t/2)*Integral(-sqrt(5)*t*exp(t/2 + sqrt(5)*t/2)/5, t)/2,
C1*exp(-t/2 + sqrt(5)*t/2) + C2*exp(-sqrt(5)*t/2 - t/2) + exp(-t/2 +
sqrt(5)*t/2)*Integral(t*exp(-sqrt(5)*t/2 + t/2)/(-5 + sqrt(5)) - sqrt(5)*t*exp(-sqrt(5)*t/2 +
t/2)/(-5 + sqrt(5)), t) + exp(-sqrt(5)*t/2 -
t/2)*Integral(-sqrt(5)*t*exp(t/2 + sqrt(5)*t/2)/5, t)]
assert constant_renumber(linodesolve(A, t, b=b), variables=[t]) == sol
# non-homogeneous term assumed to be 0
sol1 = [-C1*exp(-t/2 + sqrt(5)*t/2)/2 + sqrt(5)*C1*exp(-t/2 + sqrt(5)*t/2)/2 - sqrt(5)*C2*exp(-sqrt(5)*t/2
- t/2)/2 - C2*exp(-sqrt(5)*t/2 - t/2)/2,
C1*exp(-t/2 + sqrt(5)*t/2) + C2*exp(-sqrt(5)*t/2 - t/2)]
assert constant_renumber(linodesolve(A, t, type="type2"), variables=[t]) == sol1
# Testing the Errors
raises(ValueError, lambda: linodesolve(t+10, t))
raises(ValueError, lambda: linodesolve(a*t, t))
A1 = Matrix([[1, t], [-t, 1]])
B1, _ = _is_commutative_anti_derivative(A1, t)
raises(NonSquareMatrixError, lambda: linodesolve(A1[:, :1], t, B=B1))
raises(ValueError, lambda: linodesolve(A1, t, B=1))
A2 = Matrix([[t, t, t], [t, t, t], [t, t, t]])
B2, _ = _is_commutative_anti_derivative(A2, t)
raises(NonSquareMatrixError, lambda: linodesolve(A2, t, B=B2[:2, :]))
raises(ValueError, lambda: linodesolve(A2, t, B=2))
raises(ValueError, lambda: linodesolve(A2, t, B=B2, type="type31"))
raises(ValueError, lambda: linodesolve(A1, t, B=B2))
raises(ValueError, lambda: linodesolve(A2, t, B=B1))
# Testing auto functionality
func = [f(t), g(t)]
eq = [Eq(f(t).diff(t), f(t) + t*g(t)), Eq(g(t).diff(t), -t*f(t) + g(t))]
ceq = canonical_odes(eq, func, t)
(A1, A0), b = linear_ode_to_matrix(ceq[0], func, t, 1)
A = A0
sol = [(C1/2 - I*C2/2)*exp(I*t**2/2 + t) + (C1/2 + I*C2/2)*exp(-I*t**2/2 + t),
(-I*C1/2 + C2/2)*exp(-I*t**2/2 + t) + (I*C1/2 + C2/2)*exp(I*t**2/2 + t)]
assert constant_renumber(linodesolve(A, t), variables=Tuple(*eq).free_symbols) == sol
assert constant_renumber(linodesolve(A, t, type="type3"), variables=Tuple(*eq).free_symbols) == sol
A1 = Matrix([[t, 1], [t, -1]])
raises(NotImplementedError, lambda: linodesolve(A1, t))
# Testing the Errors
raises(ValueError, lambda: linodesolve(t+10, t, b=Matrix([t+1])))
raises(ValueError, lambda: linodesolve(a*t, t, b=Matrix([log(t) + sin(t)])))
raises(ValueError, lambda: linodesolve(Matrix([7*t]), t, b=t**2))
raises(ValueError, lambda: linodesolve(Matrix([a + 10*log(t)]), t, b=log(t)*cos(t)))
raises(ValueError, lambda: linodesolve(7*t, t, b=t**2))
raises(ValueError, lambda: linodesolve(a*t**2, t, b=log(t) + sin(t)))
A1 = Matrix([[1, t], [-t, 1]])
b1 = Matrix([t, t ** 2])
B1, _ = _is_commutative_anti_derivative(A1, t)
raises(NonSquareMatrixError, lambda: linodesolve(A1[:, :1], t, b=b1))
A2 = Matrix([[t, t, t], [t, t, t], [t, t, t]])
b2 = Matrix([t, 1, t**2])
B2, _ = _is_commutative_anti_derivative(A2, t)
raises(NonSquareMatrixError, lambda: linodesolve(A2[:2, :], t, b=b2))
raises(ValueError, lambda: linodesolve(A1, t, b=b2))
raises(ValueError, lambda: linodesolve(A2, t, b=b1))
raises(ValueError, lambda: linodesolve(A1, t, b=b1, B=B2))
raises(ValueError, lambda: linodesolve(A2, t, b=b2, B=B1))
# Testing auto functionality
func = [f(x), g(x), h(x)]
eq = [Eq(f(x).diff(x), x*(f(x) + g(x) + h(x)) + x),
Eq(g(x).diff(x), x*(f(x) + g(x) + h(x)) + x),
Eq(h(x).diff(x), x*(f(x) + g(x) + h(x)) + 1)]
ceq = canonical_odes(eq, func, x)
(A1, A0), b = linear_ode_to_matrix(ceq[0], func, x, 1)
A = A0
_x1 = exp(-3*x**2/2)
_x2 = exp(3*x**2/2)
_x3 = Integral(2*_x1*x/3 + _x1/3 + x/3 - Rational(1, 3), x)
_x4 = 2*_x2*_x3/3
_x5 = Integral(2*_x1*x/3 + _x1/3 - 2*x/3 + Rational(2, 3), x)
sol = [
C1*_x2/3 - C1/3 + C2*_x2/3 - C2/3 + C3*_x2/3 + 2*C3/3 + _x2*_x5/3 + _x3/3 + _x4 - _x5/3,
C1*_x2/3 + 2*C1/3 + C2*_x2/3 - C2/3 + C3*_x2/3 - C3/3 + _x2*_x5/3 + _x3/3 + _x4 - _x5/3,
C1*_x2/3 - C1/3 + C2*_x2/3 + 2*C2/3 + C3*_x2/3 - C3/3 + _x2*_x5/3 - 2*_x3/3 + _x4 + 2*_x5/3,
]
assert constant_renumber(linodesolve(A, x, b=b), variables=Tuple(*eq).free_symbols) == sol
assert constant_renumber(linodesolve(A, x, b=b, type="type4"),
variables=Tuple(*eq).free_symbols) == sol
A1 = Matrix([[t, 1], [t, -1]])
raises(NotImplementedError, lambda: linodesolve(A1, t, b=b1))
# non-homogeneous term not passed
sol1 = [-C1/3 - C2/3 + 2*C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2), 2*C1/3 - C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2),
-C1/3 + 2*C2/3 - C3/3 + (C1/3 + C2/3 + C3/3)*exp(3*x**2/2)]
assert constant_renumber(linodesolve(A, x, type="type4", doit=True), variables=Tuple(*eq).free_symbols) == sol1
@slow
def test_linear_3eq_order1_type4_slow():
x, y, z = symbols('x, y, z', cls=Function)
t = Symbol('t')
f = t ** 3 + log(t)
g = t ** 2 + sin(t)
eq1 = (Eq(diff(x(t), t), (4 * f + g) * x(t) - f * y(t) - 2 * f * z(t)),
Eq(diff(y(t), t), 2 * f * x(t) + (f + g) * y(t) - 2 * f * z(t)), Eq(diff(z(t), t), 5 * f * x(t) + f * y(
t) + (-3 * f + g) * z(t)))
with dotprodsimp(True):
dsolve(eq1)
@slow
def test_linear_neq_order1_type2_slow1():
i, r1, c1, r2, c2, t = symbols('i, r1, c1, r2, c2, t')
x1 = Function('x1')
x2 = Function('x2')
eq1 = r1*c1*Derivative(x1(t), t) + x1(t) - x2(t) - r1*i
eq2 = r2*c1*Derivative(x1(t), t) + r2*c2*Derivative(x2(t), t) + x2(t) - r2*i
eq = [eq1, eq2]
# XXX: Solution is too complicated
[sol] = dsolve_system(eq, simplify=False, doit=False)
assert checksysodesol(eq, sol) == (True, [0, 0])
# Regression test case for issue #9204
# https://github.com/sympy/sympy/issues/9204
@slow
def test_linear_new_order1_type2_de_lorentz_slow_check():
if ON_CI:
skip("Too slow for CI.")
m = Symbol("m", real=True)
q = Symbol("q", real=True)
t = Symbol("t", real=True)
e1, e2, e3 = symbols("e1:4", real=True)
b1, b2, b3 = symbols("b1:4", real=True)
v1, v2, v3 = symbols("v1:4", cls=Function, real=True)
eqs = [
-e1*q + m*Derivative(v1(t), t) - q*(-b2*v3(t) + b3*v2(t)),
-e2*q + m*Derivative(v2(t), t) - q*(b1*v3(t) - b3*v1(t)),
-e3*q + m*Derivative(v3(t), t) - q*(-b1*v2(t) + b2*v1(t))
]
sol = dsolve(eqs)
assert checksysodesol(eqs, sol) == (True, [0, 0, 0])
# Regression test case for issue #14001
# https://github.com/sympy/sympy/issues/14001
@slow
def test_linear_neq_order1_type2_slow_check():
RC, t, C, Vs, L, R1, V0, I0 = symbols("RC t C Vs L R1 V0 I0")
V = Function("V")
I = Function("I")
system = [Eq(V(t).diff(t), -1/RC*V(t) + I(t)/C), Eq(I(t).diff(t), -R1/L*I(t) - 1/L*V(t) + Vs/L)]
[sol] = dsolve_system(system, simplify=False, doit=False)
assert checksysodesol(system, sol) == (True, [0, 0])
def _linear_3eq_order1_type4_long():
x, y, z = symbols('x, y, z', cls=Function)
t = Symbol('t')
f = t ** 3 + log(t)
g = t ** 2 + sin(t)
eq1 = (Eq(diff(x(t), t), (4*f + g)*x(t) - f*y(t) - 2*f*z(t)),
Eq(diff(y(t), t), 2*f*x(t) + (f + g)*y(t) - 2*f*z(t)), Eq(diff(z(t), t), 5*f*x(t) + f*y(
t) + (-3*f + g)*z(t)))
dsolve_sol = dsolve(eq1)
dsolve_sol1 = [_simpsol(sol) for sol in dsolve_sol]
x_1 = sqrt(-t**6 - 8*t**3*log(t) + 8*t**3 - 16*log(t)**2 + 32*log(t) - 16)
x_2 = sqrt(3)
x_3 = 8324372644*C1*x_1*x_2 + 4162186322*C2*x_1*x_2 - 8324372644*C3*x_1*x_2
x_4 = 1 / (1903457163*t**3 + 3825881643*x_1*x_2 + 7613828652*log(t) - 7613828652)
x_5 = exp(t**3/3 + t*x_1*x_2/4 - cos(t))
x_6 = exp(t**3/3 - t*x_1*x_2/4 - cos(t))
x_7 = exp(t**4/2 + t**3/3 + 2*t*log(t) - 2*t - cos(t))
x_8 = 91238*C1*x_1*x_2 + 91238*C2*x_1*x_2 - 91238*C3*x_1*x_2
x_9 = 1 / (66049*t**3 - 50629*x_1*x_2 + 264196*log(t) - 264196)
x_10 = 50629 * C1 / 25189 + 37909*C2/25189 - 50629*C3/25189 - x_3*x_4
x_11 = -50629*C1/25189 - 12720*C2/25189 + 50629*C3/25189 + x_3*x_4
sol = [Eq(x(t), x_10*x_5 + x_11*x_6 + x_7*(C1 - C2)), Eq(y(t), x_10*x_5 + x_11*x_6), Eq(z(t), x_5*(
-424*C1/257 - 167*C2/257 + 424*C3/257 - x_8*x_9) + x_6*(167*C1/257 + 424*C2/257 -
167*C3/257 + x_8*x_9) + x_7*(C1 - C2))]
assert dsolve_sol1 == sol
assert checksysodesol(eq1, dsolve_sol1) == (True, [0, 0, 0])
@slow
def test_neq_order1_type4_slow_check1():
f, g = symbols("f g", cls=Function)
x = symbols("x")
eqs = [Eq(diff(f(x), x), x*f(x) + x**2*g(x) + x),
Eq(diff(g(x), x), 2*x**2*f(x) + (x + 3*x**2)*g(x) + 1)]
sol = dsolve(eqs)
assert checksysodesol(eqs, sol) == (True, [0, 0])
@slow
def test_neq_order1_type4_slow_check2():
f, g, h = symbols("f, g, h", cls=Function)
x = Symbol("x")
eqs = [
Eq(Derivative(f(x), x), x*h(x) + f(x) + g(x) + 1),
Eq(Derivative(g(x), x), x*g(x) + f(x) + h(x) + 10),
Eq(Derivative(h(x), x), x*f(x) + x + g(x) + h(x))
]
with dotprodsimp(True):
sol = dsolve(eqs)
assert checksysodesol(eqs, sol) == (True, [0, 0, 0])
def _neq_order1_type4_slow3():
f, g = symbols("f g", cls=Function)
x = symbols("x")
eqs = [
Eq(Derivative(f(x), x), x*f(x) + g(x) + sin(x)),
Eq(Derivative(g(x), x), x**2 + x*g(x) - f(x))
]
sol = [
Eq(f(x), (C1/2 - I*C2/2 - I*Integral(x**2*exp(-x**2/2 - I*x)/2 +
x**2*exp(-x**2/2 + I*x)/2 + I*exp(-x**2/2 - I*x)*sin(x)/2 -
I*exp(-x**2/2 + I*x)*sin(x)/2, x)/2 + Integral(-I*x**2*exp(-x**2/2
- I*x)/2 + I*x**2*exp(-x**2/2 + I*x)/2 + exp(-x**2/2 -
I*x)*sin(x)/2 + exp(-x**2/2 + I*x)*sin(x)/2, x)/2)*exp(x**2/2 +
I*x) + (C1/2 + I*C2/2 + I*Integral(x**2*exp(-x**2/2 - I*x)/2 +
x**2*exp(-x**2/2 + I*x)/2 + I*exp(-x**2/2 - I*x)*sin(x)/2 -
I*exp(-x**2/2 + I*x)*sin(x)/2, x)/2 + Integral(-I*x**2*exp(-x**2/2
- I*x)/2 + I*x**2*exp(-x**2/2 + I*x)/2 + exp(-x**2/2 -
I*x)*sin(x)/2 + exp(-x**2/2 + I*x)*sin(x)/2, x)/2)*exp(x**2/2 -
I*x)),
Eq(g(x), (-I*C1/2 + C2/2 + Integral(x**2*exp(-x**2/2 - I*x)/2 +
x**2*exp(-x**2/2 + I*x)/2 + I*exp(-x**2/2 - I*x)*sin(x)/2 -
I*exp(-x**2/2 + I*x)*sin(x)/2, x)/2 -
I*Integral(-I*x**2*exp(-x**2/2 - I*x)/2 + I*x**2*exp(-x**2/2 +
I*x)/2 + exp(-x**2/2 - I*x)*sin(x)/2 + exp(-x**2/2 +
I*x)*sin(x)/2, x)/2)*exp(x**2/2 - I*x) + (I*C1/2 + C2/2 +
Integral(x**2*exp(-x**2/2 - I*x)/2 + x**2*exp(-x**2/2 + I*x)/2 +
I*exp(-x**2/2 - I*x)*sin(x)/2 - I*exp(-x**2/2 + I*x)*sin(x)/2,
x)/2 + I*Integral(-I*x**2*exp(-x**2/2 - I*x)/2 +
I*x**2*exp(-x**2/2 + I*x)/2 + exp(-x**2/2 - I*x)*sin(x)/2 +
exp(-x**2/2 + I*x)*sin(x)/2, x)/2)*exp(x**2/2 + I*x))
]
return eqs, sol
def test_neq_order1_type4_slow3():
eqs, sol = _neq_order1_type4_slow3()
assert dsolve_system(eqs, simplify=False, doit=False) == [sol]
# XXX: dsolve gives an error in integration:
# assert dsolve(eqs) == sol
# https://github.com/sympy/sympy/issues/20155
@slow
def test_neq_order1_type4_slow_check3():
eqs, sol = _neq_order1_type4_slow3()
assert checksysodesol(eqs, sol) == (True, [0, 0])
@XFAIL
@slow
def test_linear_3eq_order1_type4_long_dsolve_slow_xfail():
if ON_CI:
skip("Too slow for CI.")
eq, sol = _linear_3eq_order1_type4_long()
dsolve_sol = dsolve(eq)
dsolve_sol1 = [_simpsol(sol) for sol in dsolve_sol]
assert dsolve_sol1 == sol
@slow
def test_linear_3eq_order1_type4_long_dsolve_dotprodsimp():
if ON_CI:
skip("Too slow for CI.")
eq, sol = _linear_3eq_order1_type4_long()
# XXX: Only works with dotprodsimp see
# test_linear_3eq_order1_type4_long_dsolve_slow_xfail which is too slow
with dotprodsimp(True):
dsolve_sol = dsolve(eq)
dsolve_sol1 = [_simpsol(sol) for sol in dsolve_sol]
assert dsolve_sol1 == sol
@slow
def test_linear_3eq_order1_type4_long_check():
if ON_CI:
skip("Too slow for CI.")
eq, sol = _linear_3eq_order1_type4_long()
assert checksysodesol(eq, sol) == (True, [0, 0, 0])
def test_dsolve_system():
f, g = symbols("f g", cls=Function)
x = symbols("x")
eqs = [Eq(f(x).diff(x), f(x) + g(x)), Eq(g(x).diff(x), f(x) + g(x))]
funcs = [f(x), g(x)]
sol = [[Eq(f(x), -C1 + C2*exp(2*x)), Eq(g(x), C1 + C2*exp(2*x))]]
assert dsolve_system(eqs, funcs=funcs, t=x, doit=True) == sol
raises(ValueError, lambda: dsolve_system(1))
raises(ValueError, lambda: dsolve_system(eqs, 1))
raises(ValueError, lambda: dsolve_system(eqs, funcs, 1))
raises(ValueError, lambda: dsolve_system(eqs, funcs[:1], x))
eq = (Eq(f(x).diff(x), 12 * f(x) - 6 * g(x)), Eq(g(x).diff(x) ** 2, 11 * f(x) + 3 * g(x)))
raises(NotImplementedError, lambda: dsolve_system(eq) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, funcs=[f(x), g(x)]) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, funcs=[f(x), g(x)], t=x) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, funcs=[f(x), g(x)], t=x, ics={f(0): 1, g(0): 1}) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, t=x, ics={f(0): 1, g(0): 1}) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, ics={f(0): 1, g(0): 1}) == ([], []))
raises(NotImplementedError, lambda: dsolve_system(eq, funcs=[f(x), g(x)], ics={f(0): 1, g(0): 1}) == ([], []))
def test_dsolve():
f, g = symbols('f g', cls=Function)
x, y = symbols('x y')
eqs = [f(x).diff(x) - x, f(x).diff(x) + x]
with raises(ValueError):
dsolve(eqs)
eqs = [f(x, y).diff(x)]
with raises(ValueError):
dsolve(eqs)
eqs = [f(x, y).diff(x)+g(x).diff(x), g(x).diff(x)]
with raises(ValueError):
dsolve(eqs)
@slow
def test_higher_order1_slow1():
x, y = symbols("x y", cls=Function)
t = symbols("t")
eq = [
Eq(diff(x(t),t,t), (log(t)+t**2)*diff(x(t),t)+(log(t)+t**2)*3*diff(y(t),t)),
Eq(diff(y(t),t,t), (log(t)+t**2)*2*diff(x(t),t)+(log(t)+t**2)*9*diff(y(t),t))
]
sol, = dsolve_system(eq, simplify=False, doit=False)
# The solution is too long to write out explicitly and checkodesol is too
# slow so we test for particular values of t:
for e in eq:
res = (e.lhs - e.rhs).subs({sol[0].lhs:sol[0].rhs, sol[1].lhs:sol[1].rhs})
res = res.subs({d: d.doit(deep=False) for d in res.atoms(Derivative)})
assert ratsimp(res.subs(t, 1)) == 0
def test_second_order_type2_slow1():
x, y, z = symbols('x, y, z', cls=Function)
t, l = symbols('t, l')
eqs1 = [Eq(Derivative(x(t), (t, 2)), t*(2*x(t) + y(t))),
Eq(Derivative(y(t), (t, 2)), t*(-x(t) + 2*y(t)))]
sol1 = [Eq(x(t), I*C1*airyai(t*(2 - I)**(S(1)/3)) + I*C2*airybi(t*(2 - I)**(S(1)/3)) - I*C3*airyai(t*(2 +
I)**(S(1)/3)) - I*C4*airybi(t*(2 + I)**(S(1)/3))),
Eq(y(t), C1*airyai(t*(2 - I)**(S(1)/3)) + C2*airybi(t*(2 - I)**(S(1)/3)) + C3*airyai(t*(2 + I)**(S(1)/3)) +
C4*airybi(t*(2 + I)**(S(1)/3)))]
assert dsolve(eqs1) == sol1
assert checksysodesol(eqs1, sol1) == (True, [0, 0])
@slow
@XFAIL
def test_nonlinear_3eq_order1_type1():
if ON_CI:
skip("Too slow for CI.")
a, b, c = symbols('a b c')
eqs = [
a * f(x).diff(x) - (b - c) * g(x) * h(x),
b * g(x).diff(x) - (c - a) * h(x) * f(x),
c * h(x).diff(x) - (a - b) * f(x) * g(x),
]
assert dsolve(eqs) # NotImplementedError
@XFAIL
def test_nonlinear_3eq_order1_type4():
eqs = [
Eq(f(x).diff(x), (2*h(x)*g(x) - 3*g(x)*h(x))),
Eq(g(x).diff(x), (4*f(x)*h(x) - 2*h(x)*f(x))),
Eq(h(x).diff(x), (3*g(x)*f(x) - 4*f(x)*g(x))),
]
dsolve(eqs) # KeyError when matching
# sol = ?
# assert dsolve_sol == sol
# assert checksysodesol(eqs, dsolve_sol) == (True, [0, 0, 0])
@slow
@XFAIL
def test_nonlinear_3eq_order1_type3():
if ON_CI:
skip("Too slow for CI.")
eqs = [
Eq(f(x).diff(x), (2*f(x)**2 - 3 )),
Eq(g(x).diff(x), (4 - 2*h(x) )),
Eq(h(x).diff(x), (3*h(x) - 4*f(x)**2)),
]
dsolve(eqs) # Not sure if this finishes...
# sol = ?
# assert dsolve_sol == sol
# assert checksysodesol(eqs, dsolve_sol) == (True, [0, 0, 0])
@XFAIL
def test_nonlinear_3eq_order1_type5():
eqs = [
Eq(f(x).diff(x), f(x)*(2*f(x) - 3*g(x))),
Eq(g(x).diff(x), g(x)*(4*g(x) - 2*h(x))),
Eq(h(x).diff(x), h(x)*(3*h(x) - 4*f(x))),
]
dsolve(eqs) # KeyError
# sol = ?
# assert dsolve_sol == sol
# assert checksysodesol(eqs, dsolve_sol) == (True, [0, 0, 0])
def test_linear_2eq_order1():
x, y, z = symbols('x, y, z', cls=Function)
k, l, m, n = symbols('k, l, m, n', Integer=True)
t = Symbol('t')
x0, y0 = symbols('x0, y0', cls=Function)
eq1 = (Eq(diff(x(t),t), x(t) + y(t) + 9), Eq(diff(y(t),t), 2*x(t) + 5*y(t) + 23))
sol1 = [Eq(x(t), C1*exp(t*(sqrt(6) + 3)) + C2*exp(t*(-sqrt(6) + 3)) - Rational(22, 3)), \
Eq(y(t), C1*(2 + sqrt(6))*exp(t*(sqrt(6) + 3)) + C2*(-sqrt(6) + 2)*exp(t*(-sqrt(6) + 3)) - Rational(5, 3))]
assert checksysodesol(eq1, sol1) == (True, [0, 0])
eq2 = (Eq(diff(x(t),t), x(t) + y(t) + 81), Eq(diff(y(t),t), -2*x(t) + y(t) + 23))
sol2 = [Eq(x(t), (C1*cos(sqrt(2)*t) + C2*sin(sqrt(2)*t))*exp(t) - Rational(58, 3)), \
Eq(y(t), (-sqrt(2)*C1*sin(sqrt(2)*t) + sqrt(2)*C2*cos(sqrt(2)*t))*exp(t) - Rational(185, 3))]
assert checksysodesol(eq2, sol2) == (True, [0, 0])
eq3 = (Eq(diff(x(t),t), 5*t*x(t) + 2*y(t)), Eq(diff(y(t),t), 2*x(t) + 5*t*y(t)))
sol3 = [Eq(x(t), (C1*exp(2*t) + C2*exp(-2*t))*exp(Rational(5, 2)*t**2)), \
Eq(y(t), (C1*exp(2*t) - C2*exp(-2*t))*exp(Rational(5, 2)*t**2))]
assert checksysodesol(eq3, sol3) == (True, [0, 0])
eq4 = (Eq(diff(x(t),t), 5*t*x(t) + t**2*y(t)), Eq(diff(y(t),t), -t**2*x(t) + 5*t*y(t)))
sol4 = [Eq(x(t), (C1*cos((t**3)/3) + C2*sin((t**3)/3))*exp(Rational(5, 2)*t**2)), \
Eq(y(t), (-C1*sin((t**3)/3) + C2*cos((t**3)/3))*exp(Rational(5, 2)*t**2))]
assert checksysodesol(eq4, sol4) == (True, [0, 0])
eq5 = (Eq(diff(x(t),t), 5*t*x(t) + t**2*y(t)), Eq(diff(y(t),t), -t**2*x(t) + (5*t+9*t**2)*y(t)))
sol5 = [Eq(x(t), (C1*exp((sqrt(77)/2 + Rational(9, 2))*(t**3)/3) + \
C2*exp((-sqrt(77)/2 + Rational(9, 2))*(t**3)/3))*exp(Rational(5, 2)*t**2)), \
Eq(y(t), (C1*(sqrt(77)/2 + Rational(9, 2))*exp((sqrt(77)/2 + Rational(9, 2))*(t**3)/3) + \
C2*(-sqrt(77)/2 + Rational(9, 2))*exp((-sqrt(77)/2 + Rational(9, 2))*(t**3)/3))*exp(Rational(5, 2)*t**2))]
assert checksysodesol(eq5, sol5) == (True, [0, 0])
eq6 = (Eq(diff(x(t),t), 5*t*x(t) + t**2*y(t)), Eq(diff(y(t),t), (1-t**2)*x(t) + (5*t+9*t**2)*y(t)))
sol6 = [Eq(x(t), C1*x0(t) + C2*x0(t)*Integral(t**2*exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)**2, t)), \
Eq(y(t), C1*y0(t) + C2*(y0(t)*Integral(t**2*exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)**2, t) + \
exp(Integral(5*t, t))*exp(Integral(9*t**2 + 5*t, t))/x0(t)))]
s = dsolve(eq6)
assert s == sol6 # too complicated to test with subs and simplify
# assert checksysodesol(eq10, sol10) == (True, [0, 0]) # this one fails
def test_nonlinear_2eq_order1():
x, y, z = symbols('x, y, z', cls=Function)
t = Symbol('t')
eq1 = (Eq(diff(x(t),t),x(t)*y(t)**3), Eq(diff(y(t),t),y(t)**5))
sol1 = [
Eq(x(t), C1*exp((-1/(4*C2 + 4*t))**(Rational(-1, 4)))),
Eq(y(t), -(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), C1*exp(-1/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), (-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), C1*exp(-I/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), -I*(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), C1*exp(I/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), I*(-1/(4*C2 + 4*t))**Rational(1, 4))]
assert dsolve(eq1) == sol1
assert checksysodesol(eq1, sol1) == (True, [0, 0])
eq2 = (Eq(diff(x(t),t), exp(3*x(t))*y(t)**3),Eq(diff(y(t),t), y(t)**5))
sol2 = [
Eq(x(t), -log(C1 - 3/(-1/(4*C2 + 4*t))**Rational(1, 4))/3),
Eq(y(t), -(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), -log(C1 + 3/(-1/(4*C2 + 4*t))**Rational(1, 4))/3),
Eq(y(t), (-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), -log(C1 + 3*I/(-1/(4*C2 + 4*t))**Rational(1, 4))/3),
Eq(y(t), -I*(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), -log(C1 - 3*I/(-1/(4*C2 + 4*t))**Rational(1, 4))/3),
Eq(y(t), I*(-1/(4*C2 + 4*t))**Rational(1, 4))]
assert dsolve(eq2) == sol2
assert checksysodesol(eq2, sol2) == (True, [0, 0])
eq3 = (Eq(diff(x(t),t), y(t)*x(t)), Eq(diff(y(t),t), x(t)**3))
tt = Rational(2, 3)
sol3 = [
Eq(x(t), 6**tt/(6*(-sinh(sqrt(C1)*(C2 + t)/2)/sqrt(C1))**tt)),
Eq(y(t), sqrt(C1 + C1/sinh(sqrt(C1)*(C2 + t)/2)**2)/3)]
assert dsolve(eq3) == sol3
# FIXME: assert checksysodesol(eq3, sol3) == (True, [0, 0])
eq4 = (Eq(diff(x(t),t),x(t)*y(t)*sin(t)**2), Eq(diff(y(t),t),y(t)**2*sin(t)**2))
sol4 = {Eq(x(t), -2*exp(C1)/(C2*exp(C1) + t - sin(2*t)/2)), Eq(y(t), -2/(C1 + t - sin(2*t)/2))}
assert dsolve(eq4) == sol4
# FIXME: assert checksysodesol(eq4, sol4) == (True, [0, 0])
eq5 = (Eq(x(t),t*diff(x(t),t)+diff(x(t),t)*diff(y(t),t)), Eq(y(t),t*diff(y(t),t)+diff(y(t),t)**2))
sol5 = {Eq(x(t), C1*C2 + C1*t), Eq(y(t), C2**2 + C2*t)}
assert dsolve(eq5) == sol5
assert checksysodesol(eq5, sol5) == (True, [0, 0])
eq6 = (Eq(diff(x(t),t),x(t)**2*y(t)**3), Eq(diff(y(t),t),y(t)**5))
sol6 = [
Eq(x(t), 1/(C1 - 1/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), -(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), 1/(C1 + (-1/(4*C2 + 4*t))**(Rational(-1, 4)))),
Eq(y(t), (-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), 1/(C1 + I/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), -I*(-1/(4*C2 + 4*t))**Rational(1, 4)),
Eq(x(t), 1/(C1 - I/(-1/(4*C2 + 4*t))**Rational(1, 4))),
Eq(y(t), I*(-1/(4*C2 + 4*t))**Rational(1, 4))]
assert dsolve(eq6) == sol6
assert checksysodesol(eq6, sol6) == (True, [0, 0])
@slow
def test_nonlinear_3eq_order1():
x, y, z = symbols('x, y, z', cls=Function)
t, u = symbols('t u')
eq1 = (4*diff(x(t),t) + 2*y(t)*z(t), 3*diff(y(t),t) - z(t)*x(t), 5*diff(z(t),t) - x(t)*y(t))
sol1 = [Eq(4*Integral(1/(sqrt(-4*u**2 - 3*C1 + C2)*sqrt(-4*u**2 + 5*C1 - C2)), (u, x(t))),
C3 - sqrt(15)*t/15), Eq(3*Integral(1/(sqrt(-6*u**2 - C1 + 5*C2)*sqrt(3*u**2 + C1 - 4*C2)),
(u, y(t))), C3 + sqrt(5)*t/10), Eq(5*Integral(1/(sqrt(-10*u**2 - 3*C1 + C2)*
sqrt(5*u**2 + 4*C1 - C2)), (u, z(t))), C3 + sqrt(3)*t/6)]
assert [i.dummy_eq(j) for i, j in zip(dsolve(eq1), sol1)]
# FIXME: assert checksysodesol(eq1, sol1) == (True, [0, 0, 0])
eq2 = (4*diff(x(t),t) + 2*y(t)*z(t)*sin(t), 3*diff(y(t),t) - z(t)*x(t)*sin(t), 5*diff(z(t),t) - x(t)*y(t)*sin(t))
sol2 = [Eq(3*Integral(1/(sqrt(-6*u**2 - C1 + 5*C2)*sqrt(3*u**2 + C1 - 4*C2)), (u, x(t))), C3 +
sqrt(5)*cos(t)/10), Eq(4*Integral(1/(sqrt(-4*u**2 - 3*C1 + C2)*sqrt(-4*u**2 + 5*C1 - C2)),
(u, y(t))), C3 - sqrt(15)*cos(t)/15), Eq(5*Integral(1/(sqrt(-10*u**2 - 3*C1 + C2)*
sqrt(5*u**2 + 4*C1 - C2)), (u, z(t))), C3 + sqrt(3)*cos(t)/6)]
assert [i.dummy_eq(j) for i, j in zip(dsolve(eq2), sol2)]
# FIXME: assert checksysodesol(eq2, sol2) == (True, [0, 0, 0])
def test_C1_function_9239():
t = Symbol('t')
C1 = Function('C1')
C2 = Function('C2')
C3 = Symbol('C3')
C4 = Symbol('C4')
eq = (Eq(diff(C1(t), t), 9*C2(t)), Eq(diff(C2(t), t), 12*C1(t)))
sol = [Eq(C1(t), 9*C3*exp(6*sqrt(3)*t) + 9*C4*exp(-6*sqrt(3)*t)),
Eq(C2(t), 6*sqrt(3)*C3*exp(6*sqrt(3)*t) - 6*sqrt(3)*C4*exp(-6*sqrt(3)*t))]
assert checksysodesol(eq, sol) == (True, [0, 0])
def test_dsolve_linsystem_symbol():
eps = Symbol('epsilon', positive=True)
eq1 = (Eq(diff(f(x), x), -eps*g(x)), Eq(diff(g(x), x), eps*f(x)))
sol1 = [Eq(f(x), -C1*eps*cos(eps*x) - C2*eps*sin(eps*x)),
Eq(g(x), -C1*eps*sin(eps*x) + C2*eps*cos(eps*x))]
assert checksysodesol(eq1, sol1) == (True, [0, 0])