Проблема при использовании dsolve СимПИ для решения дифференциального уравнения критически затухающего осциллятора

#python #sympy #ode

Вопрос:

Я пытался написать программу, которая будет принимать набор значений и начальных условий для гармонического генератора, решать дифференциальное уравнение и отображать функцию phi(t).

 import sympy as sp
from matplotlib import pyplot as plt
import numpy as np

t = sp.Symbol("t")
phi = sp.Function('phi')

#Values of the oscilator
beta = 0.4
omega_0 = 0.4
f0 = 0
omega = 0

#Initial conditions
phi_0 = 3.14/4
v_phi_0 = 0

#phi''(t)   2*beta*phi'(t)   omega_0^2*phi(t) - f0*sin(omega*t) = 0
eq = sp.diff(phi(t),t,2) 2*beta*sp.diff(phi(t),t) omega_0**2*phi(t)-f0*sp.sin(omega*t)
print(sp.dsolve(eq))
equation = sp.dsolve(eq,ics={phi(0):phi_0,sp.diff(phi(t),t).subs(t,0):v_phi_0})
print(equation)
wzor = sp.lambdify(t,equation.rhs,"numpy")
xvals = np.arange(0,30,.1)
yvals = wzor(xvals)

# make figure
fig, ax = plt.subplots(1,1)
ax.plot(xvals, yvals)
ax.set_xlabel('t')
ax.set_ylabel('phi(t)')
plt.show()

 

Кажется, все работает нормально, но когда значения beta и omega_0 равны (так называемое критическое затухание) и меньше 1, программа, похоже, неправильно решает уравнение.

 Eq(phi(t), (C1*sin(3.65002571393103e-9*t)   C2*sin(3.6500259065127e-9*t)   C3*cos(3.65002571393103e-9*t)   C4*cos(3.6500259065127e-9*t))*exp(-0.4*t))
 

В других случаях, в том числе, когда beta и omega_0 равны и больше 1, есть только 2 константы C1 и C2 после решения дифференциального уравнения, но в данном случае их 4, чего не должно быть. Из-за этого программа не может продолжить и нарисовать сюжет, из-за этих 2 дополнительных констант, для которых я не могу решить.

 ax.plot(xvals, yvals)

TypeError: can't convert expression to float
 

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

 NotImplementedError: Cannot find 2 solutions to the homogeneous equation necessary to apply undetermined coefficients to 0.16*phi(t) - 5*sin(0.4*t)   0.8*Derivative(phi(t), t)   Derivative(phi(t), (t, 2)) (number of terms != order)
 

Возможно, это связано с основной проблемой, но я подумал, что об этом стоит упомянуть.

Правка 2: Другие проблемы начинают появляться, когда beta и omega_0 равны и больше 3, но также являются десятичными. Никаких проблем не возникает, когда это целые числа.

Комментарии:

1. Частоты по существу равны нулю, их ненулевые значения являются артефактами числового формата с плавающей запятой. При возмущении двойного корня можно ожидать погрешности порядка квадратных корней точности станка. То, что существует четыре корня, возможно, является следствием какой-то техники преобразования Лапласа. В символических вычислениях лучше работать только с символическими константами или рациональными числами.

Ответ №1:

Символьные вычисления и константы с плавающей запятой плохо сочетаются или вообще не сочетаются друг с другом. Одно простое исправление состоит в замене всех констант рациональными числами с использованием типа Rational данных sympy,

 #Values of the oscilator
beta = sp.Rational(2,5)
omega_0 = sp.Rational(2,5)
f0 = 0
omega = 0

#Initial conditions
phi_0 = sp.Rational(314,400)
v_phi_0 = 0
 

Только с учетом этих изменений вывод будет корректным

 Eq(phi(t), (C1   C2*t)*exp(-2*t/5))
Eq(phi(t), (157*t/500   157/200)*exp(-2*t/5))
 

и сюжет создается как

введите описание изображения здесь