Aufgabe Nr. 2: Astronomie - Unser Sonnensystem

@Tec :

Dein Programm erinnert mich so an Computergraphik/Animationstechnik Vorlesungen :D

Wo man ein Sonnensystem bauen soll mit einem schönen Scenegraphen :rolleyes:
 
Das ganze ist keine Programmier sondern eine rechenaufgabe...
http://de.wikipedia.org/wiki/Synodisch
Hieraus entnehmen wir die Umlaufzeiten um die Sonne und dann gehts auch schon los *g*
Code:
> merkur:=88;
> venus:=225;
> erde:=365;
> mars:=687;
> jupiter:=round(11.862*365);
> saturn:=round(29.458*365);
> uranus:=round(84.014*365);
> neptun:=round(164.793*365);
> pluto:=round(248.2*365);
Rechnen ist dank Maple ja relativ einfach geraten und so sieht die fertige grundlagenforschung aus ;)
Code:
> gl1:=f(x,merkur)-floor(f(x,merkur))=f(x,venus)-floor(f(x,venus)):
> gl2:=f(x,venus)-floor(f(x,venus))=f(x,erde)-floor(f(x,erde)):
> gl3:=f(x,erde)-floor(f(x,erde))=f(x,mars)-floor(f(x,mars)):
> gl4:=f(x,mars)-floor(f(x,mars))=f(x,jupiter)-floor(f(x,jupiter)):
> gl5:=f(x,jupiter)-floor(f(x,jupiter))=f(x,saturn)-floor(f(x,saturn)):
> gl6:=f(x,saturn)-floor(f(x,saturn))=f(x,uranus)-floor(f(x,uranus)):
> gl7:=f(x,uranus)-floor(f(x,uranus))=f(x,neptun)-floor(f(x,neptun)):
> gl8:=f(x,neptun)-floor(f(x,neptun))=f(x,pluto)-floor(f(x,pluto)):
> temp:=fsolve(gl1,x=1..200);
> for n from 1 to 50 do:
> temp := fsolve(gl1,x=temp..temp+300);
> if gl2 then 
>  if gl3 then
>   if gl4 then
>    if gl5 then
>     if gl6 then
>      if gl7 then
>       if gl8 then temp;
>       end if
>      end if
>     end if
>    end if
>   end if
>  end if
> end if
> od:
Gleichungen zusammengestellt und lösungsansatz gestartet...
Code:
> for n from 1 to 5000 do:
> temp := fsolve(gl1,x=temp..temp+300);
> if gl2 then
>  if gl3 then
>   if gl4 then
>    if gl5 then
>     if gl6 then
>      if gl7 then
>       if gl8 then temp;
>       end if
>      end if
>     end if
>    end if
>   end if
>  end if
> end if
> od:
Und er rechnet immer noch, nach 10 minuten hab ichs abgebrochen, weils sinnfrei ist ;)
Rein technisch gehts aber :D
Imrahil

*EDIT*
> f:=(x,y)->x/y;
hab ich vergessen ;)
 
Naja, aber ein Ergebnis für die Aufgabe gibts immernoch nicht wirklich. (Also ein Programmcode und ein nachvollziehbares Zahlenergebnis) ;)
 
Hier mal mein Programm in C.
Die Werte im Werte-Arry habe ich zuvor mit einem java-Programm ausgerechnet.
Ich werd meinen kleinen Server mal ne Woche dran rechnen lassen ^^.
Code:
# include <stdio.h>

long double M,N;
long double kGV (long double m,long double n) {
  M=m;
  N=n;
  // ggT ausrechnen
  while(m!=n) {
    if (m>n)
    m-=n;
    else
    n-=m;
  }
  //kGV(m,n)=m*n/ggT(m,n)
    return (M*N/m);
}

int main () {
long double werte []={89.0,224.0,365.0,686.0,4352.0,10811.0,30718.0,60561.0,91663.0};


int i;
long double a=kGV(werte[0],werte[1]);
printf("t 0 : %Lf\n",a);
for (i=1;i<8;i++) {
  a=kGV(a,werte[i+1]);
printf("t %d : %Lf\n",i,a);
}
return 0;
}

@Tec-Dein Programm sieht echt nice aus :).Ich kanns nur leider nicht kompilieren-kannst du mir ne fertige Linux binary davon schicken bzw im Forum uppen ?Das wär nett.

EDIT: So, habe jetzt die Ergebnisse vorliegen: Nach meinen Berechnungen taucht eine Superkonjunktion alle 34 813 935 478 579 320 Jahre auf.Ich habe aber sicher einige versäumt, denn ich habe es auf die kgV Methode gemacht.

So.Habe jetzt ein neues Programm (wieder in c) geschrieben.Diesmal mit der Simulationsmethode (ich nenne meine Methode mal so)

biddesehr:

Code:
# include <stdio.h>
# include <math.h>
# include <time.h>

// Das Superkonjunktionsberechnungsprogramm-selbe Aufgabe-exakter gelöst :)

