DMUG-Archiv 2005

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: iteration

Hallo zusammen,

ob nun Dt. Elitehochschule mit und/oder ohne An[n]alen oder nicht, Mma. implementiert Goto[]. Punkt. C++ übrigens - ebenso wie C und Fortan auch. Es ist aber ganz unnötig, die Variablen einzeln zu benennen, es wird mit einer Liste (yL) gearbeitet und dann yL[[3]] angeschaut: Die Ausdrücke sind kürzer und vieles passiert nicht, was jetzt passiert ist. In diesem Ausdruck

Label[begin]; Subscript[y, 3] = t; Print[t];
 ygrid2 = Table[N[Subscript[y, s] = 0.5*(Subscript[y, s + 1] +
       Subscript[y, s - 1] - 0.08)], {s, 2, 10, 1}]; Print[q]; q = 1 + q;
 xygrid2 = Table[{N[Subscript[x, s]], N[Subscript[y, s]]}, {s, 1, 11, 1}];
 Print[Subscript[y, 3]]; If[Abs[Subscript[y, 3] - t] < 2, Goto[begin]]

ist nicht nur t nicht definiert, die Iteration für s = 2 braucht Werte für s = 3 _und_ s = 1 usw., da wurde nur an s = 3 gedacht, der Rest liegt im Dunkeln, ebenso wie die Randwerte. Dann taucht plötzlich ein Subscript[x, s] auf, woher das x? Und wenn man die y-Werte ausser Subscript[y, 3] mit 0 initialisiert, stoppt der Algorithmus bei kleinem t nie, bei grossem t im zweiten Schritt, weil dann der Wert (t/2 - 0.08 + t/2 - 0.08)/2 - 0.08 = t - 0.16 an die dritte Stelle zurückkehrt. Was soll das alles? Sie können ja mal etwa mit

With[{t = 4.17, n = 3, m = 12, w = 0.08, anZ = 100},
 yL = Table[If[j == n, t, 0], {j, m}];
 q = 0;
 While[Abs[yL[[n]] - t] < 2 && q < anZ,
   yL = PadRight[Rest[yL], m]/2 + PadLeft[Take[yL, m - 1], m]/2 - w;
   ++q
 ];
 Print["q: ", q];
 yL
]

experimentieren, ein paar Listen yL für verschiedene q im ListPlot ansehen usw. usf. und die Ideen abklären. Dazu ist ja Mma. da, ebenso wie allenfalls diese Gruppe.

Gruss
Udo.

klamser wrote:

Hallo Herr Sperber ,

au weia, eine wirklich vollständige Implementation einer Programmiersprache kennt auch Label und Goto. Sogar seit der Version 1 (sagt zumindest das Hilfesystem).

Also: Das Problem hier ist, dass y3=t gesetzt werden soll, t aber nicht bekannt ist. Also sollte man vorher t einen Wert zuweisen. Und dazwischen erneut, sonst läuft das ewig..... Das geht übrigens in Basic genau so.

Also zum Zweiten: Man kann sich natürlich in die Analen von Mathematica.ch eintragen, indem wie vor 30 Jahren programmiert wird und Label und Goto nutzt. Ich weiß nicht, wo einem so etwas heute noch beigebracht wird, ich hoffe nur, dass so etwas nicht an einer deutschen Hochschule passiert (wahrscheinlich ist das dann keine Eliteuni). Da nicht zu erkennen ist, was der Algorithmus erreichen soll, mach es wenig Sinn diesen hier zu verbessern, denn irgendwann müsste ja t ein Wert zugewiesen werden. Ich kann nicht erraten welcher, aber es geht garantiert ohne Goto und Label viel besser.

Wahrscheinlich sollte der Algorithmus besser in ein Modul eingebaut werden. Näheres hierzu ist im Hilfesystem von MMA zu finden.

Schöner Gruß

Peter Klamser

Christian M. Sperber wrote:

ich versuche in einer Label[beginn];.......;If[test,Goto[begin]] Schleife. einen Wert gegen den in der naechsten Runde berechneten zu vergleichen. Ich bekomme es aber nicht hin diesen zu definieren. Mathematica akzeptiert das nicht. Damit es klarer wird habe ich ein notebook angehaengt. In der ersten Berechnung laeuft die Anzahl der Durchgaenge ueber eine Variable q. In der zweiten Berechung habe ich es einfach so aufgeschrieben wie ich es gerne haette funktioniert aber nicht.








Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html