Метод Рунге-Кутта 4 порядка для уравнений n-го порядка - C (СИ)
Формулировка задачи:
Здравствуйте.
Задание: Написать метод Рунге-Кутта 4 порядка для уравнений n-го порядка.
Я написал программу для уравнений 2-го порядка. Вроде правильно. А как написать для n-го порядка додуматься не могу. Может есть знающие люди?
Так же буду рад любой объективной критике по текущему коду.
#include <stdio.h>
#include <conio.h>
#include <locale.h>
float f(float x, float y, float y1);
void raschet(float x, float y, float y1, float xn, int n);
int main()
{
setlocale(LC_ALL,"rus");
int n;
float x, y, y1, xn;
printf ("x = "); scanf("%f",&x);
printf ("y = "); scanf("%f",&y);
printf ("y'= "); scanf("%f",&y1);
printf ("Кол-во шагов интегрирования = "); scanf("%i",&n);
printf ("Конечный x = "); scanf("%f",&xn);
raschet(x,y,y1,xn,n);
return 0;
}
float f(float x, float y, float y1)
{
return x-2*y+y1;
}
void raschet(float x, float y, float y1, float xn, int n)
{
int i;
float h;
// float k1, k2,k3,k4, l1,l2,l3,l4;
h=(xn-x)/n;
for (i=1; i<=n;i++)
{
/*
k1=f(x,y,y1);
l1=y1;
k2=f(x+0.5*h,y+0.5*h*k1,y1+0.5*h*l1);
l2=y1+0.5*h*l1;
k3=f(x+0.5*h,y+0.5*h*k2,y1+0.5*h*l2);
l3=y1+0.5*h*l2;
k4=f(x+h,y+h*k3,y1+h*l3);
l4=y1+h*l3;
y=y+h*(k1+2*k2+2*k3+k4)/6;
y1=y1+h*(l1+2*l2+2*l3+l4)/6;
x=x+h;
*/
//Всё это можно подставить в последнее уравнение, и записать в одну строчку. Тогда удастся избавиться от множества переменных.
y=y+h*(f(x,y,y1) + 2*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1) + 2*f(x+0.5*h,y+0.5*h*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1),y1+0.5*h*(y1+0.5*h*y1)) + f(x+h,y+h*f(x+0.5*h,y+0.5*h*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1),y1+0.5*h*(y1+0.5*h*y1)),y1+h*(y1+0.5*h*y1+0.5*h*y1)))/6;
y1=y1+h*(y1 + 2*(y1+0.5*h*y1) + 2*(y1+0.5*h*(y1+0.5*h*y1)) + (y1+h*(y1+0.5*h*(y1+0.5*h*y1))))/6;
x=x+h;
printf("\n[%i] X=%f Y=%f Y'=%f", i, x, y, y1);
}
printf("\n\nОтвет: Y = %f", y);
}Решение задачи: «Метод Рунге-Кутта 4 порядка для уравнений n-го порядка»
textual
Листинг программы
//y=y+h*(l1+2*l2+2*l3+l4)/6; //y1=y1+h*(k1+2*k2+2*k3+k4)/6; y=y+h*(y1 + 2*(y1+0.5*h*y1) + 2*(y1+0.5*h*(y1+0.5*h*y1)) + (y1+h*(y1+0.5*h*(y1+0.5*h*y1))))/6; y1=y1+h*(f(x,y,y1) + 2*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1) + 2*f(x+0.5*h,y+0.5*h*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1),y1+0.5*h*(y1+0.5*h*y1)) + f(x+h,y+h*f(x+0.5*h,y+0.5*h*f(x+0.5*h,y+0.5*h*f(x,y,y1),y1+0.5*h*y1),y1+0.5*h*(y1+0.5*h*y1)),y1+h*(y1+0.5*h*y1+0.5*h*y1)))/6;
Объяснение кода листинга программы
- Вычисление значения переменной
yс помощью метода Рунге-Кутта 4-го порядка. - Вычисление значения переменной
y1с помощью метода Рунге-Кутта 4-го порядка. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy. - Значение переменной
yиспользуется для вычисления значения переменнойy1. - Значение переменной
y1используется для вычисления значения переменнойy.