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

См. также метод Эйлера на С++ и Метод Эйлера-Коши на C++

Будем рассматривать дифференциальное уравнение вида

y'=f(x,y),     (1)

где f(x,y) — заданная непрерывная функция в области D.

Задача нахождения решения этого уравнения, удовлетворяющего начальному условию

(x0)=y0,     (2)

называется задачей Коши.

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

Пусть требуется найти решение задачи Коши (1)-(2) на отрезке [a,b].

Разобьем отрезок [a,b] на n равных частей точками xi=a+i·h, где i=0,1,,n,h=ban.

Методы Эйлера и Эйлера-Коши являются частными случаями метода Рунге-Кутты. На практике наиболее распространенным является метод Рунге-Кутты четвертого порядка. Расчетные формулы этого метода имеют вид
xi+1=a+ih,
y1i+1=hf(xi,yi),
y2i+1=hf(xi+h2,yi+y1i+12),
y3i+1=hf(xi+h2,yi+y2i+12),
y4i+1=hf(xi+h,yi+y3i+1),
yi+1=yi+16(y1i+1+2y2i+1+2y3i+1+y4i+1).
Пример. Решить методом Рунге-Кутты 4-го порядка дифференциальное уравнение y'=3sin2y+x с начальным условием y(0)=2 на отрезке [0,1] с шагом h=0,1.

Решение.

//============================================================================
// Name        : runge.cpp
// Author      : 
// Version     :
// Copyright   : 
// Description : 
//============================================================================

#include <iostream>
#include <cmath>
using namespace std;

double F(double x, double y){
	return 3*sin(2*y)+x;
}

int main() {
	double a=0; double b=1; double h=0.1;
	double n=(b-a)/h;
	double X[(int)n];
	double Y1[(int)n];
	double Y2[(int)n];
	double Y3[(int)n];
	double Y4[(int)n];
	double Y[(int)n];
	//calculate
	X[0]=a; Y[0]=2;
	for(int i=1; i<=n; i++){
		X[i]=a+i*h;
		Y1[i]=h*F(X[i-1],Y[i-1]);
		Y2[i]=h*F(X[i-1]+h/2.0,Y[i-1]+Y1[i]/2.0);
		Y3[i]=h*F(X[i-1]+h/2,Y[i-1]+Y2[i]/2);
		Y4[i]=h*F(X[i-1]+h,Y[i-1]+Y3[i]);
		Y[i]=Y[i-1]+(Y1[i]+2*Y2[i]+2*Y3[i]+Y4[i])/6;
	}
	//print results
	for(int i=0; i<=n; i++){
		cout << "X["<<i<<"]="<<X[i] <<" ";
	}
	cout << endl;
	for(int i=0; i<=n; i++){
		cout << "Y["<<i<<"]="<<Y[i] << " ";
	}
	return 0;
}


См. также метод Эйлера на С++ и Метод Эйлера-Коши на C++
  • avatar
  • 0

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.