#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* Zadeklarujemy sobie nowy typ danych punkt. Posiada dwie składowe typu double:
x1 i x2. Moglibyśmy użyć tablicy dwuelementowej
*/
struct punkt{
double x1,x2;
};
/* Następująca funkcja oblicza pochodną w punkcie (prawą stronę równania). Jako parametry
przyjmuje czas t i wartość rozwiązania y(t), zwraca pochodną y'(t).
*/
struct punkt pochodna(double t, struct punkt y){
struct punkt tymcz;
tymcz.x1=y.x2;
tymcz.x2=-sin(y.x1);
return tymcz;
}
int main(){
struct punkt y,tymcz,k1,k2,k3,k4;
double czas_biezacy, czas_koncowy,krok,polkrok;
int ilosc_krokow;
printf("Program służy do numerycznego rozwiązywania równań różniczkowych\n");
printf("zwyczajnych metodą Rungego-Kutty 4 rzędu.\n\n");
printf("Czas startowy przyjmujemy jako 0.\n");
printf("Proszę podać wychylenie początkowe w radianach y(0)= ");
scanf("%lf",&(y.x1));
printf("\nTeraz proszę podać początkową prędkość kątową w radianach na sekundę y'(0)= ");
scanf("%lf",&(y.x2));
printf("\nProszę podać czas koncowy obliczeń T= ");
scanf("%lf",&czas_koncowy);
printf("\nProszę podać liczbę kroków N= ");
scanf("%d",&ilosc_krokow);
krok=czas_koncowy/ilosc_krokow;
polkrok=krok/2;
czas_biezacy=0;
for(;ilosc_krokow&>;=0;--ilosc_krokow){
printf("| %2.6lf | %2.6lf |\n",czas_biezacy,y.x1);
/* Następujące obliczenia są zapisane w sposób znacznie bardziej skomplikowany, niż
mogłyby być. Wynika to z faktu, że nie zdefiniowaliśmy mnożenia naszej struktury typu punkt
przez liczby. Musimy więc każdorazowo mnożyć "po współrzędnych".
*/
tymcz=pochodna(czas_biezacy,y);
k1.x1=polkrok*tymcz.x1;
k1.x2=polkrok*tymcz.x2;
tymcz.x1=y.x1+k1.x1;
tymcz.x2=y.x2+k1.x2;
czas_biezacy=czas_biezacy+polkrok;
tymcz=pochodna(czas_biezacy, tymcz);
k2.x1=polkrok*tymcz.x1;
k2.x2=polkrok*tymcz.x2;
tymcz.x1=y.x1+k2.x1;
tymcz.x2=y.x2+k2.x2;
tymcz=pochodna(czas_biezacy, tymcz);
k3.x1=krok*tymcz.x1;
k3.x2=krok*tymcz.x2;
czas_biezacy=czas_biezacy+polkrok;
tymcz.x1=y.x1+k3.x1;
tymcz.x2=y.x2+k3.x2;
tymcz=pochodna(czas_biezacy, tymcz);
k4.x1=krok*tymcz.x1;
k4.x2=krok*tymcz.x2;
y.x1=y.x1+k1.x1/3+2*k2.x1/3+k3.x1/3+k4.x1/6;
y.x2=y.x2+k1.x2/3+2*k2.x2/3+k3.x2/3+k4.x2/6;
};
return EXIT_SUCCESS;
}