Математический форум Math Help Planet
http://mathhelpplanet.com/

Метод Рунге-Кутта с автоматическим шагом
http://mathhelpplanet.com/viewtopic.php?f=64&t=71434
Страница 1 из 1

Автор:  Susanna Gaybaryan [ 15 окт 2020, 16:48 ]
Заголовок сообщения:  Метод Рунге-Кутта с автоматическим шагом

Доброго времени суток) Получила задание, решить уравнение методом Рунге - Кутта 3го порядка с автоматическим выбором шага. Графики строила на python и шаг задавала сама:
import math
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

eps=10**(-3)
# начальные условия
x0 = 0
y0 = 0
# отрезок [x0, xn], где x0 = 0, xn = 1
xn = 1
# шаг
n = 5
h = (xn-x0)/n

# Метод Эйлера
f = lambda x, y: (math.cos(x)/(1.5+x))+0.1*y**2
ilist = np.arange(x0, xn+h, h)
xlist = [(x0+h) for h in ilist]
ylist = []

prevy = y0
ylist.append(y0)
print("метод Эйлера")
print(prevy)
for x in xlist:
y = prevy + h*f(x,prevy)
if (x!=1):
print(y)
prevy = y
ylist.append(prevy)


#метод Рунге-Кутта
f1 = lambda x, y: (math.cos(x)/(1.5+x))+0.1*y**2
ilist1 = np.arange(x0, xn+h, h)
xlist1 = [(x0+h) for h in ilist1]
ylist1 = []
prevy1 = y0
ylist1.append(prevy1)
print("\nметод Рунге-Кутта")
for x in xlist1:
k1=f1(x,prevy1)
k2=f1(x+h/2,prevy1+(h*k1)/2)
k3=f1(x+h,prevy1-h*k1+2*h*k2)
y1 = prevy1 + (h/6)*(k1+4*k2+k3)
if (x!=1):
prevy1 = y1
ylist1.append(prevy1)
for y in ylist1:
print(y)
# print(round(y,3))

#Точное решение
def func(y, x):
return (math.cos(x)/(1.5+x))+0.1*y**2
n=int((xn-x0)/h+1)
x = np.linspace( x0, xn, n) # точки по оси x
y0 = 0
y = odeint (func, y0, x) # решение уравнения
print("\nТочное решение:", )
y = np.array(y).flatten() #массив с элементами y_j
for k in y:
print(k)

#Графики
plt.rc('font',**{'family':'verdana'})
plt.xlabel("ось абцисс")
plt.ylabel("ось ординат")
plt.plot(xlist, ylist, "b-", label="метод Эйлера")
plt.plot(xlist1, ylist1, "y-", label="метод Рунге-Кутта",linewidth=3)
plt.plot(x, y,'g-', label="точное решение")
plt.legend()
plt.grid()
plt.show()


Помогите, пожалуйста, разобраться с автоматическим выбором шага)

Автор:  searcher [ 15 окт 2020, 17:26 ]
Заголовок сообщения:  Re: Метод Рунге-Кутта с автоматическим шагом

Susanna Gaybaryan писал(а):
Помогите, пожалуйста, разобраться с автоматическим выбором шага)

К сожалению не знаком с Питоном и в вашей программе ничего не понимаю. Выбор шага можно сделать следующим образом. На каждом шаге выполнять итерации двумя версиями алгоритмов. Скажем Рунге-Кутты 4-го порядка и 5-го. Если их результаты сильно отличаются, то мы шаг уменьшаем. Если результаты хорошо совпадают, то мы можем шаг увеличить. Детали (что такое "хорошо совпадают" и т.д.) продумайте сами. Ну, или в специальных книгах смотрите.

Автор:  lexus666 [ 15 окт 2020, 17:31 ]
Заголовок сообщения:  Re: Метод Рунге-Кутта с автоматическим шагом

Не силен в численных методах, но мне кажется, что шаг нужно выбирать по скорости изменения подынтегральной функции. Т.е. отталкиваться нужно от производной функции. Если производная мала, то шаг можно сделать побольше, в противном случае уменьшить.

Автор:  Emphatic18 [ 16 окт 2020, 06:33 ]
Заголовок сообщения:  Re: Метод Рунге-Кутта с автоматическим шагом

Susanna Gaybaryan, я думаю Вам будет полезно скачать книгу "О.Б.Арушанян, С.Ф.Залеткин, Решение систем обыкновенных дифференциальных уравнений одношаговыми методами. Учебное пособие, МГУ, 2018", в этой книге много материала как раз по вашей теме.

Для контроля точности лучше использовать так называемый контрольный член, значение которого после сравнивается с допустимой погрешностью, либо используется мера погрешности. В зависимости от результата сравнения шаг либо уменьшается, либо увеличивается. Уменьшение или увеличесние шага задается в определенных границах. Таким образом по ходу решения получается переменный шаг. Уменьшение или увеличение шага можно делать по разным схемам, в книге все есть. По ссылке можете посмотреть пример реализации такого решения для системы ОДУ методом РК 4-го порядка точности. Здесь для контроля точности вычисляется мера погрешности, причем покомпонентно т.е. для каждого уравнения системы индивидуально. Правда код на фортране (и программа немного не закончена, но она работает).

А это пример результата ее работы:
▼ результат
Решение системы ОДУ методом Рунге-Кутты 4-го порядка
с контролем точности и авт-м изменением шага

Y ( 1) = 1.3532460E-01
Y ( 2) = 1.4821969-323

Итераций = 241992
Шаг уменьшен, раз = 11
Шаг увеличен, раз = 14

Ошибки не обнаружены
------------------------


PAUSE Нажмите любую клавишу для завершения...

Автор:  Emphatic18 [ 16 окт 2020, 07:53 ]
Заголовок сообщения:  Re: Метод Рунге-Кутта с автоматическим шагом

А это решение Вашего уравнения при eps=1e-10 и начальном шаге 1e-3
▼ решение
Решение системы ОДУ методом Рунге-Кутты 4-го порядка
с контролем точности и авт-м изменением шага

Y ( 1) = 4.4822499E-01

Итераций = 667
Шаг уменьшен, раз = 0
Шаг увеличен, раз = 1

Ошибки не обнаружены
------------------------

Автор:  Emphatic18 [ 19 окт 2020, 20:18 ]
Заголовок сообщения:  Re: Метод Рунге-Кутта с автоматическим шагом

В процессе тестирования и доработки в программе исправлен ряд позиций. Боле правильный результат решения вашего уравнения. Шаговая точность принята 1e-9, начальный шаг 5е-3.

Y ( 1) =   4.4810693E-01

Итераций = 277
Шаг уменьшен, раз = 1
Шаг увеличен, раз = 0

Неявный метод трапеций на том же числе шагов дает очень близкий результат, правда шаг здесь равномерный, а у РК судя по общему числу итераций 277, шаг был изменен примерно в середине участка интегрирования.
Решение		=   4.4810684E-01
Ошибка = 0

на 1000 шагах результат тот же, но это все же метод 2-го порядка (зато по моему на том же числе шагов он дает более точный результат чем явный метод трапеций, надо бы дополнительно протестить).
Решение		=   4.4810693E-01
Ошибка = 0

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/