Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 15 окт 2020, 16:48 
Не в сети
Начинающий
Зарегистрирован:
24 дек 2019, 00:16
Сообщений: 42
Cпасибо сказано: 10
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Доброго времени суток) Получила задание, решить уравнение методом Рунге - Кутта 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()


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

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 15 окт 2020, 17:26 
Не в сети
Light & Truth
Аватара пользователя
Зарегистрирован:
15 мар 2016, 15:08
Сообщений: 7075
Cпасибо сказано: 86
Спасибо получено:
1261 раз в 1186 сообщениях
Очков репутации: 193

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

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 15 окт 2020, 17:31 
Не в сети
Beautiful Mind
Аватара пользователя
Зарегистрирован:
24 янв 2011, 11:30
Сообщений: 1664
Откуда: Мамазия
Cпасибо сказано: 124
Спасибо получено:
568 раз в 454 сообщениях
Очков репутации: 375

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 16 окт 2020, 06:33 
Не в сети
Профи
Зарегистрирован:
02 июн 2018, 08:50
Сообщений: 427
Cпасибо сказано: 13
Спасибо получено:
66 раз в 64 сообщениях
Очков репутации: 11

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

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

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

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

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

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


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

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 16 окт 2020, 07:53 
Не в сети
Профи
Зарегистрирован:
02 июн 2018, 08:50
Сообщений: 427
Cпасибо сказано: 13
Спасибо получено:
66 раз в 64 сообщениях
Очков репутации: 11

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

Y ( 1) = 4.4822499E-01

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

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Метод Рунге-Кутта с автоматическим шагом
СообщениеДобавлено: 19 окт 2020, 20:18 
Не в сети
Профи
Зарегистрирован:
02 июн 2018, 08:50
Сообщений: 427
Cпасибо сказано: 13
Спасибо получено:
66 раз в 64 сообщениях
Очков репутации: 11

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

Y ( 1) =   4.4810693E-01

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

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

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему      Страница 1 из 1 [ Сообщений: 6 ]

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Метод Рунге-Кутта

в форуме Численные методы

Merhaba

0

416

29 мар 2014, 17:05

Метод Рунге - Кутта

в форуме Численные методы

SAVANTOS

0

260

03 апр 2016, 13:51

Метод Рунге-Кутта

в форуме Численные методы

Treialent

11

900

21 дек 2013, 13:56

Метод Рунге-Кутта-Фельберга

в форуме MathCad

azdws1

0

354

21 ноя 2017, 16:53

Метод Эйлера и Рунге-Кутта

в форуме Численные методы

AscoldSemirazov

1

130

10 дек 2018, 21:04

Метод Рунге-Кутта 4-го порядка

в форуме Дифференциальное исчисление

turist22

0

337

18 ноя 2014, 14:53

Диф.уравнение. Метод Рунге-Кутта

в форуме Численные методы

crazyFlower

3

370

28 апр 2015, 19:50

Метод Рунге-Кутта и ДУ обратного маятника

в форуме Численные методы

PyyyC

0

709

23 окт 2012, 23:19

Медод Рунге-Кутта

в форуме Численные методы

Julia

3

583

12 май 2011, 12:51

Интегрирование методом Рунге-Кутта

в форуме Численные методы

denprox

2

672

24 сен 2012, 12:23


Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2020 MathHelpPlanet.com. All rights reserved