Frage zu quadratischen Iterationen

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.
maxfoxim
User
Beiträge: 10
Registriert: Sonntag 10. Februar 2008, 15:07
Wohnort: Köln
Kontaktdaten:

Frage zu quadratischen Iterationen

Beitragvon maxfoxim » Donnerstag 3. April 2008, 16:16

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
BlackJack

Beitragvon BlackJack » Donnerstag 3. April 2008, 18:19

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.
maxfoxim
User
Beiträge: 10
Registriert: Sonntag 10. Februar 2008, 15:07
Wohnort: Köln
Kontaktdaten:

Beitragvon maxfoxim » Dienstag 22. April 2008, 17:58

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:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 22. April 2008, 18:21

``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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 22. April 2008, 19:40

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.
maxfoxim
User
Beiträge: 10
Registriert: Sonntag 10. Februar 2008, 15:07
Wohnort: Köln
Kontaktdaten:

Beitragvon maxfoxim » Dienstag 22. April 2008, 21:52

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 22. April 2008, 21:56

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 22. April 2008, 22:23

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.
maxfoxim
User
Beiträge: 10
Registriert: Sonntag 10. Februar 2008, 15:07
Wohnort: Köln
Kontaktdaten:

Beitragvon maxfoxim » Mittwoch 23. April 2008, 16:50

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
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 23. April 2008, 17:17

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
maxfoxim
User
Beiträge: 10
Registriert: Sonntag 10. Februar 2008, 15:07
Wohnort: Köln
Kontaktdaten:

Beitragvon maxfoxim » Donnerstag 24. April 2008, 23:04

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder