You are here: Foswiki>Main Web>TWikiUsers>CezaryMigaszewski>ProgramEuler (revision 9)EditAttach
Bardzo prosty program prezentujący metodę Eulera obliczeń numerycznych, realizujący jednocześnie pewne zagadnienie mechaniki nieba. Na orbicie okołoziemskiej znajduję się satelita (lub inne niewielkie ciało). Ów obiekt znajduję się oczywiście w polu grawitacyjnym Ziemi, ale jako, że Ziemia znajduję 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ła 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. Pod tekstem źródłowym znajduje się załączony plik wykonywalny programu. Uruchamiamy go poleceniem "euler.out". Dane (x,y) są zapisywane do pliku "euler.dat". Dane te można odczytać programem Super Mongo. Poniżej jest załączone również macro euler.m, które można użyć w programie Super Mongo.

------------------
#include<stdio.h>
#include<math.h>
#define KROK   0.0001

/*metoda Eulera*/

main()
{
  FILE *f;
  char *plik;
  float t,x,y,u,v,tkon,r,ax,ay,fx,fy,k,j;
  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); 
  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;
    y=y+v*KROK+ay*KROK*KROK;
    u=u+ax*KROK;
    v=v+ay*KROK;
    t=t+KROK;
    r=sqrt(x*x+y*y);
    fprintf(f,"%10.4f %7.4f\n",x,y);
   }

    fclose(f);
    return 0;
}

-----------------------
-- CezaryMigaszewski - 17 Apr 2004
Topic attachments
I Attachment Action Size Date WhoSorted ascending Comment
euler.mm euler.m manage 0.2 K 23 Apr 2004 - 15:31 CezaryMigaszewski Macro programu Super Mongo
euler.outout euler.out manage 13.9 K 26 May 2004 - 13:56 CezaryMigaszewski  
Edit | Attach | Print version | History: r10 < r9 < r8 < r7 | Backlinks | View wiki text | Edit WikiText | More topic actions...
Topic revision: r9 - 26 May 2004, CezaryMigaszewski
 
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