W Dziala "Nauka" nowy bloger TOMEJ podał ciekawe zadanie, które mnie, weterana w bojach z zadaniami z fizyki, zaintrygowało -- i podałem tam swoje rozwiązanie, tzn. czas w sekundach, o który chodziło, otrzymany dla podanych wartości danych.
Bloger BJAB chciałby ze mną porozmawiwc więcej o tym moim rozwiązaniu -- ale ja nie mogę juz wchodzić do Działu "Nauka", bo do tego stopnia został on zapaskudzony, że mnie zwyczajnie bierze obrzydzenie.
Ale przecież ja mogę traktować rozwiązywanie zadań z fizyki, nie w ramach obowiązków zawodowych, po prostu jako hobby -- dlatego też rozmowe mogę dalej prowadzić tutaj!
Mój "wzór" na rozwiązanie zadania jest poniżej.
Równania ruchu, które trzeba rozwiązac w zadaniu TOMEJ-a, podchodząc do niego w ramach mechaniki newtonowskiej, sa dokładnie tego samego typu jak te, które uzywa sie do obliczania orbit planet, satelitów i wszelkich imnnych ciał w Układzie Słonedcznym. A ponieważ ja w obliczaniu orbit ostatnio "tkwię po same uszy", to szybciutko sporządziłem program w języku C, używający algorytmu o nazwie "leapfrog". Przy czym użyłem wariantu "leapfroga" nieco mniej znanego, ale w pełni równoważnego z tym najbardziej znanym. Tutaj jest link do portalu, w którym sa przedstawione rózne wersje leapfroga.
Poniższy rogram, który napisałem, puszczałem dla różnych wartosci kroku czasowego dt -- od 1000 sekund fo 1 sekundy -- i widać wyraźnie, że obliczony czas "celuje" w moment pomiedzy sekundą 961672-gą a 961673-cią.
Nie wykluczam, że cos pokićkałem, bo program napisałem "na kolanie" w przerwie między zajęciami -- ale, jesli jest jakis "bug", to przecież można go będzie usunąć.
Program jest dla tych konkretnych wartości danych, które TOMEJ podał -- ale, można go latwo "uogólnić" dla mas o róznych wartościach i róznych początkowych odległosci -- mozna te dane po prostu wczytywać z klawiatury. Przy czym, przy róznych masach zadanie się troszeckę komplikuje, bo teraz to juz będą dwa niejednakowe sprzężone równania rózniczkowe.
Leapfrog, mimo niezwykłej prostoty, daje wyniki zadziwiająco dokładne. Program, nad którym obecnie pracuję, używając tej metody, oblicza mi położenia Ksiezyca na niebie w okresie od 50-ciu lat "w tył" do 50-ciu lat "wprzód" z błedem nie przekraczającym jednej minuty katowej (sam Księzyc ma rozmiar katowy ok. 30 minut).
Tu jest ten rzeczony Leapfrog:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
main()
{
int i, dupajasio;
double GM,dt,dthalf, dtsqby2,a,anew,V,x;
GM = -0.25*10.0*6.67e-11;
printf(" Wprowadz krok czasowy dt w leapfrogu w sekundach: ");
scanf("%lf",&dt);
printf(" Wprowadziles %lf. Teraz wprowadz zero, to program ruszy z kopyta: ",dt);
scanf("%d",&dupajasio);
dthalf = 0.5*dt;
dtsqby2 = 0.5*dt*dt;
x = 5.0;
V = 0.0;
a = GM/(x*x);
i = 0;
while( x> 0.0)
{
x = x + V*dt + a*dtsqby2;
anew = GM/(x*x);
V = V + (a + anew)*dthalf;
a = anew;
printf(" %d %le\n",i,x);
i += 1;
}
printf(" Lepafrog potrzebowal %d krokow dla fazy <zblizania sie>.\n",i-1);
printf(" Co odpowiada %lf sekundom.\n",(double)(i-1)*dt);
printf(" W nastepnym kroku odstep miedzy cialami stal sie ujemny --\n");
printf(" znaczy, ciala <minely sie>.\n\n\n");
}
Komentarze