Мегаобучалка Главная | О нас | Обратная связь


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



2016-09-17 866 Обсуждений (0)
Метод Рунге - Кутта 4-го порядка 0.00 из 5.00 0 оценок




Самое большое распространение из всех численных методов решения дифференциальных уравнений получил метод Рунге-Кутта 4-го порядка. В этом методе на каждом шаге интегрирования дифференциальных уравнений искомая функция y(x) аппроксимируется рядом Тейлора, содержащим члены ряда с h4:

В результате ошибка на каждом шаге имеет порядок h5.

Для сохранения членов ряда, содержащих h2,h3,h4 необходимо определить вторую y", третью y"' и четвертую y(4)производные функции y(x). Эти производные аппроксимируем разделенными разностями второго, третьего и четвертого порядков соответственно.

В результате для получения значения функции yi+1 по методу Рунге-Кутта выполняется следующая последовательность вычислительных операций:

Перейдем к реализации метода Рунге-Кутта на основе нашего класса .

public abstract class TRungeKutta : TODE

{double[] Yl, Y2, Y3, Y4; // внутренние переменные

public TRungeKutta(int N) : base(N)

{ Yl = new double[N]; Y2 = new double[N]; Y3 = new double[N]; Y4 = new double[N];}

// следующий шаг метода Рунге-Кутта, dt - шаг по времени

override public void NextStep(double dt)

{if (dt < 0) {return; }

int i;

F(T, Y, ref Yl); // рассчитать Yl

for (i = 0; i < N; i++)

{ YY[i] = Y[i] + Yl[i] * (dt / 2.0);

F(T + dt / 2.0, YY, ref Y2); // рассчитать Y2

for (i = 0; i < N; i++) {

YY[i] = Y[i] + Y2[i] * (dt / 2.0);

F(T + dt / 2.0, YY, ref Y3); // рассчитать Y3

for (i = 0; i < N; i++) { YY[i] = Y[i] + Y3[i] * dt;

F(T + dt, YY, ref Y4); // рассчитать Y4

for (i = 0; i < N; i++) {

// рассчитать решение на новом шаге

Y[i] = Y[i] + dt / 6.0 * (Yl[i] + 2.0 * Y2[i] + 2.0 * Y3[i] + Y4[i]);}

T = T + dt; // увеличить шаг

} } } } }

Теперь протестируем наши методы на примере задач Коши, описывающей гармонические колебания математического маятника. Мы решаем следующую задачу.

с начальными условиями

Эта задача имеет единственное решение - . Чтобы применить к этой задаче наши методы нужно записать ее в виде системы уравнений первого порядка.

После такой замены мы имеет следующую систему

с начальными условиями

Реализуем для нашей системы методы Эйлера и Рунге-Кутты

public class SystEuler : TEuler

{public SystEuler() : base(2) { }

public override void F(double t, double[] Y, ref double[] FY)

{FY[0] = Y[1]; FY[1] = -Y[0]; } }

public class SystRK : TRungeKutta {public SystRK() : base(2) {}

public override void F(double t, double [] Y,ref double [] FY)

{FY[0] = Y[1] ; FY[1] = -Y[0] ;}}

Напишем программу, решающую задачу Коши двумя методами

static void Main(string[] args)

{double h = 0.1;double[] Y0 = {0, 1.0};

SystEuler Euler = new SystEuler(); Euler.Setlnit(0, Y0) ;

SystRK RK = new SystRK(); RK.Setlnit(0, Y0);

double t, REuler, RRK, Sin;

while (Euler.T < (2 * Math.PI + h / 2.0)) {

t = Euler.T; REuler = Euler.Y[0]; RRK = RK.Y[0]; Sin = Math.Sin(t);

Console.WriteLine("{0} {1} {2} {3} {4} {5}", t, REuler, RRK, Sin, Math.Abs(Sin - REuler), Math.Abs(Sin - RRK));Euler.NextStep(h); RK.NextStep(h);}Console.ReadKey(); }

 

 

Пример вывода графика

Форма с кнопкой

Код события нажатия кнопки:

string Text = "Graph0";

Size ClientSize = new Size(320, 230);

Chart myChart = new Chart();

myChart.Parent = this;

myChart.Left = 10;

myChart.Top = 10;

myChart.Width = (ClientSize.Width - 20);

myChart.Height = (ClientSize.Height - 20);

 

// Область в которой будет построен график

// (Их может быть несколько)

ChartArea myChartArea = new ChartArea();

myChartArea.Name = "myChartArea";

myChart.ChartAreas.Add(myChartArea);

 

// График (Их может быть несколько)

Series mySeries1 = new Series();

mySeries1.ChartType = SeriesChartType.Spline;

mySeries1.ChartArea = "myChartArea";

myChart.Series.Add(mySeries1);

 

// Исходные данные для графика

double[] yval1 = { 5, 6, 4, 6, 3 };

string[] xval = { "Январь", "Февраль", "Март", "Апрель", "Май" };

 

mySeries1.Points.DataBindXY(xval, yval1); }

Результат вывода графика:



2016-09-17 866 Обсуждений (0)
Метод Рунге - Кутта 4-го порядка 0.00 из 5.00 0 оценок









Обсуждение в статье: Метод Рунге - Кутта 4-го порядка

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (866)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)