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?
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 –
danke, pst als eine antwort zu kredit gl! –
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 :) –