File size: 2,482 Bytes
27be395
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

const state = {
    m: 1.0,
    k: 100,
    c: 5.0,
    F0: 10,
    p: 5.0,
    u0: 0.0,
    v0: 0.0,
    tMax: 10.0,
    dt: 0.001
};

function derivatives(t, u, v) {
    const u_prime = v;
    const v_prime = (state.F0 * Math.sin(state.p * t) - state.c * v - state.k * u) / state.m;
    return { u_prime, v_prime };
}

function solve() {
    let t = 0;
    let u = state.u0;
    let v = state.v0;
    let maxU = 0;

    const steps = Math.ceil(state.tMax / state.dt);
    for (let i = 0; i <= steps; i++) {
        const k1 = derivatives(t, u, v);
        const t2 = t + state.dt / 2;
        const u2 = u + k1.u_prime * state.dt / 2;
        const v2 = v + k1.v_prime * state.dt / 2;
        const k2 = derivatives(t2, u2, v2);
        const t3 = t + state.dt / 2;
        const u3 = u + k2.u_prime * state.dt / 2;
        const v3 = v + k2.v_prime * state.dt / 2;
        const k3 = derivatives(t3, u3, v3);
        const t4 = t + state.dt;
        const u4 = u + k3.u_prime * state.dt;
        const v4 = v + k3.v_prime * state.dt;
        const k4 = derivatives(t4, u4, v4);

        u += (state.dt / 6) * (k1.u_prime + 2 * k2.u_prime + 2 * k3.u_prime + k4.u_prime);
        v += (state.dt / 6) * (k1.v_prime + 2 * k2.v_prime + 2 * k3.v_prime + k4.v_prime);
        t += state.dt;

        if (Math.abs(u) > maxU) maxU = Math.abs(u);
    }
    return { finalU: u, maxU: maxU };
}

function runTest(name, params) {
    Object.assign(state, params);
    const res = solve();
    console.log(`Test: ${name}`);
    console.log(`  Params: ${JSON.stringify(params)}`);
    console.log(`  Result: Max |u| = ${res.maxU.toFixed(5)}, Final u = ${res.finalU.toFixed(5)}`);
    return res;
}

console.log("--- Verification Suite ---");

// 1. Zero Values
runTest("Zero Values", { m: 1, k: 100, c: 5, F0: 0, p: 0, u0: 0, v0: 0 });

// 2. Resonance (omega_n = 10)
// Low damping to see large amplitude
runTest("Resonance", { m: 1, k: 100, c: 1, F0: 10, p: 10, u0: 0, v0: 0 });

// 3. Underdamped Free Vibration (zeta = 0.25)
runTest("Underdamped Free", { m: 1, k: 100, c: 5, F0: 0, p: 0, u0: 1, v0: 0 });

// 4. Critically Damped Free Vibration (zeta = 1.0)
// c = 2 * sqrt(1 * 100) = 20
runTest("Critically Damped Free", { m: 1, k: 100, c: 20, F0: 0, p: 0, u0: 1, v0: 0 });

// 5. Overdamped Free Vibration (zeta = 2.0)
// c = 40
runTest("Overdamped Free", { m: 1, k: 100, c: 40, F0: 0, p: 0, u0: 1, v0: 0 });