Метод Рунге-Кутта 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д