You are here: Foswiki>Main Web>TWikiUsers>CezaryMigaszewski>ProgramEuler (revision 5)EditAttach
Bardzo prosty program, prezentujący metodę Eulera obliczeń numerycznych, realizujący jednocześnie pewne zagadnienie mechaniki nieba. Na orbicie okołoziemskiej znajduje się satelita (lub inne niewielkie ciało). Ów obiekt znajduje się oczywiście w polu grawitacyjnym Ziemi, ale jako, że Ziemia znajduje się na orbicie okołosłonecznej, na satelitę wpływ ma również ciśnienie promieniowania Słońca. Program pokazuje, jaki wpływ ma to ostatnie oddziaływanie na trajektorię satelity. W algorytmie tego prościutkiego programu pominąłem inne, nierzadko istotne zaburzenia, wpływające na zmianę orbity ciała, takie jak np. niesferyczność Ziemi. Jedynymi siłami są więc siła grawitacji ( od źródła punktowego ) oraz zaburzenie od promieniowania Słońca. Jako, że zmiana odległości satelity od Słońca (podczas obiegu Ziemi) jest niewielka w porównaniu z tą odległością oraz okres obiegu satelity jest mały w porównaniu z okresem obiegu Ziemi wokół Słońca, możemy przyjąć, że zarówno wartość zaburzenia jak i jego kierunek są stałe. Po uruchomieniu program zapyta o parę rzeczy: początkowe położenie satelity x(0) i y(0), początkową prędkość vx(0) i vy(0), czas końcowy, do którego chcemy śledzić położenie satelity oraz składowe przyspieszenia od siły zaburzającej fx i fy. Zaburzenie jest wyrażone w jednostkach bezwymiarowych (przyspieszenie w polu grawitacyjnym Ziemi w odległości a=1 od planety). Położenie początkowe i prędkość początkowa oraz czas końcowy również są wyrażone w jednostkach bezwymiarowych. Prędkość v=1 odpowiada predkości, jaką miałoby ciało na orbicie kołowej w odległości a=1. Czas końcowy t=1 odpowiada czasowi, jaki potrzebowałoby ciało poruszające się po orbicie kołowej o promieniu a=1, na zakreślenie kąta 1 radiana. Plik źródłowy o nazwie ?euler.c? kompilujemy poleceniem ?g++ -o euler.out euler.c ?. Plikiem wykonywalnym będzie wtedy ?euler.out?. Program zapisuje dane (x,y) w pliku o nazwie ?euler.dat?.


#include<stdio.h >

#include<math.h >

#define KROK 0.000001

/*metoda Eulera*/

main()

{

FILE *f;

char *plik;

float t,x,y,u,v,tkon,r,ax,ay,fx,fy,k,j;

int i;

plik = "euler.dat";

f=fopen(plik,"w");

/*rysowanie tarczy planety*/

for (k=-0.096; k<0.1; k=k+0.004)

{

j=sqrt(0.01-k*k);

fprintf(f,"%10.4f %7.4f\n",k,j);

}

for (k=0.096; k>-0.1; k=k-0.004)

{

j=-sqrt(0.01-k*k);

fprintf(f,"%10.4f %7.4f\n",k,j);

}

printf("podaj polozenie poczatkowe\nx(0)=");

scanf("%f",&x);

printf("\ny(0)=");

scanf("%f",&y);

printf("\npodaj skladowe predkosci poczatkowej\nu(0)=");

scanf("%f",&u);

printf("\nv(0)=");

scanf("%f",&v);

printf("\npodaj czas koncowy ");

scanf("%f",&tkon);

printf("\npodaj skladowe przyspieszenia od sily zaburzajacej (w jedn. GM/a^2) ");

printf("\nfx=");

scanf("%f",&fx);

printf("\nfy=");

scanf("%f",&fy);

i=0;

fprintf(f,"%10.4f %7.4f\n",x,y);

r=sqrt(x*x+y*y);

t=0.0;

while(t<=tkon && r>=0.1) {

ax=-x/(r*r*r)+fx;

ay=-y/(r*r*r)+fy;

x=x+u*KROK+ax*KROK*KROK/2;

y=y+v*KROK+ay*KROK*KROK/2;

u=u+ax*KROK;

v=v+ay*KROK;

++i;

t=t+KROK;

r=sqrt(x*x+y*y);

if (i % 1000 == 0)

fprintf(f,"%10.4f %7.4f\n",x,y);

}

fclose(f);

return 0;

}


-- CezaryMigaszewski - 17 Apr 2004
Topic attachments
I AttachmentSorted ascending Action Size Date Who Comment
euler.outout euler.out manage 14.0 K 23 Apr 2004 - 15:18 CezaryMigaszewski Plik wykonywalny programu euler.
Edit | Attach | Print version | History: r10 | r6 < r5 < r4 < r3 | Backlinks | View wiki text | Edit WikiText | More topic actions...
Topic revision: r5 - 23 Apr 2004, PaulinaOster
 
This site is powered by FoswikiCopyright © CC-BY-SA by the contributing authors. All material on this collaboration platform is copyrighted under CC-BY-SA by the contributing authors unless otherwise noted.
Ideas, requests, problems regarding Foswiki? Send feedback