У меня вопрос о решении дифференциальных уравнений второго порядка с помощью RK4 с учетом дополнительных ограничений на первую производную. Я делаю показанный пример здесь с некоторыми изменениями
θ ′ ′ (t) + b θ ′ (t) + c sin (θ (t )) = 0
Дополнительное ограничение:
при θ i θ (i + 1) <0, тогда <em>θ ′ (i + 1) = 0,9 θ ′ i ,
где i - шаги t, i + 1 - один шаг после i. В реальном мире он говорит, что когда направление смещения меняется на противоположное, его скорость уменьшается до 90%.
Векторно, если y ( t ) = ( θ ( t ), ω ( t )), тогда уравнение будет ẏ = f ( t , y ), где f ( t , y ) = ( y ₂ ( t ), - by ₂ ( t ) - cos ( y ₁ ( t ))).
Как мне изменить код в этой задаче, если я хочу добавить ограничения на ω или θ ′ (t) (что одно и то же)? Вот мой код, который не сработал. Дополнительное условие делает θ не непрерывным. Следующее «самодельное» решение не может правильно обновить θ ′. Я новичок в Python, и это мой первый пост на StackOverflow. Приветствуются любые указания.
def rungekutta4(f, y0, t, args=()):
n = len(t)
y = np.zeros((n, len(y0)))
y[0] = y0
for i in range(n - 1):
h = t[i+1] - t[i]
if y[i][0]*y[i+1][0]<0:
k1 = f(y[i], t[i], *args)
k2 = f(y[i] + k1 * h / 2., t[i] + h / 2., *args)
k3 = f(y[i] + k2 * h / 2., t[i] + h / 2., *args)
k4 = f(y[i] + k3 * h, t[i] + h, *args)
y[i+1] = y[i] + (h / 6.) * (k1 + 2*k2 + 2*k3 + k4)*0.9
else:
k1 = f(y[i], t[i], *args)
k2 = f(y[i] + k1 * h / 2., t[i] + h / 2., *args)
k3 = f(y[i] + k2 * h / 2., t[i] + h / 2., *args)
k4 = f(y[i] + k3 * h, t[i] + h, *args)
y[i+1] = y[i] + (h / 6.) * (k1 + 2*k2 + 2*k3 + k4)
return y