Алгоритм Рунге Кутты с использованием цикла while - PullRequest
0 голосов
/ 14 декабря 2018

В настоящее время я пытаюсь заставить работать интеграцию Runge Kutta 4, но она выводит следующее:

Runge Kutta value: inf

В то время как предполагается, что значение будет в диапазоне:

Runge Kutta value: 8.476271005220534e+16

Я использовал следующий код, но не могу вывести правильное приближение.

endtime = 5
h = 0.01

def f(x, z):
    return x*x*z


t = 0
y = 1

while t < endtime:
    k1 = f(t, y)
    k2 = f(t+(h/2), y+(k1/2))
    k3 = f(t+(h/2), y+(k2/2))
    k4 = f(t+h, y+k3)

    y = y + h*(k1 + 2*k2 + 2*k3 + k4)/6

    t = t + h

print("Runge Kutta value: " + str(y))

Есть ли кто-нибудь, кто знает, где я допустил ошибку

1 Ответ

0 голосов
/ 15 декабря 2018

ваши формулы неверны, потому что большую часть времени вы забываете умножить на h

enter image description here

и коэффициенты тоже:

enter image description here

(источник: Википедия )

так:

endtime = 5
h = 0.01

def f(x, z):
    return x*x*z

y = 1
count = 0
t = 0

for count in range(int(endtime/h)):
    t = h*count

    k1 = f(t, y)
    k2 = f(t+(h/2), y+h*(k1/2))
    k3 = f(t+(h/2), y+h*(k2/2))
    k4 = f(t+h, y+h*k3)

    y += h*(k1 + 2*k2 + 2*k3 + k4)/6

print("Runge Kutta value: " + str(y))

Также избегайте чисел с плавающей запятойнакопление путем вычисления значения t каждый раз вместо добавления фиксированного шага и обмена цикла while на цикл for.

не уверен, что он идеален, но теперь я получаю конечный результат:)

 Runge Kutta value: 1.245858162131811e+18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...