Seite 1 von 1

Frage zu quadratischen Iterationen

Verfasst: Donnerstag 3. April 2008, 16:16
von maxfoxim
Hey Leute, habe da so ein paar kleinere Probleme.
Bin im Moment dabei, ein kleines einfaches Programm zu schreiben das nach der Formel x = ax(x-1) rechnet. Je nachdem wie groß man a wählt, verläuft es entweder chaotisch (a=4) oder gegen einen bestimmen Wert (a=2) kleiner 1. Für x muss man übrigens immer eine Zahl zwischen null und eins eingeben.

Code: Alles auswählen

x = input ("Gebe die Variable x ein:")
while x > 0:
          
     a = 2
     x = a*x * (1-x)
     y = x*10             # für 0.2 konvergiert es gegen 0.5 bzw 5
     print y
     if y > 4.99999:            
          break
so jetzt zu meinen fragen, habe es leider nach 2 tagen immer noch nicht raus wie ich:
1. die Funktion dazu bringen kann, aufzuhören wenn sich die werte immer wieder holen, wie z.b 0.5 bzw. 5 beim obigen Bsp.
2. ich es hinkriege das die Fkt, falls sie chaotisch verlaufen sollte, nach einer gewissen anzahl an iterationsschritten abbricht.
wäre euch für jede Hilfe dankbar

Verfasst: Donnerstag 3. April 2008, 18:19
von BlackJack
1. Du musst Dir merken welcher Wert im jeweils letzten Durchgang war und mit dem aktuellen vergleichen. Gegebenenfalls testen ob die Differenz kleiner als eine recht kleine Zahl ist, also testen ob die beiden Werte genügend nah aneinander liegen.

2. Eine ``for``-Schleife und `xrange()` verwenden und die Bedingung, die jetzt als ``while`` formuliert ist auch mit einem ``if`` in der Schleife testen und gegebenenfalls abbrechen.

Verfasst: Dienstag 22. April 2008, 17:58
von maxfoxim
so habs raus bekommen wie ich:
1. das programm dazu bringe nach einer bestimmten anzahl an iterationsschritten zu beenden und
2. Wie ich es dazu bringe bei einer Konvergenz, den Konvergenzwert auszugeben und dabei zu stoppen

Code: Alles auswählen

Li = [1,2,3]  #musste der Liste schon Inhalt gegen, da der interpreter mir sonst einen fehler gibt
b = 1
gr = 50       # der grenzwert
x = input ("Gebe die Variable x ein:")
while x != 1 and b!=gr:
     a = 2.3       #die konstante die bestimmt ob die Fkt einen grenzwert hat oder chaotisch verläuft
     x = a*x * (1-x)
     y = x*10

     b = b+1
     Li.append(x)
     print   b,x
     if b==gr:
          print "Die Summe von Li ist", sum (Li)
     
     if Li[-2]==x:
          print "Grenzwert gefunden:",x
          break
    
     if Li[-3]==x:
          print "Grenzwert gefunden:",x
          break
         
   
ganz stolz sei :wink:

Verfasst: Dienstag 22. April 2008, 18:21
von Leonidas
``input`` solltest du durch ``raw_input`` ersetzen und danach den PEP8 lesen. Sinnvolle Variablennamen wären wohl auch gut, ebenso die Inline-Kommentare durch normale zu ersetzen.

Verfasst: Dienstag 22. April 2008, 19:40
von EyDu
Vielleicht solltest du dir auch noch mal überlegen, warum du "Li" am Anfang schon Werte geben musstest und entweder a) das Problem löst, so dass "Li" am Anfang leer ist oder b) du eine geeignetere Standardbelegung (None) verwendest.

Verfasst: Dienstag 22. April 2008, 21:52
von maxfoxim
EyDu hat geschrieben:Vielleicht solltest du dir auch noch mal überlegen, warum du "Li" am Anfang schon Werte geben musstest und entweder a) das Problem löst, so dass "Li" am Anfang leer ist oder b) du eine geeignetere Standardbelegung (None) verwendest.
stimmt, Li, hätte ich auch die Werte "none" geben können.
Musste der Liste aber schon werte geben, damit ich keine Fehlermeldung bekomme, denn sonst sucht der nach dem 2 bzw 3 Wert von hinten, die es noch gar nicht gibt.
Meine Idee war nämlich die, dass falls der vorletzte oder der vorvorletzte Wert dem Aktuellen entspricht, die Berechnung stoppt, da es sich nun höchstvermutlich um eine Konstante handelt.

Verfasst: Dienstag 22. April 2008, 21:56
von Leonidas
Ich würde da eher einen Generator nutzen und den dann immer aufrufen solange die beiden letzten zurückgegebenen Werte nicht gleich sind und ich den Generator nicht schon ausreichend oft aufgerufen habe.

Verfasst: Dienstag 22. April 2008, 22:23
von EyDu
maxfoxim hat geschrieben:Musste der Liste aber schon werte geben, damit ich keine Fehlermeldung bekomme, denn sonst sucht der nach dem 2 bzw 3 Wert von hinten, die es noch gar nicht gibt.
Wenn es dier nicht auf das letzte Stück Geschwindigkeit ankommt, muss kannst du doch vor dem Test prüfen, ob die Elemente bereits vorhanden sind:

Code: Alles auswählen

     if b==gr:
          print "Die Summe von Li ist", sum (Li)
     
     try:
          if Li[-2]==x:
               print "Grenzwert gefunden:",x
               break
         
          if Li[-3]==x:
               print "Grenzwert gefunden:",x
               break
     except IndexError:
          pass
Ewas ungewöhnlich finde ich deine Einrückung von fünf Leerzeichen, vorgesehen sind im Standard 4.

Verfasst: Mittwoch 23. April 2008, 16:50
von maxfoxim
das mit der Einrückung von 5 Zeichen war eigentlich keine Absicht. nehme normalerweise auch immer 4. Bin ich vermutlich mal auf den falschen knopf gekommen.

danke an alle übrigens für die Verbesserungsvorschläge und die Kritik, ich bin nämlich noch ziemlich am Anfang meiner "Programmierer-Karriere", deswegen versuch ich erst mal überhaupt ein Programm dazu zu bringen, was ich will. Geschwindigkeit und Lesbarkeit sind da auch erstmal zweitrangig. :wink: kommt aber noch

Verfasst: Mittwoch 23. April 2008, 17:17
von EyDu
Oh, da fällt mir gerade noch etwas viel schöneres ein:

Code: Alles auswählen

     if b==gr:
          print "Die Summe von Li ist", sum (Li)
     
     if x in Li[-3:-1]
          print "Grenzwert gefunden:",x
          break

Verfasst: Donnerstag 24. April 2008, 23:04
von maxfoxim
stimmt, ja so ein code entwickelt sich doch immer von "Juhu es funzt" bis zu "juhu es geht schnell, sauber und lesbar"
hehe
als nächstes versuche ich übrigens den Grenzwert für a rauszukriegen, also wo a noch gegen eine konstante konvergiert, müsste so um 2.9 liegen.
bis dann