p.specht
| Differentialgleichungen 2. bzw. n.ter Ordre lösen ===================================== cela procéder, cela avec vollem Titel "Newton-Størmer-Verlet leapfrog method" heisst, findet sich dans presque allen Physik- et Game-Engines zur Berechnung qui Newtonschen Bewegungsgesetze. avec anderen Worten: Alles quoi explodiert et ensuite runterfällt wird avec cette deutlichen, mais doch pas trop zeitintensiven amélioration des einfachsten aller entsprechenden Algorithmen (Explizites Euler-procéder) berechnet. cela nachstehende Programme erlaubt une Beurteilung qui Realitätsnähe, weil aussi qui analytisch-exakte Solution qui devoir bekannt ist. Fünfstellige Genauigkeit reicht là wohl.
Es handelt sich um une Rückübersetzung de Fortran-90 pour XProfan-11, avec allen Tücken, daher: REINE DEMO OHNE JEDWEDE GEWÄHR!
Titre de la fenêtre "Anfangswertproblem einer Differentalgleichung 2. Ordre lösen pour Størmer-Verlet"
' ---------------------------------------------------------------------------------------------
' Aus Fortran90 pour XProfan-11 traduit 2014-08 de P. Specht, vienne (Österreich)
' aucun cependant geartete Gewähr! Verwendung sur alleinige péril de(s|r) Anwender(s|in)!
' source: https://jean-pierre.moreau.pagesperso-orange.fr/Cplus/stormer.txt
'**********************************************************************************************
'* Differential equation y"=f(x,y,y') by Størmer's method *
' (erweiterbar sur allg. Verlet type, z.B. y'''[...]=f(x,y,y',y''[,y''',...])
'* --------------------------------------------------------- *
'* SAMPLE RUN (BEISPIEL) *
'* Löse y" = 8*y*y / (1+2*x) à partir de x=0 to x=1 *
proc G :parameters x!,y!,z!'= x, y, y'
return 8*sqr(y!)/(1+2*x!)
endproc
proc F :parameters x!,y!,z!'= x, y, y'
return z!
endproc
'* with initial conditions: x(0)=0, y(0)=1 and y'(0)=-2 *
Déclarer x![4],y![4],z![4],h!' Initial conditions:
x![1]= 0
y![1]= 1
z![1]=-2' dy/dt
h!=0.01' Step
'* Compare to exact solution y = 1/(1+2*x) *
Proc Fx :parameters x!' Exact Solution:
return 1/(1+2*x!)
endproc
'* --------------------------------------------------------- *
'* Differential equation y"=f(x,y,y') by Stormer's method *
'* --------------------------------------------------------- *
'* X Y Y exact Error *
'* 0.000 1.000000 1.000000 0.0000000000 *
'* 0.010 0.980392 0.980392 0.0000000001 *
'* 0.020 0.961538 0.961538 0.0000000295 *
'* 0.030 0.943396 0.943396 0.0000000457 *
'* 0.040 0.925926 0.925926 0.0000000974 *
'* 0.050 0.909091 0.909091 0.0000001285 *
'* ... ... ... ... *
'* 0.950 0.344866 0.344828 0.0000381695 *
'* 0.960 0.342505 0.342466 0.0000388874 *
'* 0.970 0.340176 0.340136 0.0000396196 *
'* 0.980 0.337878 0.337838 0.0000403406 *
'* 0.990 0.335612 0.335570 0.0000410721 *
'* 1.000 0.333375 0.333333 0.0000418231 *
'* *
'* F90 Release By J-P Moreau, Paris (www.jpmoreau.fr). *
'*************************************************************
Fenêtre Style 24:font 2:set("decimals",16):Fenêtre 0,0-%maxx,%maxy-40
Déclarer c![4],a1!,a2!,a3!,yex!,k&,il! , x1!,y1!,z1!
a1!= 1.083333333333333333 : a2!=-2*(a1!-1) : a3!= a1!-1
clearclip
imprimer "\n------------------------------------------------------------------------------"
imprimer " Differentialgleichung y''=f(x,y,y') avec Störmer's Methode lösen "
imprimer "------------------------------------------------------------------------------\n"
imprimer " X Y Y exact Error\n"
putclip " X | Y | Y_exact | Error \n"
yex!=Fx(x![1]):imprimer tab(2);x![1],tab(22);y![1],tab(42);yex!,tab(62);er!
putclip str$(x![1])+"|"+str$(y![1])+"|"+str$(yex!)+"|"+str$(il!)+"\n"
' Runge-Kutta for first 2 steps:
whileloop 1,2:k&=&Boucle
RK4D2 x![k&],y![k&],z![k&],h!
x![k&+1]=x1!
y![k&+1]=y1!
z![k&+1]=z1!
yex!=Fx(x![k&+1])
il!=abs(yex!-y![k&+1])
imprimer tab(2);x![k&+1],tab(22);y![k&+1],tab(42);yex!,tab(62);er!
putclip str$(x![k&+1])+"|"+str$(y![k&+1])+"|"+str$(yex!)+"|"+str$(il!)+"\n"
endwhile
REPEAT'Main loop G10:
whileloop 2,4:k&=&Boucle
c![k&]=G( x![5-k&],y![5-k&],z![5-k&] )
endwhile
y![4]=2*y![3]-y![2]+sqr(h!)*(a1!*c![2]+a2!*c![3]+a3!*c![4])
x![4]=x![3]+h!
yex!=Fx(x![4])
il!=abs(yex!-y![4])
imprimer tab(2);x![4],tab(22);y![4],tab(42);yex!,tab(62);er!
putclip str$(x![4])+"|"+str$(y![4])+"|"+str$(yex!)+"|"+str$(il!)+"\n"
Whileloop 1,3:k&=&Boucle'pour prochain Schritt umkopieren:
x![k&]=x![k&+1]
y![k&]=y![k&+1]
endwhile
si %csrlin>40:waitinput 4000:cls
imprimer "\n X Y Y-exakt Error\n"
endif
UNTIL x![3]>1'end x value = 1
imprimer "\n EOF"
Imprimer " Resultate dans Zwischenablage!"
Waitinput
FIN
PROC RK4D2 :parameters x!,y!,z!,h!',x1!,y1!,z1!
declare c1!,d1!,c2!,d2!,c3!,d3!,c4!,d4!
c1!=F(x!,y!,z!)
d1!=G(x!,y!,z!)
c2!=F(x!+h!/2, y!+h!/2*c1!, z!+h!/2*d1!)
d2!=G(x!+h!/2, y!+h!/2*c1!, z!+h!/2*d1!)
c3!=F(x!+h!/2, y!+h!/2*c2!, z!+h!/2*d2!)
d3!=G(x!+h!/2, y!+h!/2*c2!, z!+h!/2*d2!)
c4!=F(x!+h!, y!+h!*c3!, z!+h!*d3! )
d4!=G(x!+h!, y!+h!*c3!, z!+h!*d3! )
x1!=x!+h!
y1!=y!+h!*(c1!+2*c2!+2*c3!+c4!)/6
z1!=z!+h!*(d1!+2*d2!+2*d3!+d4!)/6
endproc
PROGEND
'{=============================================================================================
' Stormer, aka Newton-Størmer-Verlet leapfrog method
' =============================================================================================
' Namensgebung: qui Algorithmus selbst allez zurück sur Delambre (1791), oftmals wiederentdeckt,
' u.a. 1907 par Carl Størmer, 1909 par Cowell et Cromlin, 1967 populär par Loup Verlet.
' Verbessert qui explizite Euler-Methode sans allzu hohen Mehraufwand. souvent dans Physik-Engines
' pour trouver. Details siehe https://en.wikipedia.org/wiki/Verlet_integration
' =============================================================================================
' Methode STORMER (aka Newton-Störmer-Verlet-leapfrog method):
' löst Y"=f(x,y,y') avec gegebenen Anfangsbedingungen
' ----------------------------------------------------------------------------------
' une Differentialgleichung 2. Ordre (Y") peux ersetzt volonté par un
' Differentialgleichungs-SYSTEM bestehend aus 2 Gleichungen 1. Ordre!
' si alors y"=f(x,y,y') gegeben ist avec y(a=Anfang) et y'(a=Anfang), ensuite peux on
' cet Formel par Substitution u = y' umformen trop:
'
' | u'=f(x,y,u)
' | y'=u
' | avec den neuen Anfangsbedingungen y(a), u(a)
'
' commencer wir qui Betrachtung avec celui-là speziellen forme qui Taylor-Entwicklung,
' chez qui qui reste comme Integral dargestellt wird (Wiki: Taylorentwicklung)
' x+h
' y(x+h) = y(x) + h * y'(x) + INTEGRAL (x+h-t)*y"(t).dt
' x
' par Verbringung qui Nichtintegral-Terme sur qui linke page et Aufspaltung
' des 'Restfehler-Integrals' dans deux Teile peux cet forme aussi suivant-
' maßen dargestellt volonté:
' x+h x-h
' y(x+h) - 2y(x) + y(x-h) = INTEGRAL ... + INTEGRAL ...
' x x
' Pour cela zweite Integral wird qui Variable x eh bien substituiert par: u = 2*x-t
' ensuite gilt sur Grund qui Kettenregel:
' x-h x+h
' INTEGRAL (x-h-t) * y"(t).dt = - INTEGRAL (x+h-u)*y"(u).du
' x x
' et qui Ableitung .du rück-substituiert (trop .-dt) liefert ensuite:
' x+h
' du=-dt ==> = INTEGRAL (x+h-t)*y"(2x-t).dt
' x
' Somit peux on écrivons: x+h
' y(x+h) - 2*y(x) + y(x-h) = INTEGRAL (x+h-t)*[y"(t)+y"(2x-t)].dt
' x
' eh bien verwenden wir sous Hinweis, qui oui y"(x)=f(x,y,y') gilt, folgenden Ausdruck
' comme Interpolationspolynom:
' x_n+1
' y_n+1 - y_n + y_n-1 = INTEGRAL (x_n+1 - t)*[P(t)+P(2*x_n - 1)].dt = ...
' x_n
' x_n+1
' ...= h^2*INTEGRAL (x_n+1 -t)*[O_00*Div(f_n)+O_11*Div(f_n)+O_22*Div(f_n)].dt ,
' x_n
' 1 |(-s) (m)|
' wobei O_mm = -1^m * INTEGRAL (1-s)*| + | .ds
' 0 |( m) (s)|
' (vgl. aussi 'Adams-Bashford-Methode')
' Letzteres bringt uns schließlich trop STORMER's Formeln:
' ==================================================================================
' Explizit formuliert: y_n+1 -2*y_n + y_n-1 = h^2/12 * [13 * f_n - 2*f_n-1 + f_n-2]
' cela interessierende y_n+1 = h^2/12 * [13 * f_n - 2*f_n-1 + f_n-2]+ 2*y_n - y_n-1
' (f_n+1 muss pas bekannt son: Prognoserechnung chez aktuell ergänzten Zeitreihen)
' ----------------------------------------------------------------------------------
' ou bien implizit: y_n+1 -2*y_n + y_n-1 = h^2/12 * [f_n+1 + 10 * f_n + f_n-1 ]
'}==================================================================================
|
|