Oscylator harmoniczny prosty w postaci masy m, która jest przyczepiona do sprężyny o stałej sprężystości k i ślizga się bez tarcia po poziomej powierzchni.

(Subscript[x, 1 ])- długość swobodnej sprężyny 
(Subscript[x, 2 ])- długość rozciągniętej lub ściśnietej sprężyny 
Istotnym parametrem jest różnica x =  (Subscript[x, 2 ])- (Subscript[x, 1 ])

(*Energia kinetyczna punktowej masy*)

Ekin=(1/2)*m*x'[t]^2

(* Energia potencjalna zależy wyłącznie od rozciągnięcia sprężyny *)

Epot=(1/2)*k*x[t]^2

L=FullSimplify[Ekin-Epot]

Etot=FullSimplify[Ekin+Epot]

d1=D[L,x'[t]]

d2=D[L,x[t]]

d3=D[d1,t]

eq=FullSimplify[Solve[d3==d2,x''[t]]]

eq2=eq/. Rule->Equal

(* Parametry układu:
masa m oraz stała sprężystości sprężyny k *)

m=0.25; (* kg *)

k=1;  (* N/m *)

(* Warunki początkowe: 
położenie masy (x0) oraz jej prędkość (v0) w chwili t=0  *)

x0=0;  (* m *)

v0=5;   (* m/s *)

tmax=100;(* s *)

eq2[[1]][[1]]

numerycznie=NDSolve[{eq2[[1]][[1]],x[0]==x0,x'[0]==v0},x[t],{t,0,tmax}]

Flatten[numerycznie]

(* Wyciągam funkcję x[t] z numerycznego rozwiązania *)

x[t_]:=Evaluate[x[t]/.Flatten[numerycznie]]

(* Teraz mogę używać funkcji x[t] tak,jak innych funkcji *)

x[3]

x'[11]

Plot[x[t],{t,0,tmax},PlotRange->All,AxesLabel->{"t [s]","x(t) [m]"}]

Plot[x'[t],{t,0,tmax},PlotRange->All,AxesLabel->{"t [s]","x'(t) [m/s]"}]

Plot[Evaluate[Ekin],{t,0,tmax},PlotRange->All,AxesLabel->{"t [s]","Ekin(t) [J]"}]

Plot[Evaluate[Epot],{t,0,tmax},PlotRange->All,AxesLabel->{"t [s]","Epot(t) [J]"}]

Plot[Evaluate[Etot],{t,0,tmax},PlotRange->All,AxesLabel->{"t [s]","Etot(t) [J]"}]

(* Modelowanie ruchu wahadła przy pomocy wbudowanych obiektów graficznych. Ruch sprężyny przygotowany został od podstaw w notebooku sprezyna.nb. Teraz korzystam jedynie z wyników. *)

(* pomocnicza funkcja do zdefiniowania łamanej udającej sprężynę *)

g[x_,a_]:=If[x≥a/18&&x≤17*a/18,(1/3)*Sin[18*Pi/a*(x-a/18)],0]

Plot[g[x,9],{x,0,9},Axes->True]

tab1[a_]:=Simplify[Table[{x,g[x,a]},{x,0,a,a/36}],a>0]

(* tab1[9]  *)

spr1[a_]:=Line[tab1[a]]

(*
Show[Graphics[spr1[6]],Axes->True,PlotRange->{{0,9},{-1,1}}]
Show[Graphics[spr1[9]],Axes->True,PlotRange->{{0,9},{-1,1}}]
tab1[a]
Transpose[tab1[a]]
Transpose[tab1[a]][[1]]
Transpose[tab1[a]][[1]]+4
*)

tab2[xp_,yp_,xk_]:=Transpose[{Transpose[tab1[xk-xp]][[1]]+xp,Transpose[tab1[xk-xp]][[2]]+yp}]

Simplify[tab1[a]==tab2[0,0,a]]

(* pozioma sprężyna o początku w punkcie (xp,yp) i końcu w punkcie (xk,yp)  *)

SprezynaPozioma[xp_,yp_,xk_]:=Line[tab2[xp,yp,xk]]

(* Graphics[SprezynaPozioma[1,1,10]] *)

(* Długość swobodnej sprężyny *)

x1=8;

f[t_]:=x1+x[t]; (* x2: położenie końca sprężyny w czasie ruchu masy m; ta wielkość musi być dodatnia, by symulacja wyglądała rozsądnie  *)

Plot[f[t],{t,0,tmax}]

spr2[xp_,yp_,t_]:=SprezynaPozioma[xp,yp,f[t]]

(* pozioma sprężyna o początku w punkcie (xp,yp) i końcu opisywanym przez funkcję f[t] *)

gspr2[xp_,yp_,t_]:=Graphics[spr2[xp,yp,t]]

masa[t_]:=Rectangle[{f[t],-1},{f[t]+1,1}];

gmasa[t_]:=Graphics[masa[t]];

masa2[t_]:=Polygon[{{f[t],-1},{f[t]+1,-1},{f[t]+1,1},{f[t],1},{f[t],-1}}];

gmasa2[t_]:=Graphics[masa2[t]];

masa3[t_]:=Line[{{f[t],-1},{f[t]+1,-1},{f[t]+1,1},{f[t],1},{f[t],-1}}];

gmasa3[t_]:=Graphics[{Thick,masa3[t]}];

(* kreska pionowa w miejscu umocowania sprężyny *)

pion[xp_]:=Line[{{xp,-1},{xp,1}}]

gpion[xp_]:=Graphics[{Thick,pion[xp]}]

(* pozioma powierzchna, po której przesuwa się masa m; zakres tej linii powinien być określony przez minimalną i maksymalną wartość f[t] dla t ∈ [0,tmax] *)

poziom=Line[{{-2,-1.1},{14,-1.1}}];

gpoziom=Graphics[{Thick,poziom}];

Animate[Show[gspr2[0,0,t],gpoziom,gpion[0],gmasa3[t],PlotRange->{{-1,12},{-1.1,1}}],{t,0,tmax}]