OverflowError: (34, «Результат слишком велик») для разрешения дифференциального уравнения методом Эйлера - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь решить дифференциальное уравнение для физической проблемы: падение мяча для гольфа. Я использую метод разрешения Эйлера, и у меня есть этот код:

def F(Z, t):
    res = [Z[1], (-K/m)*Z[1]*sqrt((Z[1]**2) + (Z[1]**2)), Z[3], (-K/m)*Z[3]*sqrt((Z[3]**2) + (Z[3]**2))]
    return res

def reso_z_euler(liste_t, F, CI, K):
    n = len(liste_t)
    Z = CI
    pas = (liste_t[-1] - liste_t[0])/(n-1)
    listeZ = [Z]
    for i in range(1, n):
        Z = F(Z, temps[i-1])
        listeZ.append(Z)
    return listeZ

listeZ = reso_z_euler(temps, F, Z0, K)

Когда я запускаю этот код, терминал выдает ошибку: OverflowError: (34, 'Результат слишком большой'), я никогда не видел эта ошибка, и я не знаю, что делать .. Ваша помощь была бы так хороша .. Спасибо

1 Ответ

0 голосов
/ 01 марта 2020
  • Вы используете неизвестный или нелокальный массив для времен, temps вместо liste_t

  • Вы не реализуете метод Эйлера Z = Z + pas*F(Z,liste_t[i-1]), вам придется использовать какой-то механизм для реализации векторной арифметики c, например

    Z = [ zk+pas*fk for zk, fk in zip(Z, F(Z,liste_t[i-1])) ]
    
  • Вы забыли включить гравитационную силу в вычисление производных.


В общем, метод Эйлера хорош только для изучения принципов численного интегрирования ОДУ, для любого полезного результата используйте метод более высокого порядка.

...