brky.ai
Scientific Programming – Course Project Bilimsel Programlama – Ders Projesi

Damped Spring-Mass
System
Sönümlü Yay-Kütle
Sistemi

A numerical and analytical study of damped harmonic oscillators, comparing forward Euler integration with exact solutions across underdamped, critically damped, and overdamped regimes. Developed as a final project for the Scientific Programming course at Marmara University. Sönümlü harmonik osilatörlerin sayısal ve analitik incelemesi; ileri Euler entegrasyonu ile az sönümlü, kritik sönümlü ve aşırı sönümlü rejimlerde kesin çözümlerin karşılaştırılması. Marmara Üniversitesi Bilimsel Programlama dersi final projesi olarak geliştirilmiştir.

pythonnumpyodeharmonic-motion İletişim: Berkay Yılmaz –contact@brky.ai
§1 – Theory §1 – Teori

Physical Model Fiziksel Model

A mass $m$ hangs from a vertical spring with stiffness $k$ and natural length $L_0$. The system experiences three forces: the restoring spring force (Hooke's law), a viscous damping force proportional to velocity, and gravity. We work in a coordinate system where $x$ measures displacement from the static equilibrium position, with positive $x$ pointing downward.

At equilibrium the spring force balances gravity, so the equilibrium extension is $\delta_{\text{eq}} = mg/k$. By measuring displacement from this point, the gravity term drops out of the equation of motion entirely — the oscillation is governed purely by the spring restoring force and damping.

$m$ kütleli bir cisim, yay sabiti $k$ ve doğal uzunluğu $L_0$ olan dikey bir yaya asılıdır. Sisteme üç kuvvet etki eder: geri çağırıcı yay kuvveti (Hooke yasası), hıza oransal viskoz sönüm kuvveti ve yerçekimi. $x$, statik denge konumundan ölçülen yer değiştirmeyi ifade eder; pozitif yön aşağıdır.

Dengede yay kuvveti yerçekimini dengeler, dolayısıyla denge uzaması $\delta_{\text{eq}} = mg/k$ olur. Yer değiştirme bu noktadan ölçüldüğünde yerçekimi terimi hareket denkleminden tamamen düşer — salınım yalnızca yay geri çağırma kuvveti ve sönüm tarafından yönetilir.

Hooke's Law & Damping Hooke Yasası ve Sönüm

The spring produces a restoring force proportional to displacement. The dashpot produces a force opposing the velocity: Yay, yer değiştirmeyle orantılı bir geri çağırma kuvveti üretir. Sönümleyici ise hıza zıt yönde kuvvet uygular:

$$F_{\text{spring}} = -kx \qquad F_{\text{damp}} = -c\dot{x}$$
$k$ [N/m]: spring constant · $c$ [N·s/m]: damping coefficient $k$ [N/m]: yay sabiti · $c$ [N·s/m]: sönüm katsayısı

Equation of Motion Hareket Denklemi

Applying Newton's second law $F = ma$ with both forces: Her iki kuvvetle Newton'un ikinci yasası $F = ma$ uygulandığında:

$$m\ddot{x} = -kx - c\dot{x} \;\;\Longrightarrow\;\; m\ddot{x} + c\dot{x} + kx = 0$$
Second-order linear ODE with constant coefficients Sabit katsayılı ikinci mertebe lineer ODE

Dividing by $m$ and introducing the natural frequency $\omega_0 = \sqrt{k/m}$ and the damping ratio $\zeta = c\,/\,(2m\omega_0) = c\,/\,(2\sqrt{km})$: $m$'ye bölüp doğal frekans $\omega_0 = \sqrt{k/m}$ ve sönüm oranı $\zeta = c\,/\,(2m\omega_0) = c\,/\,(2\sqrt{km})$ tanımlanarak:

$$\ddot{x} + 2\zeta\omega_0\,\dot{x} + \omega_0^2\,x = 0$$
Standard form – system behavior depends entirely on $\zeta$ Standart form – sistem davranışı tamamen $\zeta$'ye bağlıdır

Characteristic Equation Karakteristik Denklem

Substituting the trial solution $x = e^{rt}$: $x = e^{rt}$ deneme çözümü yerine konarak:

$$r^2 + 2\zeta\omega_0\,r + \omega_0^2 = 0 \;\;\Longrightarrow\;\; r = -\zeta\omega_0 \pm \omega_0\sqrt{\zeta^2 - 1}$$

The discriminant $\Delta = \zeta^2 - 1$ determines three qualitatively different regimes: Diskriminant $\Delta = \zeta^2 - 1$, niteliksel olarak farklı üç rejimi belirler:

Underdamped ($\zeta < 1$) Az Sönümlü ($\zeta < 1$)

Roots are complex: $r = -\zeta\omega_0 \pm i\omega_d$ where $\omega_d = \omega_0\sqrt{1 - \zeta^2}$ is the damped angular frequency. The solution oscillates inside an exponential envelope: Kökler karmaşıktır: $r = -\zeta\omega_0 \pm i\omega_d$, burada $\omega_d = \omega_0\sqrt{1 - \zeta^2}$ sönümlü açısal frekanstır. Çözüm, üstel bir zarf içinde salınır:

$$x(t) = e^{-\zeta\omega_0 t}\!\left[A\cos(\omega_d t) + B\sin(\omega_d t)\right]$$ $$A = x_0, \quad B = \frac{\dot{x}_0 + \zeta\omega_0\,x_0}{\omega_d}$$
Oscillation period: $T_d = 2\pi/\omega_d$ · Decay time constant: $\tau = 1/(\zeta\omega_0)$ Salınım periyodu: $T_d = 2\pi/\omega_d$ · Sönüm zaman sabiti: $\tau = 1/(\zeta\omega_0)$

Critically Damped ($\zeta = 1$) Kritik Sönümlü ($\zeta = 1$)

Repeated real root $r = -\omega_0$. The system returns to equilibrium in the shortest time without oscillating: Tekrarlı reel kök $r = -\omega_0$. Sistem, salınım yapmadan en kısa sürede dengeye döner:

$$x(t) = (C_1 + C_2\,t)\,e^{-\omega_0 t}$$ $$C_1 = x_0, \quad C_2 = \dot{x}_0 + \omega_0\,x_0$$
$c_{\text{crit}} = 2\sqrt{km} = 2m\omega_0$ – the critical damping coefficient $c_{\text{krit}} = 2\sqrt{km} = 2m\omega_0$ – kritik sönüm katsayısı

Overdamped ($\zeta > 1$) Aşırı Sönümlü ($\zeta > 1$)

Two distinct negative real roots. The system decays exponentially without oscillation, but more slowly than critical damping: İki farklı negatif reel kök. Sistem salınım yapmadan üstel olarak söner, ancak kritik sönümden daha yavaştır:

$$r_{1,2} = -\zeta\omega_0 \pm \omega_0\sqrt{\zeta^2 - 1}$$ $$x(t) = C_1\,e^{r_1 t} + C_2\,e^{r_2 t}$$ $$C_1 = \frac{\dot{x}_0 - r_2\,x_0}{r_1 - r_2}, \quad C_2 = \frac{r_1\,x_0 - \dot{x}_0}{r_1 - r_2}$$

Quick Reference Hızlı Başvuru Tablosu

RegimeRejim ConditionKoşul BehaviorDavranış
UnderdampedAz sönümlü$\zeta < 1$Oscillates with decaying amplitudeAzalan genlikle salınır
Critically dampedKritik sönümlü$\zeta = 1$Fastest return without oscillationSalınımsız en hızlı dönüş
OverdampedAşırı sönümlü$\zeta > 1$Slow exponential decay, no oscillationYavaş üstel sönüm, salınım yok

Energy Analysis Enerji Analizi

The total mechanical energy is the sum of kinetic and elastic potential energy. The damping force continuously removes energy from the system: Toplam mekanik enerji, kinetik ve elastik potansiyel enerjinin toplamıdır. Sönüm kuvveti sistemden sürekli enerji çeker:

$$E(t) = \underbrace{\tfrac{1}{2}m\dot{x}^2}_{\text{KE}} + \underbrace{\tfrac{1}{2}kx^2}_{\text{PE}} \qquad \frac{dE}{dt} = -c\,\dot{x}^2 \leq 0$$
Energy is strictly non-increasing · For $c = 0$, $E$ is constant (simple harmonic motion) Enerji kesinlikle azalmaz · $c = 0$ için $E$ sabittir (basit harmonik hareket)
NoteNot By working relative to the equilibrium position, gravity drops out of both the equation of motion and the energy expression. The full vertical spring-mass equation is $m\ddot{y} + c\dot{y} + k(y - L_0) = -mg$; substituting $x = y - y_{\text{eq}}$ where $y_{\text{eq}} = L_0 - mg/k$ yields the canonical form above. Denge konumuna göre çalışıldığında yerçekimi hem hareket denkleminden hem de enerji ifadesinden düşer. Tam dikey yay-kütle denklemi $m\ddot{y} + c\dot{y} + k(y - L_0) = -mg$'dir; $x = y - y_{\text{eq}}$ yerine konarak ($y_{\text{eq}} = L_0 - mg/k$) yukarıdaki kanonik form elde edilir.
§1.1 – Default Parameters §1.1 – Varsayılan Parametreler
SymbolSembol ValueDeğer DescriptionAçıklama
m0.65 kgMassKütle
k5.5 N/mSpring constantYay sabiti
c0.8 N·s/mDamping coefficientSönüm katsayısı
x₀0.15 mInitial displacement from equilibriumDengeden başlangıç yer değiştirmesi
ẋ₀0.0 m/sInitial velocityBaşlangıç hızı
Δt0.01 sIntegration time stepEntegrasyon zaman adımı
ω₀≈ 2.91 rad/sNatural frequency $\sqrt{k/m}$Doğal frekans $\sqrt{k/m}$
ζ≈ 0.212Damping ratio (underdamped)Sönüm oranı (az sönümlü)
§2 – Code §2 – Kod

Numerical Method: Forward Euler Sayısal Yöntem: İleri Euler

We integrate the second-order ODE as a system of two first-order equations. At each time step, acceleration is computed from the current state, then velocity and position are updated explicitly:

İkinci mertebe ODE'yi iki birinci mertebe denklem sistemi olarak entegre ediyoruz. Her zaman adımında ivme mevcut durumdan hesaplanır, ardından hız ve konum açıkça güncellenir:

$$a^{(n)} = -\frac{k\,x^{(n)} + c\,v^{(n)}}{m}$$ $$v^{(n+1)} = v^{(n)} + a^{(n)}\,\Delta t \qquad x^{(n+1)} = x^{(n)} + v^{(n)}\,\Delta t$$
First-order explicit scheme – $\mathcal{O}(\Delta t)$ local truncation error Birinci derece açık şema – $\mathcal{O}(\Delta t)$ yerel kesme hatası
StabilityKararlılık Forward Euler can introduce spurious energy growth in oscillatory systems. For the damped oscillator, stability requires $\Delta t < 2/(\zeta\omega_0)$. With defaults ($\zeta\omega_0 \approx 0.615\;\text{s}^{-1}$, $\Delta t = 0.01\;\text{s}$), this is easily satisfied. For comparison, the analytical solution is plotted alongside the numerical result. İleri Euler, salınımlı sistemlerde yapay enerji artışına neden olabilir. Sönümlü osilatör için kararlılık $\Delta t < 2/(\zeta\omega_0)$ gerektirir. Varsayılanlarla ($\zeta\omega_0 \approx 0.615\;\text{s}^{-1}$, $\Delta t = 0.01\;\text{s}$) bu kolaylıkla sağlanır. Karşılaştırma için analitik çözüm sayısal sonucun yanına çizilir.

Data StructuresVeri Yapıları

spring_mass_system.pyPython
@dataclass
class Spring:
    k: float              # spring constant [N/m]
    natural_length: float  # rest length [m]

    def force(self, displacement: float) -> float:
        return -self.k * displacement


@dataclass
class Damper:
    c: float  # damping coefficient [N·s/m]

    def force(self, velocity: float) -> float:
        return -self.c * velocity


@dataclass
class SpringMassSystem:
    mass: float    # [kg]
    spring: Spring
    damper: Damper

Core Physics EngineFizik Motoru

spring_mass_system.py – solve_euler()Python
def solve_euler(self, x0, v0, t_span, dt):
    """Euler integration for damped spring-mass (relative to equilibrium)."""
    num_steps = int((t_span[1] - t_span[0]) / dt)
    t = np.linspace(t_span[0], t_span[1], num_steps)
    x = np.zeros(num_steps)
    v = np.zeros(num_steps)
    a = np.zeros(num_steps)

    x[0], v[0] = x0, v0

    for i in range(1, num_steps):
        a[i - 1] = (self.spring.force(x[i - 1])
                     + self.damper.force(v[i - 1])) / self.mass
        v[i] = v[i - 1] + a[i - 1] * dt
        x[i] = x[i - 1] + v[i - 1] * dt

    a[-1] = (self.spring.force(x[-1])
              + self.damper.force(v[-1])) / self.mass

    pe = 0.5 * self.spring.k * x ** 2
    ke = 0.5 * self.mass * v ** 2

    return t, x, v, a, pe, ke

Project StructureProje Yapısı

file treeShell
.
├── spring_mass_system.py   # physics engine + static plots
├── animate_system.py       # matplotlib animation (6-panel + spring viz)
├── requirements.txt        # numpy, matplotlib, scipy
├── README.md
├── animation_1.gif
└── animation_2.gif

Installation & UsageKurulum ve Kullanım

terminalBash
git clone https://github.com/berkayilmaaz/Spring-Mass-Simulation.git
cd Spring-Mass-System
pip install -r requirements.txt

python spring_mass_system.py     # static plots
python animate_system.py         # animated dashboard
§3 – Results§3 – Sonuçlar

Live AnimationCanlı Animasyon

Watch the spring-mass system oscillate in real time. The spring coils stretch and compress as the mass moves. Blue = Euler, dashed pink = analytical solution. Yay-kütle sisteminin gerçek zamanlı salınımını izleyin. Yay kangalları kütle hareket ettikçe uzar ve kısalır. Mavi = Euler, kesikli pembe = analitik çözüm.

t = 0.00s

Static DashboardStatik Grafik Paneli

§3.1 – Parameter Sweeps§3.1 – Parametre Taramaları

Each sweep varies one parameter while holding others at defaults. The three damping regimes are clearly visible in the damping sweep. Her taramada bir parametre değişirken diğerleri varsayılan değerde tutulur. Sönüm taramasında üç sönüm rejimi açıkça görülür.

§3.2 – Energy Dissipation§3.2 – Enerji Kayıpları

Without damping, total mechanical energy is perfectly conserved. With damping, energy is monotonically dissipated as heat. The rate of dissipation is $P = c\dot{x}^2$, which peaks at maximum velocity. Sönümsüz durumda toplam mekanik enerji tamamen korunur. Sönümlü durumda enerji monoton olarak ısıya dönüşür. Kayıp gücü $P = c\dot{x}^2$ olup maksimum hızda zirve yapar.

§4 – Interactive Simulator§4 – İnteraktif Simülatör

Try It YourselfKendiniz Deneyin

5.5 N/m
0.65 kg
0.80 N·s/m
0.15 m
0.00 m/s
§5 – Conclusion§5 – Sonuç

ConclusionSonuç

This project demonstrates the rich behavior of the damped spring-mass system across three qualitatively distinct regimes. The damping ratio $\zeta$ fully determines the character of the response: oscillatory decay for $\zeta < 1$, optimal aperiodic return for $\zeta = 1$, and sluggish exponential settling for $\zeta > 1$. Energy analysis confirms that the damper continuously extracts kinetic energy at a rate proportional to $\dot{x}^2$.

The forward Euler scheme matches the analytical solution well for small time steps, though accumulated phase error becomes visible over many oscillation periods. Possible extensions include higher-order integrators (RK4, Verlet), nonlinear springs (Duffing oscillator), forced oscillations and resonance, and coupled multi-mass systems.

Bu proje, sönümlü yay-kütle sisteminin niteliksel olarak farklı üç rejim boyunca zengin davranışını göstermektedir. Sönüm oranı $\zeta$, yanıtın karakterini tamamen belirler: $\zeta < 1$ için salınımlı sönüm, $\zeta = 1$ için optimal aperiyodik dönüş ve $\zeta > 1$ için yavaş üstel yerleşme. Enerji analizi, sönümleyicinin $\dot{x}^2$ ile orantılı bir hızda sürekli kinetik enerji çektiğini doğrular.

İleri Euler şeması küçük zaman adımlarında analitik çözümle iyi uyuşur, ancak birçok salınım periyodu boyunca birikimli faz hatası görünür hale gelir. Olası genişletmeler: yüksek mertebe entegratörler (RK4, Verlet), lineer olmayan yaylar (Duffing osilatörü), zorlanmış salınımlar ve rezonans, ve bağlaşık çok kütleli sistemler.

Berkay Yılmaz

Berkay Yılmaz

Lead Developer & Researcher Proje Geliştiricisi & Araştırmacı

Physics graduate specializing in computational simulations and AI. Passionate about merging physical laws with modern software architecture. Hesaplamalı simülasyonlar ve yapay zeka üzerine uzmanlaşmış fizik mezunu. Fiziksel yasaları modern yazılım mimarisiyle birleştirme tutkusuyla çalışıyor.