2016-12-27 1 views
1

Ich versuche, die ganzzahligen Lösungen dieser Gleichung zu berechnen:Vermeiden Sie es, zu viele verschachtelte Schleifen

ax + by + cz = d für x, y, z

mit |ax + by + cz - d| < epsilon

so versuche ich 1 von 1, die Lösungen mit "DO" like this

DO i1=1,max 
DO i2=1,max 
DO i=1,max 
aux=abs(& 
d(1)*tazasmin(1)*i1+d(2)*tazasmin(2)*i2+& 
d(3)*tazasmin(3)*i3+d(4)*tazasmin(4)*i4+d(5)*tazasmin(5)*i5+& 
d(6)*tazasmin(6)*i6 & 
+d(7)*tazasmin(7)*i7+d(8)*tazasmin(8)*i8+d(9)*tazasmin(9)*i9& 
+d(10)*tazasmin(10)*i10+d(11)*tazasmin(11)*i11+d(12)*tazasmin(12)*i12 & 
+d(13)*tazasmin(13)*i13+d(14)*tazasmin(14)*i14& 
+d(15)*tazasmin(15)*i15+d(16)*tazasmin(16)*i16-tse)  
    IF (aux<=epsilon) THEN 
     //save the solutions. 
    END IF 
END DO 
END DO 
END DO 

Ich weiß, wie man den langen Gleichungsteil repariert (um es elegant und schön zu machen), aber ist dort ein Weg, die übermäßige Verwendung von DO zu vermeiden?

+0

Ich bin kein Experte für Fortran, aber das sieht für eine einfache Gleichung ziemlich kompliziert aus. '**' wird für Potenzoperationen verwendet, und wenn dies eine inkrementelle Schleife sein soll, können Sie einfach Ihre Variablen definieren und inkrementieren. Zum Beispiel, wenn "i = max", "i = 1" und "i2 = i2 + 1" bis "i2 = max", dann inkrementiere "i1" und so weiter. Dies würde alles in einer einzigen Schleife passieren. [Fortan-Operatoren] (https://www.obliquity.com/computer/fortran/operate.html) - würde dies zu "d = (A ** x) + (B ** y) + (C ** z) 'etwa –

+1

danke, pst als eine antwort zu kredit gl! –

+0

Kein Problem, obwohl hilfreich, ich denke nicht, dass dies eine vollständige Lösung ist, da es nicht Code geschrieben ist. Es sind mehr oder weniger logische Konzepte zu folgen. Ich bin froh, dass es Ihnen geholfen hat :) Sie können den endgültigen Code (und die Zusammenfassung) des endgültigen Ergebniscodes schreiben, der für Sie funktioniert hat :) –

Antwort

1

Ich vermute, Sie wirklich wollen Schleife über alle 16 Werte .. so etwas wie dies versuchen:

implicit none 
    integer,parameter :: nvar = 4 
    integer, parameter :: max = 3 
    integer varray(nvar) 
    integer c,k 
    do c=1,max**nvar 
    do k=1,nvar    
     varray(k)=mod((c-1)/max**(nvar-k),max)+1 
    enddo 
! now your expresion is like: 
    aux=abs(total(d*tazasmin*varray)) 
! assuming d and tazasmin are apporpriately declared arrays   
    enddo 
    end 

Diese Berechnung offensichtlich sehr groß werden, wenn max groß ist

Verwandte Themen