View Single Post
Old 27-03-2008, 23:28   #230
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
Quote:
Originariamente inviato da Torav Guarda i messaggi
beh tanto per far vedere del codice:
ho la classe pianeta che anche nel mio caso è praticamente una struttura:

Codice:
class pianetaClass:
    def __init__(self, nome, massa, r, theta, pr, ptheta):
        self.nome = nome
        self.massa = massa
        self.coord = dict([('r',r), ('theta',theta)])
        self.mom = dict([('r',pr), ('theta',ptheta)])


    def __str__(self):
        return self.nome + ": massa = " + str(self.massa) + ", posizione = (" + str(self.coord['r']) + ", " + str(self.coord['theta']) + "), momenti = (" + str(self.mom['r']) + ", " + str(self.mom['theta']) + ")"


    # Ritorna un pianeta con coordinate e momenti uguali a quelli di self + gli argomenti
    def aggiungiCost(self, r, theta, PR, PTheta):
        return pianetaClass(self.nome, self.massa, self.coord['r'] + r, self.coord['theta'] + theta, self.mom['r'] + PR, self.mom['theta'] + PTheta)


    # Ritorna la distanza (al quadrato) tra self e il pianeta in argomento
    def distanzaQ(self, pianeta):
        dist = self.coord['r']**2 + pianeta.coord['r']**2 - self.coord['r']  * pianeta.coord['r'] * math.cos(self.coord['theta'] - pianeta.coord['theta'])

        return math.sqrt(dist)
e la classe sistema solare che controlla tutto "l'ambiente":

Codice:
class sistemaSolareClass:
    def __init__(self, pianeti):
        self.pianeti = pianeti


    def __str__(self):
        toPrint = "Attuali posizioni e momenti dei pianeti all'interno del sistema solare:\n"
        for pianeta in self.pianeti:
            toPrint += str(pianeta) + "\n"

        return toPrint


    def evolvi(self, tempo, salvaOgni=1000):
        # questo metodo prende un centinaio di righe di codice piuttosto noiosette
        # che sono semplicemente l'implementazione dell'algoritmo di runge kutta

 
    def rPunto(self, pianeta):
        return (pianeta.mom['r'] / pianeta.massa)


    def thetaPunto(self, pianeta):
        return pianeta.mom['theta'] / (pianeta.massa * pianeta.coord['r']**2)
    

    def PRPunto(self, pianeta, altriPianeti):
        valore = - G*M * pianeta.massa / (pianeta.coord['r']**2) + pianeta.mom['theta']**2 / (pianeta.massa * pianeta.coord['r']**3)

        for altroP in altriPianeti:
            valore -= (1./2.) * G * altroP.massa * pianeta.massa / (pianeta.distanzaQ(altroP)**(3./2.)) * (2.*pianeta.coord['r'] - altroP.coord['r'] * math.cos(pianeta.coord['theta'] - altroP.coord['theta']))

        return valore


    def PThetaPunto(self, pianeta, altriPianeti):
        valore = 0
        for altroP in altriPianeti:
            valore -= (1./2.) * G * pianeta.massa * altroP.massa / (pianeta.distanzaQ(altroP)**(3./2.)) * pianeta.coord['r'] * altroP.coord['r'] * math.sin(pianeta.coord['theta'] - altroP.coord['theta'])

        return valore
all'inizio ovviamente ho definitio un paio di variabili contenente G, la massa del "sole" (che considero fisso, più che altro per comodità, non ci vorrebbe nulla a piazzarlo al centro con una massa molto grande ) e l'intervallo di tempo DT.
per inciso nel metodo che calcola runge kutta ho anche messo la scrittura su file dei risultati (in output ci sono solo x = r cos(theta) e y=r sin(theta) per poter essere visualizzati meglio, io uso gnuplot e vengono tante belle quasi-ellissi ).
il programma "esterno" si riduce ad un qualcosa del genere:

Codice:
a = pianetaClass("Terra", 1, 1, 0.4, 0.1, 0.5)
b = pianetaClass("Mercurio", 0.3 0.4, 2, 0.03, 0.02)

mySis = sistemaSolareClass((a, b))

mySis.evolvi(10, 100000)
mi scuso per l'orrido uso degli oggetti, ma nella mia facoltà non ci sono esami di ingegneria del software e da solo non riesco proprio a tirare fuori qualcosa di meglio
Come si è passati dall'unire due file exe a dissertazioni astrofisiche sul sistema solare devo ancora capirlo....... Passando dal solito (flame? (almeno è garbato)) Python VS resto del mondo
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso