Предположим, что система описывается уравнением движения:
(Например, пружина с затухающей жесткостью.)
Я хотел бы получить соответствующее движение однако я не уверен, как решить эту проблему. Я попробовал подход WKB к первому заказу, который дает мне:
Это кажется неверным, поскольку для восстанавливающая сила приближается к нулю, и, следовательно, я ожидаю линейного -зависимость в этом пределе.
Существуют ли какие-либо другие подходящие методы, которые можно использовать для решения этого уравнения движения?
Поскольку вопрос был отложен, я поясню свои намерения ниже. Они включают в себя неявный и явный вопрос:
Примечание. Это не домашнее задание, а чистое личное любопытство.
Эту проблему можно решить, просто используя степенные ряды. Чтобы упростить запись, скажите . Тогда предположим, что решение может быть записано как:
Затем, вводя это в данное дифференциальное уравнение:
Итак, как и ожидалось, вы получаете две бесплатные константы, и , и вы можете разделить ряд на четные и нечетные члены. Делая это, вы получаете:
Выстраивая как четные, так и нечетные ряды, вы получаете:
Ряды представляют собой хорошо известные разложения по степеням синуса и косинуса, но теперь с другим параметром, поэтому результат:
Это точное решение, приближение не требуется, и в этом случае, если взять предел соответственно вы должны получить линейную зависимость от времени.
Один из способов решения проблемы — построить ряд решений, каждое из которых справедливо в диапазоне, для которого зависящую от времени часть выражения можно считать постоянной.
Это означает, что мы строим решения которые действительны на для . Решения имеют вид
Чтобы соединить решения на границах мы используем непрерывность :
Отсюда следует рекуррентное соотношение для коэффициентов для :
Эта система уравнений имеет определитель и, следовательно, имеет единственное решение. Для у нас есть и .
Теперь осталось выбрать значения для (с зафиксированный). Поскольку обязательным условием была временная зависимость быть приблизительно постоянной на соответствующих интервалах, мы можем сделать оценку через производную :
с выбранным лимитом . Отсюда получаем:
Однако это работает только для . В случае, если это не выполнено, мы можем просто выбрать постоянное значение обновления вместо этого.
за небольшую стоимость ; например:
где .
С использованием и схема постоянного обновления с мы получаем:
Код:
import matplotlib.pyplot as plt
from numpy import cos, sin, sqrt, exp, pi
import numpy as np
def xns(x0, v0, k, s, delta=0.001):
a = x0
w = sqrt(k)
b = v0 / w
def func(t):
return a*cos(w*t) + b*sin(w*t)
t = delta * s
yield t, func
while True:
v = w
w = sqrt(k) * exp(-t**2 / (2 * s**2))
a, b = np.linalg.solve([
[cos(w*t), sin(w*t)],
[-w*sin(w*t), w*cos(w*t)]],
[a*cos(v*t) + b*sin(v*t),
-a*v*sin(v*t) + b*v*cos(v*t)]
)
t += delta*s
yield t, func
x0, v0, k, s = 0.001, 0, 1, 2*pi
ts = np.linspace(0, 7*pi*sqrt(k), 1000)
xns = xns(x0, v0, k, s)
xs = []
tn, xn = next(xns)
for t in ts:
while t >= tn:
tn, xn = next(xns)
xs.append(xn(t))
xs = np.asarray(xs)
plt.figure()
plt.title(r'$\rm x_0 = {:.2f}\,[mm],\;'
r' v_0 = {:.2f}\,[mm\,s^{{-1}}],\;'
r' k = {:.2f}\,[s^{{-2}}],\;'
r'\sigma = {:.2f}\,[s]$'
.format(x0*1e3, v0*1e3, k, s))
plt.xlabel('t [s]')
plt.ylabel('x [mm]')
plt.plot(ts, xs * 1e3, '-', lw=3)
plt.grid(lw=1.5)
plt.twinx()
plt.ylabel(r'$\rm\sqrt{k}\cdot\exp\left(-t^2/2\sigma^2\right)$', color='#ff7f0e')
plt.tick_params('y', colors='#ff7f0e')
plt.plot(ts, sqrt(k) * exp(-ts**2 / (2 * s**2)), '--', color='#ff7f0e', lw=2)
plt.savefig('example.png', bbox_inches='tight', pad_zeros=0)
plt.show()
Гость