DMUG-Archiv 2005

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

Re: NDSolve -> Mathematica braucht Ewigkeiten. Laesst sich das beschleunigen???

Hallo Hakan,

Zunächst hat Mma ein Package `Miscellaneous`PhysicalConstants, man braucht sie also nicht selbst mit Werten zu belegen; Es geht um die Bewegung eines massiven relativistischen Punktteilchens in einem gegebenen elektromagnetischen Feld. Dazu muss die Zeitableitung des relativistischen Impulses (m v/Sqrt[1 - v^2/c^2]) gleich der Lorentzkraft sein. Eine Veränderung des Feldes durch die bewegte Ladung wird nicht betrachtet (vgl. Landau/Lifschitz; LB d. theoret. Physik; Bd. 2, Klass. Feldtheorie, Kap. VIII Das Feld bewegter Ladungen). Die Gleichungen braucht man nicht selbst nach den gesuchten Funktionen umstellen, das kann Mma machen. Man muss fast nur die Newtonsche Grundgleichung (dp/dt = F) mit der Lorenzkraft F eintippen und den Rest von Mma erledigen lassen:

Erst definiert man einige Vektoren; Geschwindigkeit, elektr. und magnet. Feldstärke:
In[3]:= Remove[vV, vE, vH];
vV[t_] := {v1[t], v2[t], v3[t]};
vE[t_] := {e1[t], e1[t], e3[t]};
vH[t_] := {h1[t], h2[t], h3[t]};
Dann definiert man die Felder (sie sind gegeben bei dieser Aufgabe):
In[18]:= Clear[fieldDefs];
fieldDefs := {e1[t] -> 0, e2[t] -> 0, e3[t] -> 0.003 (* Volt/Meter *),
h1[t] -> 0, h2[t] -> 0, h3[t] -> 0.01 (* Ampere/Meter *)}

und die Anfangsbedingungen:
In[20]:= Clear[initialC];
initialC[tmin_] := {v1[tmin] == 0, v2[tmin] == 0.2, v3[tmin] == 0};

Nun generiert man die Gleichungen und fügt die Anfangbedingungen bei, weil NDSolve[] das so haben will:
In[22]:= Clear[eqns];
eqns[m_, eC_, c_, mY_, t0_] := Join[Apply[Equal, Flatten[Simplify[Solve[D[m vV[t]/Sqrt[1 - (vV[t] . vV[t])/c^2], t] - eC vE[t] - eC mY Cross[vV[t], vH[t]] == {0, 0, 0}, {v1'[t], v2'[t], v3'[t]}]]], 1] /. fieldDefs, initialC[t0]]

Dazu 2 Bemerkungen: zum einen muss man die Gleichungen neu generieren, wenn man die fieldDefs und/oder die initalC geändert hat. Das fand ich den einfachsten Weg, den Input für NDSolve[] zusammenzubringen - Sie mögen andere Wege finden. Zum anderen wird mit dem Kommando das Differentialgleichungssystem so umgestellt, dass die Ableitungen der Geschwindigkeitskomponenten allein auf der linken Seite zu stehen kommen - die v1'[t] etc. werden selbst als Variable angesehen, nicht etwa die Differentialgleichungen gelöst. Man kann sich überzeugen, dass dieser Schritt sinnvoll gelaufen ist:

In[24]:= (* allg. Gleichungscheck *)
Simplify[(D[m vV[t]/Sqrt[1 - (vV[t] . vV[t])/c^2], t] - eC vE[t] - eC mY Cross[vV[t], vH[t]] == {0, 0, 0}) /. Flatten[Solve[D[m vV[t]/Sqrt[1 - (vV[t] . vV[t])/c^2], t] - eC vE[t] - eC mY Cross[vV[t], vH[t]] == {0, 0, 0}, {v1'[t], v2'[t], v3'[t]}]]]

Out[25]= True

Bei Check wird in die physikalische Form der Newton(-Lorentz)-Gleichung die Umstellung nach v1'[t], v2'[t], v3'[t] eingesetzt und geprüft, ob das System noch identisch erfüllt ist: Okay. Gut, dann kann man jetzt die Lösung fertigen:

In[26]:= (* find a solution, display it *)
With[{c = 1 (* SpeedOfLight Second/Meter *), eC = 1 (* ElectronCharge/Coulomb *), m = 1/1000 (* ist die Masse zu klein, verschwinden die Gleichungen im Chop -> richtige Faktoren ausklammern *),
mY = 1 (* VacuumPermeability/((Volt Second)/(Ampere Meter)) *),
tmin = 0 (* Second *), tmax = 100 (* Second *)},
Print[" eqns: ", eqns[m, eC, c, mY, 0]];
solution = NDSolve[eqns[m, c, eC, mY, tmin], {v1, v2, v3}, {t, tmin, tmax}];
ParametricPlot3D[Evaluate[{v1[t], v2[t], v3[t]} /. solution], {t, tmin, tmax}, PlotRange -> All]
]

das gibt einen printout der aktuellen Gleichungen (die hängen wie gesagt von den gegebenen Feldern und Anfangsbedingungen ab) und erzeugt dann auch ein Bildchen, das im Anhang ist - dort sind die Geschwindikeitskomponenten abgetragen und die Lichtgeschwindigkeit ist 1 - grösser soll dann auch keine v-Komponente werden.

Zu beachten ist hierbei, dass z.B. mit der richtigen Elektronenmasse (~10^-30 Kilogramm) die Differentialgleichungen gleich mal verschwinden, nur die Anfangsbedingungen übrigbleiben und NDSolve[] daraufhin wortreich meckert. Um es mit den physikalischen Naturkonstanten zu rechnen, muss man geeignete Faktoren ausklammern auf beiden Seiten. Das wurde hier jetzt nicht gemacht und bleibt Ihnen überlassen. Macht man das falsch oder passt nicht auf, dann sieht man entweder nichts wg. der Kleinheit der Effekte oder NDSolve[] konvergiert nicht, weil Grössenordnungen nicht zusammenpassen und es numerisch nicht mehr funktionieren kann.

Gruss nach Berlin
Udo.

Hakan Onel wrote:

Hallo,

ich wollte mir ansehen, wie sich ein relativistisches
geladenes Teilchen in einem Raum mit elektrischen und
magnetischen Feldern verhaelt. Dazu habe ich das Mathematica (5.1) Notebook, welches auch an diese
eMail angehangen ist, geschrieben.

Darin loese ich die dreidimensionalen Bewegungsgleichung-
en des besagten Teilchens mit Hilfe der NDSolve-Funktion von Mathematica (5.1) komponentenweise. Jedoch bricht Mathematica seine Berechnung mit den Standardparametern leider bei 10000 Iterationschritten ab. Ein Aufruf von NDSolve mit "MaxSteps -> 'ESC' inf 'ESC'" fuehrt aber nun dazu, dass der Computer ueber Wochen beschaeftigt ist, ohne richtig voranzukommen.

Erhoeht man den Wert der Funktion EE_z[t_] (des elektrischen
Feldes in z-Richtung) auf unrealistische Werte (also von 0.003 auf 300000) so stellt Mathematica binnen kuerzester Zeit das richtige Ergebnis dar.

Nun meine Frage:

Kann ich diesen NDSolve Algor. irgendwie fuer die realistischen (sich im Notebook befindenden) Werte beschleunigen??
 Oder hat jemand eine andere Idee, wie ich mein Problem
 loesen kann?

Vielen Dank und Gruesse aus Berlin

Hakan

GIF image

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

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