montew_10.mws

Moderne Physik mit Maple

PDF-Buch Moderne Physik mit Maple

Update auf Maple 10

Kapitel 4.1.4

Worksheet montew_10.mws

c International Thomson Publishing Bonn      1995                       filename: montew.ms

Autor: Komma                                                                             Datum: 11.10.94

Thema: Annäherung an die wirkliche Bahn durch Auslosen von Pfaden.

Es wird kein bestimmter Funktionstyp vorausgesetzt, sondern ein zufälliger Pfad vorgegeben. Dieser Pfad wird zufällig verändert und die Änderung akzeptiert, wenn sich dadurch die Wirkung verringert.  

Die Bewegung wird in n äquidistante Zeitschritte dt = t1/n unterteilt.

Von je drei Punkten mit den x-Werten a, x und b wird der mittlere variiert (x+dx), und die sich daraus ergebende Differenz der Wirkung dS berechnet.

Differenz der kinetischen Energie mal (!) dt:

Ti entspricht der mittleren kinetischen Energie (mal dt) der Bewegung von a nach b.

dT wurde in einer früheren Version dieses Worksheets berechnet und mit lprint hier eingefügt (als kleines Beispiel für <proc und <lprint).

Ti:=proc(a,x,b)

m/2*((x-a)^2+(b-x)^2)/dt;

end;

Ti := proc(a,x,b) 1/2*m*((x-a)^2+(b-x)^2)/dt end


dT:=Ti(a,x+dx,b)-Ti(a,x,b);

lprint(simplify(dT));

m*dx*(2*x+dx-a-b)/dt

>    restart:with(plots):

>    dT:=proc(a,x,b,dx)

>    -m*dx*(-2*x-dx+a+b)/dt;

>    end;

dT := proc (a, x, b, dx) -m*dx*(-2*x-dx+a+b)/dt end proc

>   

Differenz der potentiellen Energie mal dt:

>    dV:=proc(x,dx)

>    (V(x+dx)-V(x))*dt;

>    end;

dV := proc (x, dx) (V(x+dx)-V(x))*dt end proc

Differenz der Wirkung (als Auswahlkriterium):

>    dS:=proc(a,x,b,dx)

>    dT(a,x,b,dx)-dV(x,dx);

>    end;

dS := proc (a, x, b, dx) dT(a,x,b,dx)-dV(x,dx) end proc

>   

Wirkung zur Kontrollausgabe bereitstellen

>    Sa:=proc(ak) local i;

>    sum(m/2*(xa[ak,i]-xa[ak,i+1])^2/dt-(V(xa[ak,i+1])+V(xa[ak,i]))/2*dt, i=1..n);

>    end;

Sa := proc (ak) local i; sum(1/2*m*(xa[ak,i]-xa[ak,i+1])^2/dt-1/2*(V(xa[ak,i+1])+V(xa[ak,i]))*dt,i = 1 .. n) end proc

>   

xa();

Anzahl der zu variierenden Punkte (wegen impliziter array-Definition fast überflüssig):

>    x1:='x1': n:='n':

>    anz:=proc() global x,xa,x0;

>    #n:=20:

>    x:=array(1..n+1);

>    x0:=array(1..n+1);

>    x[1]:=0; x[n+1]:=x1;

>    end;

anz := proc () global x, xa, x0; x := array(1 .. n+1); x0 := array(1 .. n+1); x[1] := 0; x[n+1] := x1 end proc

>   

anz();

zufällige Anfangsverteilung:

>    ini:=proc() local  i; global x,x0,ran,dt;

>    #x1:=3:

>    dt:=t1/n:

>    ran:=kr*(1-rand(1..1000)/500):

>    for i from 2 to n do

eine Systematik in der "Zufallsverteilung" (z.B. gleichf. Bewegung als nullte Näherung) verschlechtert das Verfahren:

es bleiben dann häufig die Pkte. neben den Randpunkten oder sonstige Spitzen stehen

>    #ran:=-rand(1..100)/100*x1+i*dt*x1/t1:

>    x[i]:= ran():

>    x0[i]:=x[i];

>    od:

>    x0[1]:=x[1]: x0[n+1]:=x1:

>    end;

ini := proc () local i; global x, x0, ran, dt; dt := t1/n; ran := kr*(1-1/500*rand(1 .. 1000)); for i from 2 to n do x[i] := ran(); x0[i] := x[i] end do; x0[1] := x[1]; x0[n+1] := x1 end proc
ini := proc () local i; global x, x0, ran, dt; dt := t1/n; ran := kr*(1-1/500*rand(1 .. 1000)); for i from 2 to n do x[i] := ran(); x0[i] := x[i] end do; x0[1] := x[1]; x0[n+1] := x1 end proc
ini := proc () local i; global x, x0, ran, dt; dt := t1/n; ran := kr*(1-1/500*rand(1 .. 1000)); for i from 2 to n do x[i] := ran(); x0[i] := x[i] end do; x0[1] := x[1]; x0[n+1] := x1 end proc
ini := proc () local i; global x, x0, ran, dt; dt := t1/n; ran := kr*(1-1/500*rand(1 .. 1000)); for i from 2 to n do x[i] := ran(); x0[i] := x[i] end do; x0[1] := x[1]; x0[n+1] := x1 end proc
ini := proc () local i; global x, x0, ran, dt; dt := t1/n; ran := kr*(1-1/500*rand(1 .. 1000)); for i from 2 to n do x[i] := ran(); x0[i] := x[i] end do; x0[1] := x[1]; x0[n+1] := x1 end proc

>   

x();

x[5];

Potentialtyp

>    m:='m':g:='g':k:='k':

>    V:=proc(x)

1/2*k*x^2;

>    m*g*x;

>    end;

V := proc (x) m*g*x end proc

dV(s,d);dS(q,w,e,r);

dS(1,2,3,4);

zufällige Auswahl des Punktes erhöht Konvergenz nicht

rani:=rand(2..n);

rani();


#xa:=array(1..10,1..n+1);

#x();

>   

Prozedur zur Iteration

>    monte:=proc(pfade) local l,lk,ii,i,kk,mk; global x,xa,dx,ran,dt;

>    for l to pfade do      # 10 Pakete der Groesse

>        for lk to kn do  # kn (weniger Ausgabe, weniger Kurven)

>   

>            for i from 2 to n do   

>   

>                      for kk to 1 do # soll fuer kk>1 Spitzen abbauen

>                      dx:=ran()/l^ex: # 1/l^ex soll zufaellige Variation

>                                              #dem Iterationsstadium anpassen

>                      if dS(x[i-1],x[i],x[i+1],dx) <=0 then x[i]:=x[i]+dx ;  

>                           #print(x(),dS(x[i-1],x[i],x[i+1],dx));

>                      fi;

>                           #x();

>                      od:

>             od:

>         od:

>         for mk to n+1 do xa[l,mk]:=x[mk]:od:

>         print(l*kn,Sa(l)); #Kontrollausgabe

>    od;

>    end;

monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...
monte := proc (pfade) local l, lk, ii, i, kk, mk; global x, xa, dx, ran, dt; for l to pfade do for lk to kn do for i from 2 to n do for kk to 1 do dx := ran()/(l^ex); if dS(x[i-1],x[i],x[i+1],dx) <= 0 ...

>   

>   

>   

>    Sa(2);

sum(1/2*m*(xa[2,i]-xa[2,i+1])^2/dt-1/2*(m*g*xa[2,i+1]+m*g*xa[2,i])*dt,i = 1 .. n)

>   

Wirkung S der wirklichen Bahn

>    #diff(y(t),t$2)=-diff(V(z),z)/m;

>    dgl:=subs(z=y(t),diff(y(t),t$2)=-diff(V(z),z)/m);

dgl := diff(y(t),`$`(t,2)) = -g

>    soly:=proc() rhs(dsolve({dgl,y(0)=0,y(t1)=x1},y(t))); end;

soly := proc () rhs(dsolve({dgl, y(0) = 0, y(t1) = x1},y(t))) end proc

>   

>    S:=proc() int(m/2*diff(soly(),t)^2-V(soly()),t=0..t1); end;

S := proc () int(1/2*m*diff(soly(),t)^2-V(soly()),t = 0 .. t1) end proc

>    #S();

>   

Parameter und Anfangsverteilung

n: Anzahl der Punkte, kr: halbe Breite der zufälligen Anfangsverteilung (-kr < x0[i] < kr)

kn: Anzahl der Iterationen, nach der eine Ausgabe erfolgt, bzw. ein Pfad abgespeichert wird, (Gesamtzahl: 10kn)

ex: die Streuung der Zufallszahlen nimmt mit 1/j^ex ab, wo j das j-te Paket von kn Iterationen ist.

>    n:=10: kr:=2:  kn:=10: ex:=1:

Masse, Fallbeschleunigung und Federkonstante

>    m:=1: g:=100:  k:=20: # m nicht float

Endpunkt

>    x1:=3.: t1:=.9: # fuer dezimale Ausgabe mindestens eine Groesse als float eingeben

Vorbereitung

>    #_seed:=100: # fuer neuen Anfangspfad deaktivieren

>    anz(): ini():

>   

Iteration mit Kontrollausgabe

_seed:=100:

>    pfade:=100:
monte(pfade);

10, -165.9796445

20, -273.3539556

30, -301.4090963

40, -329.4438592

50, -354.2975103

60, -375.2305571

70, -392.9150111

80, -403.4166571

90, -412.5262214

100, -417.9508710

110, -421.3901489

120, -424.8579969

130, -427.2455083

140, -428.4111125

150, -429.4711798

160, -429.9535290

170, -430.2072016

180, -430.2703064

190, -430.3155365

200, -430.3864240

210, -430.5463713

220, -430.5850382

230, -430.6164042

240, -430.6379142

250, -430.6420182

260, -430.6524485

270, -430.6621184

280, -430.6719492

290, -430.6821682

300, -430.6888860

310, -430.6959630

320, -430.6973907

330, -430.6981484

340, -430.7009396

350, -430.7014064

360, -430.7027578

370, -430.7045126

380, -430.7051606

390, -430.7053050

400, -430.7062386

410, -430.7062441

420, -430.7071401

430, -430.7079285

440, -430.7081152

450, -430.7084841

460, -430.7087758

470, -430.7089046

480, -430.7090937

490, -430.7092002

500, -430.7092689

510, -430.7093145

520, -430.7094384

530, -430.7097083

540, -430.7097145

550, -430.7097580

560, -430.7099598

570, -430.7101108

580, -430.7103781

590, -430.7103928

600, -430.7106539

610, -430.7107725

620, -430.7109559

630, -430.7112799

640, -430.7112822

650, -430.7116112

660, -430.7117485

670, -430.7117963

680, -430.7118211

690, -430.7118211

700, -430.7118922

710, -430.7119221

720, -430.7119221

730, -430.7119437

740, -430.7119715

750, -430.7119839

760, -430.7119847

770, -430.7119855

780, -430.7119901

790, -430.7120005

800, -430.7120566

810, -430.7121220

820, -430.7121872

830, -430.7121945

840, -430.7122111

850, -430.7122238

860, -430.7122298

870, -430.7122298

880, -430.7122298

890, -430.7122586

900, -430.7122782

910, -430.7122782

920, -430.7122819

930, -430.7122893

940, -430.7123060

950, -430.7123118

960, -430.7123200

970, -430.7123290

980, -430.7123389

990, -430.7123465

1000, -430.7123476

>    `exakt`=S();

exakt = -433.7500000

x0();x();

xa();

Darstellung des Anfangspfades (ploti), der letzten Näherung (plotm) und der wirklichen Bahn (plote).

>    ploti:=plot([seq([i*dt-dt,x0[i]],i=1..n+1)],color=green):

>    plotm:=plot([seq([i*dt-dt,x[i]],i=1..n+1)]):

>    plote:=plot(soly(),t=0..t1,color=black):

>    #plote;

>    display({ploti,plotm,plote});

[Maple Plot]

>   

>   

Jeder kn-te Pfad

>    aniplot:=seq(display([plote,ploti,plot([seq([i*dt-dt,xa[s,i]],i=1..n+1)])]),s=1..pfade):

>    display([aniplot]);

[Maple Plot]

>   

Animation

>    display([aniplot],insequence=true);

[Maple Plot]

>   

Diskussion:

Beim Experimentieren mit den verschiedenen Parametern stellt man fest, daß sich die Konvergenz der gedachten Pfade gegen die wirkliche Bahn nicht immer erzwingen läßt. Insbesondere kann man bei periodischer Bewegung sogar Divergenz bekommen, wenn t1 größer als die halbe Periodendauer wird. Das liegt sicher nicht nur an dem simplen Rechenverfahren, sondern in der *Natur* der Sache: die Natur nimmt es nicht so genau mit *der* Wirklichkeit. Es gibt viele Pfade, die sich in ihrer Wirkung von der wirklichen Bahn nur wenig unterscheiden.

Für große n sollte man eine Verbesserung der Konvergenz erwarten. Statt dessen bleibt die Iteration manchmal bei lokalen Minima hängen und liefert z.T. zur wirklichen Bahn spiegelbildliche Bahnen.

Aber es ist ja auch nicht der Zweck dieses einfachen Modells, die wirkliche Bahn zu berechnen. Es soll vielmehr das zeigen, was Feynman meint, wenn er von Teilchen spricht, die "schnuppern", um ihre Bahn zu finden. Während bei den Feynmanschen Pfadintegralen die Auswahl (besser die Gewichtung) der Pfade durch Interferenz geschieht, wird sie hier schlicht durch Probieren erreicht. So viel Zeit kann sich die Natur natürlich nicht nehmen. Kein Elektron würde je ankommen, wenn es ständig schnuppernd unterwegs wäre. Und diese Interferenz muß schon ein genial schneller Rechner sein, wenn sie zu jeder Zeit und an jedem Ort in einem einzigen Moment das Ergebnis der Überlagerung aller möglichen Pfade berechnet und das auch noch für alle Teilchen der Welt.

>   

>   

>   

>   

>   

>   

>   

>   

>   

>   

komma@oe.uni-tuebingen.de