int main () {
  printf ("Das BB Superkonjunktionsberechnungsprogramm v 2.0b\n");
  long double durchl;
  printf ("Geben Sie bitte die Anzahl Durchläufe an, die Sie warten können (natürlich CPU-abhängig)");
  scanf("%Lf",&durchl);

  time_t startZeit;
  time(&startZeit);  
 
  double tKurs=86400.0;
  double aEKurs=149600000.0;//Kilometer, die eine AE aufweist (1AE=Abstand Erde Sonne)
  double wechselKurs=tKurs/aEKurs;//Ich will die km/s in AE/Tag umrechnen;

  double zweiPi=2.0*3.141592654;

  double sMerkur=0.39*zweiPi;
  double sVenus= 0.72*zweiPi;
  double sErde= 1.0*zweiPi;
  double sMars= 1.52*zweiPi;
  double sJupiter= 5.20*zweiPi;
  double sSaturn= 9.54*zweiPi;
  double sUranus= 19.20*zweiPi;
  double sNeptun= 30.06*zweiPi;
  double sPluto= 39.6*zweiPi;

  double vMerkur= 47.8*wechselKurs;
  double vVenus= 35.0*wechselKurs;
  double vErde= 29.8*wechselKurs;
  double vMars= 24.1*wechselKurs;
  double vJupiter= 13.0*wechselKurs;
  double vSaturn= 9.6*wechselKurs;
  double vUranus= 6.8*wechselKurs;
  double vNeptun= 5.4*wechselKurs;
  double vPluto= 4.7*wechselKurs;

  double tMerkur=sMerkur/vMerkur;
  double tVenus=sVenus/vVenus;
  double tErde=sErde/vErde;
  double tMars=sMars/vMars;
  double tJupiter=sJupiter/vJupiter;
  double tSaturn=sSaturn/vSaturn;
  double tUranus=sUranus/vUranus;
  double tNeptun=sNeptun/vNeptun;
  double tPluto=sPluto/vPluto;

  //_S_o _V_iel BBGrad _S_chaffen die Planeten in einer t Einheit (1/t/1024=1024/t) 
  //1 BBGrad=1048576/360 Grad, heißt 1 Runde=1048576 BBGrad  (1048576=2^20)

  int svsMerkur=1048576.0/tMerkur;// na dann rund ich halt nicht -.-
  int svsVenus=1048576.0/tVenus;
  int svsErde=1048576.0/tErde;
  int svsMars=1048576.0/tMars;
  int svsJupiter=1048576.0/tJupiter;
  int svsSaturn=1048576.0/tSaturn;
  int svsUranus=1048576.0/tUranus;
  int svsNeptun=1048576.0/tNeptun;
  int svsPluto=1048576.0/tPluto;

  //Die Berechnung kann losgehen!
  int merkur=0,venus=0,erde=0,mars=0,jupiter=0,saturn=0,uranus=0,neptun=0,pluto=0;

  //hehe
  int anzSchnauf=1;

  long double i;
  for (i=0;i<durchl;) {
  	
    merkur+=svsMerkur;
    venus+=svsVenus;
    erde+=svsErde;
    mars+=svsMars;
    jupiter+=svsJupiter;
    saturn+=svsSaturn;
    uranus+=svsUranus;
    neptun+=svsNeptun;
    pluto+=svsPluto;

    // TESTAREA 51 ANFANG
      //zu Testzwecken printf("svs: %f,%f,%f,%f,%f,%f,%f,%f,%f",svsMerkur,svsVenus,svsErde,svsMars,svsJupiter,svsSaturn,svsUranus,svsNeptun,svsPluto);
      //printf("merkur:%d\n",merkur);
    // TESTAREA 51 ENDE
    
    merkur&=1048575; // Ist dasgleiche wie %360, nur in BBGrad (%1048576) und durch &1048575 viel Schneller!!!!!!
    venus&=1048575;
    erde&=1048575;
    mars&=1048575;
    jupiter&=1048575;
    saturn&=1048575;
    uranus&=1048575;
    neptun&=1048575;
    pluto&=1048575;

    // Ein Tag vergeht....
    i++;    
    
    //--------------------------------------------------------------------------------------------------------------------------Hier ists interessant!!!
    if(merkur==venus&&merkur==erde&&merkur==mars&&merkur==jupiter&&merkur==saturn&&merkur==uranus&&merkur==neptun&&merkur==pluto) {// planeten dürfen kein Vielfaches von 2^20 sein!!!
      printf("Rendered sequence %d\n",anzSchnauf);
      anzSchnauf++;
      if((merkur&1048575)!=0) {
        printf("war das letzte :)");
        printf("Ich bin fertig!!!!!!\n");
        time_t endZeit;
        time(&endZeit);
        float zeit=(float)difftime(endZeit,startZeit);
        printf("Alle %Lf zeiteinheiten sind alle Planeten in einer Linie!Im Winkel: %f Grad\n%f Sekunden gebraucht",i,merkur*360.0/1048576.0,zeit);
        return 0;
      }
    }
  }
  time_t endZeit;
  time(&endZeit);
  float zeit=(float)difftime(endZeit,startZeit);
  printf("In dieser Anzahl Durchläufe leider nicht geschafft!\n%f Sekunden gebraucht",zeit);
  return 0;
}
 
Zurück
Oben