Iterationsprozess

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Ich stehe gerade vor einem Umsetzungsproblem, da mir nicht genau klar ist wie man das Folgendes gut umsetzen kann.
Ich will die Energie durch einen Iterationsprozess bis zu einer gewissen Genauigkeit berechnen.
Ich habe einen Faktor(C_D_FACTOR), den ich aber nicht genau kenne, ihn aber berechnen könnte, wenn ich die Energie gegeben habe, was ich aber nicht habe. Cavlist_real und Number werden vom User festgelegt.

Code: Alles auswählen

Cavlist_real = [...,....,...]
Number = 6

C_D_FACTOR = 24
E0 = 600
for n in range(1, Number + 1):
    E0 = E0 + q * C_D_FACTOR * Cavlist_real[int(n)-1]/A
C_D_FACTOR = -0.0016*E0 + 26.935
E0 = 600
for n in range(1, Number + 1):
    E0 = E0 + q * C_D_FACTOR * Cavlist_real[int(n)-1]/A
C_D_FACTOR = -0.0016*E0 + 26.935
Diesen Prozess soll es so lange machen bis der Wert sich eingependelt hat, daher:
C_D_FACTOR_old - 0.001 < C_D_FACTOR_new < C_D_FACTOR_old + 0.001

Vielen Dank im Vorraus! Ich hoffe, es war verständlich.
BlackJack

@peter99: Du müsstest halt eine Schleife schreiben in der das solange ausgerechnet wird, bis der Abstand zwischen dem aktuellen und dem vorherigen Ergebnis kleiner als die gewünschte Genauigkeit 0.001 ist. Ich würde noch ein Sicherheitsnetz einbauen, soll heissen eine maximale Anzahl von Durchläufen nach denen abgebrochen wird, für den Fall das die Genauigkeit nie erreicht werden kann. Oder man schreibt da den Beweis oder zumindest eine Erklärung dazu warum dieser Fall nie eintreten kann.

Anmerkungen zu Quelltext: Mach Dir mal klar welche Werte zu jedem Zeitpunkt an welchen Namen gebunden werden und welchen Typ die haben. Was Du da mit `n` veranstaltest ist unnötig kompliziert. Es ist weder sinnvoll von 1 bis `Number` zu zählen und in jedem Durchlauf 1 von `n` abzuziehen, noch hat es irgendeinen effekt `int()` auf den ganzzahligen Wert `n` anzuwenden.

Du könntest auch mal überlegen wie Du diese Schleife über `n` in einer Schleife über die ersten `Number` Elemente von `Cavlist_real` umwandelst, und dass man die vielleicht nicht für jeden Näherungsschritt erneut zur Berechnung heran ziehen muss, sondern das als Zwischenergebnis heraus ziehen kann.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Da hast du Recht, entschuldige, das waren noch Überreste von dem vorherigen code, die noch nicht umgeändert waren. Mein Problem- so dumm es nun auch klingt - ist genau die for-Schleife, da ich sie bis jetzt immer nur im Bezug auf Listen verwendet habe.
for ... in range(...), aber jetzt habe ich keine range
Ich komme so weit und hab dann keine Ahnung mehr was ich tun soll und wie ich das in eine for-Schleife einbinden kann.

Code: Alles auswählen

Totalfield = 100
Number = 6

C_D_FACTOR_OLD= 24
E1 = 600

def calculater(C_D_FACTOR_OLD)
E0 = E1 + q * C_D_FACTOR_OLD * Totalfield/A
C_D_FACTOR = - 0.0016 *E0 + 26.935
return C_D_FACTOR_NEW

if C_D_FACTOR_OLD - 0.01 < C_D_FACTOR_NEW < C_D_FACTOR_OLD + 0.01:
    pass
else:
    C_D_FACTOR_OLD = C_D_FACTOR_NEW
    C_D_FACTOR_NEW= iteration_process_C_D_Factor(C_D_FACTOR_OLD)
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

oh, das ist der Audruck while! Ich arbeite immer mit for, aber while ist toll, damit könnte es funktionieren. Vielen Dank!
Antworten