Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Aufgabe Nr. 2: Astronomie - Unser Sonnensystem

Diskussion: Aufgabe Nr. 2: Astronomie - Unser Sonnensystem im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige @Tec : Dein Programm erinnert mich so an Computergraphik/Animationstechnik Vorlesungen Wo man ein Sonnensystem bauen soll mit einem schönen ...

Antwort
Alt 04.09.06, 22:53   #61 (permalink)
 
Registriert seit: 19.08.04
Dawen Leistung: Addierstift
Likes: 1
Standard

Anzeige

@Tec :

Dein Programm erinnert mich so an Computergraphik/Animationstechnik Vorlesungen

Wo man ein Sonnensystem bauen soll mit einem schönen Scenegraphen

Dawen ist offline   Mit Zitat antworten
Alt 05.09.06, 01:38   #62 (permalink)
 
Registriert seit: 09.01.05
Imrahil Leistung: Facit NTK
Likes: 0
Standard

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
Imrahil

*EDIT*
> f:=(x,y)->x/y;
hab ich vergessen
Imrahil ist offline   Mit Zitat antworten
Alt 05.09.06, 10:04   #63 (permalink)
Senior Member
 
Registriert seit: 27.01.02
Chris Leistung: Facit NTK
Likes: 1
Standard

Naja, aber ein Ergebnis für die Aufgabe gibts immernoch nicht wirklich. (Also ein Programmcode und ein nachvollziehbares Zahlenergebnis)
Chris ist offline   Mit Zitat antworten
Alt 26.05.07, 00:21   #64 (permalink)
 
Registriert seit: 29.04.07
pi() Leistung: Facit NTK
Likes: 0
Standard

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;
}
__________________
Seht euch das bitte einmal an.Hab mir echt Mühe gegeben:
Hier: www.gutinmathe.at
pi() ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Aufgabe Nr. 2: Astronomie - Unser Sonnensystem
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Angriffe auf unser Forum Opensky.cc opensky.cc Off topic-Zone 2 16.06.07 12:40
Unser Hoohead? ThiEfGaRReT Off topic-Zone 3 20.09.06 23:49
Nur noch 8 Planeten im Sonnensystem! sTEk Science & Fiction 5 24.08.06 20:23


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61