Inspect locally
Do not run the notebook before reviewing it. Verify the archive, then use KaimonSlate's inactive view, which does not start a worker or evaluate cells.
using DocumenterSlate
verify_slate_bundle("laplace_lesson.tar.gz")
using KaimonSlate
KaimonSlate.serve_notebook("laplace_lesson.jl"; inactive = true)
This notebook is arbitrary code. Instantiating its environment may run package build scripts, and live opening may execute cells.
Download source · Checksums · Provenance · Local instructions
Verify after downloading the directory: sha256sum -c SHA256SUMS.
Inspect without starting a worker or executing cells:
using KaimonSlate
KaimonSlate.serve_notebook("laplace_lesson.jl"; inactive = true)| Artifact | SHA-256 |
|---|---|
Dockerfile | d31c65b1308c9c75658f1149ad498ef75cea1f41c8330d405c8d8ad105520a39 |
Manifest.toml | f2810a9c1f516c881f51e12fab61cc4585349cfe850622943394aa8a08efc065 |
PROVENANCE.toml | 555e8aa4b033b530d03791465701ef72c3a3438b9279bce4bc3198a9ef95736d |
Project.toml | 47810962ec0e39b7dd20de00dcef692ba653519f69bb872450bf0eaa67688d07 |
README.md | 7044c064ef78527786f5273f47b357aa83b6ca233b9bb980617bb144e42f25f4 |
devcontainer.json | 441c16daeecacf87bd95b9800e25c8e8b4a7c785439983e980fb6a04614ec573 |
laplace_lesson.jl | 4c5e298cb974445119b5ed2a92e3a464e0198bac4c08e0dfdcf8156f8a11efde |
laplace_lesson.tar.gz | 6c57957c8f7af01d3b4a4403093b0a80724cf3b855e7675779f6c552402b0be5 |
using Giac
using Giac.Commands: laplace, ilaplace, simplify, factor, partfrac, solve
using GiacSlate # the lesson's autograder: check / grade / course_report
# Domains
@giac_var t # time
@giac_var s # complex frequency
# Symbolic parameters you'll use when writing answers
@giac_var a # decay rate (Sections 1–2)
@giac_var w # angular frequency ω
@giac_var N0 # initial amount
@giac_var m; @giac_var b; @giac_var k # mass, damping, stiffness
# Worked results and your answers are typeset by dropping GiacExpr values straight
# into markdown with `{{ … }}` — no LaTeX plumbing needed.
"Kernel ready — domains t, s; parameters a, w, N0, m, b, k; grader loaded."Kernel ready — domains t, s; parameters a, w, N0, m, b, k; grader loaded.The Laplace Transform
An interactive physics lesson, with graded exercises
A working introduction for students: learn the Laplace transform by using it to solve real physics problems — decaying charge on a capacitor, a damped oscillator, driven resonance — then check your understanding with exercises that grade themselves. Every symbolic result below is computed live by the Giac computer algebra system, so you can change a number and watch the mathematics follow.
What is the Laplace transform?
The Laplace transform sends a function of time $f(t)$ to a function of a complex variable $s$:
\[F(s) \;=\; \mathcal{L}\{f\}(s) \;=\; \int_0^{\infty} f(t)\,e^{-st}\,dt .\]
Its superpower for physics is this: differentiation in time becomes multiplication by $s$. A differential equation — the language of every mechanical, electrical, and thermal system — turns into ordinary algebra. Solve the algebra in the $s$-domain, then transform back to get the motion $x(t)$, the charge $q(t)$, the temperature $T(t)$.
We'll build the idea up through three physical systems: exponential decay, a first-order RC circuit, and the damped harmonic oscillator.
How the exercises work. Most answers are typed straight into a live math field — the little boxed
giac"…"expression in each exercise cell. Click it and type your answer in ordinary math notation (fractions, powers,sin, …), or pop up the on-screen keyboard with the ⌨ button. Press <kbd>Enter</kbd> or <kbd>Tab</kbd> to commit; the check cell just below re-runs automatically and grades you. Symbolic answers go through the Giac algebra system, so any algebraically-equivalent form counts — green ✓ means you've got it. A blank field just reads as "not answered yet". A few exercises ask for a small Julia function instead (you'll seemissingto replace). A running score sits at the very bottom.
Section 1 · Meeting the transform
Let's compute a couple of transforms straight from the definition so you can see the machine turning. Giac evaluates the integral $\int_0^\infty f(t)e^{-st}dt$ for us — but the point is the pattern, so keep the definition in mind.
(Giac.GiacExpr(Ptr{Nothing}(0x000000000000076f)), Giac.GiacExpr(Ptr{Nothing}(0x0000000000000771)), Giac.GiacExpr(Ptr{Nothing}(0x0000000000000773)))\[\mathcal{L}\{1\} = {{ L_one }} \qquad \mathcal{L}\{t\} = {{ L_lin }} \qquad \mathcal{L}\{t^{2}\} = {{ L_sq }}\]
Notice the pattern: each power of $t$ climbs one power of $\tfrac{1}{s}$.
Exercise 1.1 — the exponential. A decaying exponential $e^{-at}$ (a radioactive sample, a discharging capacitor) is the most important signal in physics. Give its Laplace transform as an expression in s and a.
# Click the empty math field and type L{e^{-a t}}, as an expression in s and a:
L_exp = giac""missingcheck(:lap_exp, L_exp)GiacSlate.GradeReport(GiacSlate.Section(:transforms, "Section 1 · Meeting the transform", "You can move a signal into the s-domain and back. That round trip is the whole game.", GiacSlate.Exercise[GiacSlate.Exercise(:lap_exp, "1.1 · Transform of a decaying exponential", "From the definition \$\\mathcal{L}\\{f\\}=\\int_0^\\infty f(t)e^{-st}dt\$, the integral of \$e^{-at}e^{-st}\$ is a geometric-style decay. The pole sits at \$s=-a\$.", GiacSlate.var"#21#22"())]), GiacSlate.ExResult[GiacSlate.ExResult(:lap_exp, "1.1 · Transform of a decaying exponential", "From the definition \$\\mathcal{L}\\{f\\}=\\int_0^\\infty f(t)e^{-st}dt\$, the integral of \$e^{-at}e^{-st}\$ is a geometric-style decay. The pole sits at \$s=-a\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}\\{e^{-at}\\}\$: not answered yet", "type your answer into the math field above")])], true)Exercise 1.2 — the oscillation. Oscillations are the other half of physics. Give the Laplace transform of $\sin(\omega t)$ as an expression in s and w (use w for $\omega$).
# Click the empty math field and type L{sin(ω t)}, as an expression in s and ω:
L_sin = giac""missingcheck(:lap_sin, L_sin)GiacSlate.GradeReport(GiacSlate.Section(:transforms, "Section 1 · Meeting the transform", "You can move a signal into the s-domain and back. That round trip is the whole game.", GiacSlate.Exercise[GiacSlate.Exercise(:lap_sin, "1.2 · Transform of a sine", "Write \$\\sin(\\omega t)=\\tfrac{1}{2i}(e^{i\\omega t}-e^{-i\\omega t})\$ and transform each exponential, or recall the standard pair. The denominator is \$s^2+\\omega^2\$.", GiacSlate.var"#23#24"())]), GiacSlate.ExResult[GiacSlate.ExResult(:lap_sin, "1.2 · Transform of a sine", "Write \$\\sin(\\omega t)=\\tfrac{1}{2i}(e^{i\\omega t}-e^{-i\\omega t})\$ and transform each exponential, or recall the standard pair. The denominator is \$s^2+\\omega^2\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}\\{\\sin\\omega t\\}\$: not answered yet", "type your answer into the math field above")])], true)Exercise 1.3 — going back. The transform is only useful if you can return to the time domain. What time signal $f(t)$ has transform $\dfrac{s}{s^{2}+\omega^{2}}$? Give $f(t)$ as an expression in t and w.
# Type the time signal f(t) whose transform is s/(s²+w²), in terms of t and w:
f_cos = giac""missingcheck(:inv_lap, f_cos)GiacSlate.GradeReport(GiacSlate.Section(:transforms, "Section 1 · Meeting the transform", "You can move a signal into the s-domain and back. That round trip is the whole game.", GiacSlate.Exercise[GiacSlate.Exercise(:inv_lap, "1.3 · An inverse transform", "Which time signal has transform \$\\dfrac{s}{s^2+\\omega^2}\$? Differentiate your Section-1.2 answer, or match the standard pair — no extra \$1/\\omega\$ this time.", GiacSlate.var"#25#26"())]), GiacSlate.ExResult[GiacSlate.ExResult(:inv_lap, "1.3 · An inverse transform", "Which time signal has transform \$\\dfrac{s}{s^2+\\omega^2}\$? Differentiate your Section-1.2 answer, or match the standard pair — no extra \$1/\\omega\$ this time.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}^{-1}\\{s/(s^2+\\omega^2)\\}\$: not answered yet", "type your answer into the math field above")])], true)Section 2 · First-order systems — decay
Now the payoff. A radioactive sample loses atoms at a rate proportional to how many remain; a capacitor bleeds charge through a resistor the same way. Both obey
\[\dot y(t) = -a\,y(t), \qquad y(0) = y_0 .\]
The key transform rule is $\mathcal{L}\{\dot y\} = sY(s) - y(0)$ — the initial condition rides along for free. So the whole ODE becomes the algebraic equation
\[sY(s) - y_0 = -a\,Y(s).\]
Worked example. A hot object cools as $\dot T = -\tfrac12 T$, $T(0)=100$. Watch Giac solve it by the Laplace method:
(Giac.GiacExpr(Ptr{Nothing}(0x0000000000000777)), Giac.GiacExpr(Ptr{Nothing}(0x0000000000000778)))\[sT(s) - 100 = -\tfrac{1}{2}T(s)\]
\[T(s) = {{ Ts }}\]
\[T(t) = \mathcal{L}^{-1}\{T(s)\} = {{ Tt }}\]
The algebra happened in the $s$-domain; the last step carried us back to a cooling curve in time.
Exercise 2.1 — solve for $N(s)$. Now do it in general. For radioactive decay $\dot N = -aN,\; N(0)=N_0$, the transform gives $sN(s) - N_0 = -a\,N(s)$. Solve that for $N(s)$ (an expression in s, a, and N0).
# Solve sN(s) - N0 = -a N(s) for N(s). Type it in the field, in terms of s, a, N0:
N_s = giac""missingcheck(:decay_transform, N_s)GiacSlate.GradeReport(GiacSlate.Section(:firstorder, "Section 2 · First-order systems — decay", "Radioactive decay and an RC circuit are the same equation. Laplace turns the ODE into algebra.", GiacSlate.Exercise[GiacSlate.Exercise(:decay_transform, "2.1 · Transform the decay law", "Radioactive decay obeys \$\\dot N=-aN,\\;N(0)=N_0\$. Transforming gives \$sN(s)-N_0=-aN(s)\$. Solve that algebraic equation for \$N(s)\$.", GiacSlate.var"#31#32"())]), GiacSlate.ExResult[GiacSlate.ExResult(:decay_transform, "2.1 · Transform the decay law", "Radioactive decay obeys \$\\dot N=-aN,\\;N(0)=N_0\$. Transforming gives \$sN(s)-N_0=-aN(s)\$. Solve that algebraic equation for \$N(s)\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$N(s)\$: not answered yet", "type your answer into the math field above")])], true)Exercise 2.2 — back to time. Invert your $N(s) = N_0/(s+a)$ to get $N(t)$. You already found this pair in Exercise 1.1 — just carry the $N_0$ along. Give $N(t)$ as an expression in t, a, N0.
# Invert N(s) = N0/(s+a) to N(t). Type it in the field, in terms of t, a, N0:
N_t = giac""missingcheck(:decay_solution, N_t)GiacSlate.GradeReport(GiacSlate.Section(:firstorder, "Section 2 · First-order systems — decay", "Radioactive decay and an RC circuit are the same equation. Laplace turns the ODE into algebra.", GiacSlate.Exercise[GiacSlate.Exercise(:decay_solution, "2.2 · Invert to the time domain", "Take \$\\mathcal{L}^{-1}\$ of your \$N(s)=N_0/(s+a)\$. It is the exponential-decay pair from 1.1, scaled by \$N_0\$.", GiacSlate.var"#33#34"())]), GiacSlate.ExResult[GiacSlate.ExResult(:decay_solution, "2.2 · Invert to the time domain", "Take \$\\mathcal{L}^{-1}\$ of your \$N(s)=N_0/(s+a)\$. It is the exponential-decay pair from 1.1, scaled by \$N_0\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$N(t)\$: not answered yet", "type your answer into the math field above")])], true)Exercise 2.3 — half-life (a function). The half-life is the time for $N$ to fall to $N_0/2$. Solve $e^{-a t_{1/2}} = \tfrac12$ for $t_{1/2}$, then write it as a Julia function of the decay rate a.
# Return the half-life for decay rate a. Replace `missing` with your formula.
function half_life(a)
missing
endhalf_lifecheck(:half_life, half_life)GiacSlate.GradeReport(GiacSlate.Section(:firstorder, "Section 2 · First-order systems — decay", "Radioactive decay and an RC circuit are the same equation. Laplace turns the ODE into algebra.", GiacSlate.Exercise[GiacSlate.Exercise(:half_life, "2.3 · Half-life (numeric)", "Write `half_life(a)` returning the time for \$N\$ to fall to \$N_0/2\$: solve \$e^{-a t}=\\tfrac12\$ for \$t\$. Answer in the same time units as \$1/a\$.", GiacSlate.var"#35#36"())]), GiacSlate.ExResult[GiacSlate.ExResult(:half_life, "2.3 · Half-life (numeric)", "Write `half_life(a)` returning the time for \$N\$ to fall to \$N_0/2\$: solve \$e^{-a t}=\\tfrac12\$ for \$t\$. Answer in the same time units as \$1/a\$.", true, GiacSlate.Check[GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 3: not implemented yet", "replace the `missing` with your code")])], true)Section 3 · Second-order systems — oscillation
A mass on a spring with friction — and, by analogy, an RLC circuit, a suspension, a tuned instrument — obeys
\[m\ddot x + b\dot x + k x = F(t).\]
Transforming (at rest) gives $(ms^2 + bs + k)\,X(s) = F(s)$, so the system's entire personality lives in its transfer function $H(s) = X(s)/F(s)$ and the poles — the roots of $ms^2+bs+k$. Two numbers set the behaviour: the natural frequency $\omega_n=\sqrt{k/m}$ and the damping ratio $\zeta=\dfrac{b}{2\sqrt{km}}$.
Explore first. Below, Giac inverts the free response $X(s)=\dfrac{s+2\zeta\omega_n}{s^2+2\zeta\omega_n s + \omega_n^2}$ (release from $x=1$ at rest) symbolically, and we plot it. Slide $\zeta$ through $1$ and watch oscillation give way to a dead crawl.
@bind ζv Slider(0.1, 2.0, 0.25; step=0.05, label="damping ζ")
@bind ωnv Slider(0.5, 4.0, 2.0; step=0.1, label="natural freq ωₙ")
# Free response X(s) = (s + 2ζωₙ) / (s² + 2ζωₙ s + ωₙ²), inverted by Giac.
Xs = Giac.giac_eval(
"(s + 2*$(ζv)*$(ωnv)) / (s^2 + 2*$(ζv)*$(ωnv)*s + $(ωnv)^2)")
xt = build_function(ilaplace(Xs, s, t), t)
ts = collect(range(0, 12; length=400))
xs = clamp.(xt.(ts), -1.5, 1.5)
regime = ζv < 1 ? "under-damped" : ζv ≈ 1 ? "critically damped" : "over-damped"
echart(:line, ts, xs; title="Free response x(t) — $regime (ζ=$ζv, ωₙ=$ωnv)",
smooth=true, symbol="none", areaStyle=(opacity=0.1,),
xAxis=(name="t",), yAxis=(name="x", min=-1.1, max=1.2),
markLine=(silent=true, symbol="none",
data=[(yAxis=0, lineStyle=(type=:dashed, color="#888"))]),
height=380)KaimonSlate.ReportEngine.EChart(Dict{String, Any}("xAxis" => Dict{String, Any}("name" => "t"), "yAxis" => Dict{String, Any}("name" => "x", "max" => 1.2, "min" => -1.1), "animationDurationUpdate" => 300, "textStyle" => Dict{String, Any}("fontFamily" => "inherit"), "tooltip" => Dict{String, Any}("trigger" => "axis"), "title" => Dict{String, Any}("text" => "Free response x(t) — under-damped (ζ=0.25, ωₙ=2.0)"), "__size" => Dict{String, Any}("height" => 380), "series" => Dict{String, Any}[Dict("areaStyle" => Dict{String, Any}("opacity" => 0.1), "data" => [[0.0, 1.0], [0.03007518796992481, 0.998209505129], [0.06015037593984962, 0.992915310212], [0.09022556390977443, 0.984240084767], [0.12030075187969924, 0.972314910972], [0.15037593984962405, 0.957278567359], [0.18045112781954886, 0.939276806303], [0.21052631578947367, 0.918461628072], [0.24060150375939848, 0.894990554119], [0.2706766917293233, 0.869025902239], [0.3007518796992481, 0.840734066103], [0.3308270676691729, 0.81028480162], [0.3609022556390977, 0.77785052246], [0.39097744360902253, 0.74360560698], [0.42105263157894735, 0.707725718682], [0.45112781954887216, 0.670387142227], [0.48120300751879697, 0.631766136907], [0.5112781954887218, 0.592038309362], [0.5413533834586466, 0.551378007206], [0.5714285714285714, 0.509957735109], [0.6015037593984962, 0.467947594741], [0.631578947368421, 0.425514749871], [0.6616541353383458, 0.382822917786], [0.6917293233082706, 0.340031888056], [0.7218045112781954, 0.29729706955], [0.7518796992481203, 0.254769066483], [0.7819548872180451, 0.212593284147], [0.8120300751879699, 0.170909564838], [0.8421052631578947, 0.129851854403], [0.8721804511278195, 0.0895478996692], [0.9022556390977443, 0.0501189769244], [0.9323308270676691, 0.0116796515015], [0.9624060150375939, -0.0256624316041], [0.9924812030075187, -0.0618067262562], [1.0225563909774436, -0.0966599331151], [1.0526315789473684, -0.130136117371], [1.0827067669172932, -0.162156796749], [1.112781954887218, -0.192651000353], [1.1428571428571428, -0.221555298997], [1.1729323308270676, -0.248813807776], [1.2030075187969924, -0.274378161669], [1.2330827067669172, -0.298207465077], [1.263157894736842, -0.320268216236], [1.2932330827067668, -0.340534207535], [1.3233082706766917, -0.358986402782], [1.3533834586466165, -0.375612792565], [1.3834586466165413, -0.390408228861], [1.413533834586466, -0.403374240087], [1.443609022556391, -0.414518827854], [1.4736842105263157, -0.423856246669], [1.5037593984962405, -0.431406767888], [1.5338345864661653, -0.437196429224], [1.5639097744360901, -0.441256771127], [1.593984962406015, -0.44362456137], [1.6240601503759398, -0.44434150917], [1.6541353383458646, -0.443453970169], [1.6842105263157894, -0.4410126436], [1.7142857142857142, -0.437072262954], [1.744360902255639, -0.431691281428], [1.7744360902255638, -0.424931553447], [1.8045112781954886, -0.416858013498], [1.8345864661654134, -0.407538353505], [1.8646616541353382, -0.397042699939], [1.894736842105263, -0.38544329182], [1.9248120300751879, -0.372814160728], [1.9548872180451127, -0.359230813913], [1.9849624060150375, -0.344769921533], [2.0150375939849625, -0.329509009011], [2.045112781954887, -0.313526155465], [2.075187969924812, -0.296899699098], [2.1052631578947367, -0.279707950393], [2.1353383458646618, -0.262028913902], [2.1654135338345863, -0.243940019372], [2.1954887218045114, -0.225517862883], [2.225563909774436, -0.206837958622], [2.255639097744361, -0.187974501876], [2.2857142857142856, -0.169000143735], [2.3157894736842106, -0.149985777982], [2.345864661654135, -0.131000340551], [2.3759398496240602, -0.112110621904], [2.406015037593985, -0.093381092618], [2.43609022556391, -0.0748737423955], [2.4661654135338344, -0.0566479326921], [2.4962406015037595, -0.0387602630707], [2.526315789473684, -0.0212644513587], [2.556390977443609, -0.0042112276226], [2.5864661654135337, 0.0123517580701], [2.6165413533834587, 0.0283800141816], [2.6466165413533833, 0.0438322726536], [2.6766917293233083, 0.0586705404474], [2.706766917293233, 0.0728601378876], [2.736842105263158, 0.0863697240635], [2.7669172932330826, 0.099171309582], [2.7969924812030076, 0.111240257], [2.827067669172932, 0.122555269303], [2.857142857142857, 0.133098366817], [2.887218045112782, 0.142854852993], [2.917293233082707, 0.151813269497], [2.9473684210526314, 0.159965341101], [2.9774436090225564, 0.167305910861], [3.007518796992481, 0.173832866105], [3.037593984962406, 0.179547055764], [3.0676691729323307, 0.184452199608], [3.0977443609022557, 0.188554789931], [3.1278195488721803, 0.191863986278], [3.1578947368421053, 0.194391503784], [3.18796992481203, 0.196151495717], [3.218045112781955, 0.197160430811], [3.2481203007518795, 0.197436965986], [3.2781954887218046, 0.197001815037], [3.308270676691729, 0.195877613895], [3.338345864661654, 0.194088783016], [3.3684210526315788, 0.191661387505], [3.398496240601504, 0.18862299551], [3.4285714285714284, 0.185002535464], [3.4586466165413534, 0.180830152708], [3.488721804511278, 0.176137066027], [3.518796992481203, 0.170955424604], [3.5488721804511276, 0.165318165911], [3.5789473684210527, 0.159258874989], [3.6090225563909772, 0.152811645593], [3.6390977443609023, 0.146010943645], [3.669172932330827, 0.138891473396], [3.699248120300752, 0.131488046712], [3.7293233082706765, 0.123835455847], [3.7593984962406015, 0.115968350051], [3.789473684210526, 0.107921116353], [3.819548872180451, 0.0997277647994], [3.8496240601503757, 0.0914218184436], [3.8796992481203008, 0.0830362083265], [3.9097744360902253, 0.0746031736792], [3.9398496240601504, 0.0661541675469], [3.969924812030075, 0.0577197680103], [4.0, 0.049329595155], [4.030075187969925, 0.0410122339143], [4.06015037593985, 0.0327951628865], [4.090225563909774, 0.0247046892025], [4.120300751879699, 0.0167658894984], [4.150375939849624, 0.00900255702007], [4.180451127819549, 0.0014371548686], [4.2105263157894735, -0.00590922462983], [4.2406015037593985, -0.0130168944661], [4.2706766917293235, -0.0198676014596], [4.3007518796992485, -0.026444548816], [4.330827067669173, -0.032732412827], [4.360902255639098, -0.0387173538275], [4.390977443609023, -0.0443870215395], [4.421052631578948, -0.0497305549507], [4.451127819548872, -0.0547385768909], [4.481203007518797, -0.0594031834816], [4.511278195488722, -0.0637179286485], [4.541353383458647, -0.0676778038988], [4.571428571428571, -0.0712792135753], [4.601503759398496, -0.0745199458094], [4.631578947368421, -0.0773991394043], [4.661654135338346, -0.0799172468865], [4.69172932330827, -0.0820759939711], [4.7218045112781954, -0.0838783356917], [4.7518796992481205, -0.0853284094497], [4.7819548872180455, -0.0864314852415], [4.81203007518797, -0.0871939133251], [4.842105263157895, -0.0876230695881], [4.87218045112782, -0.0877272988793], [4.902255639097745, -0.0875158565673], [4.932330827067669, -0.0869988485863], [4.962406015037594, -0.086187170227], [4.992481203007519, -0.0850924439289], [5.022556390977444, -0.0837269563241], [5.052631578947368, -0.0821035947809], [5.082706766917293, -0.0802357836854], [5.112781954887218, -0.0781374206986], [5.142857142857143, -0.0758228132156], [5.172932330827067, -0.0733066152466], [5.203007518796992, -0.0706037649339], [5.2330827067669174, -0.0677294229072], [5.2631578947368425, -0.0646989116723], [5.293233082706767, -0.0615276562197], [5.323308270676692, -0.0582311260264], [5.353383458646617, -0.0548247786187], [5.383458646616542, -0.0513240048487], [5.413533834586466, -0.0477440760302], [5.443609022556391, -0.0441000930671], [5.473684210526316, -0.040406937695], [5.503759398496241, -0.0366792259499], [5.533834586466165, -0.0329312639606], [5.56390977443609, -0.0291770061566], [5.593984962406015, -0.0254300159662], [5.62406015037594, -0.0217034290726], [5.654135338345864, -0.0180099192832], [5.684210526315789, -0.014361667055], [5.714285714285714, -0.0107703307107], [5.7443609022556394, -0.00724702036866], [5.774436090225564, -0.00380227459746], [5.804511278195489, -0.000446039799426], [5.834586466165414, 0.00281234768532], [5.864661654135339, 0.00596417677089], [5.894736842105263, 0.00900137413963], [5.924812030075188, 0.011916514113], [5.954887218045113, 0.0147028259222], [5.984962406015038, 0.0173541984303], [6.015037593984962, 0.0198651823633], [6.045112781954887, 0.0222309901179], [6.075187969924812, 0.0244474932162], [6.105263157894737, 0.026511217488], [6.135338345864661, 0.0284193360645], [6.165413533834586, 0.0301696602725], [6.195488721804511, 0.0317606285251], [6.225563909774436, 0.0331912933068], [6.2556390977443606, 0.0344613063563], [6.285714285714286, 0.0355709021529], [6.315789473684211, 0.0365208798162], [6.345864661654136, 0.0373125835295], [6.37593984962406, 0.0379478816018], [6.406015037593985, 0.0384291442821], [6.43609022556391, 0.0387592204428], [6.466165413533835, 0.0389414132484], [6.496240601503759, 0.0389794549265], [6.526315789473684, 0.0388774807569], [6.556390977443609, 0.0386400023964], [6.586466165413534, 0.0382718806515], [6.616541353383458, 0.0377782978146], [6.646616541353383, 0.037164729674], [6.676691729323308, 0.0364369173074], [6.706766917293233, 0.0356008387658], [6.7368421052631575, 0.0346626807522], [6.7669172932330826, 0.0336288103957], [6.796992481203008, 0.032505747219], [6.827067669172933, 0.0313001353933], [6.857142857142857, 0.0300187163717], [6.887218045112782, 0.028668301986], [6.917293233082707, 0.0272557480902], [6.947368421052632, 0.025787928828], [6.977443609022556, 0.0242717115974], [7.007518796992481, 0.0227139327813], [7.037593984962406, 0.0211213743072], [7.067669172932331, 0.019500741096], [7.097744360902255, 0.0178586394529], [7.12781954887218, 0.0162015564499], [7.157894736842105, 0.0145358403444], [7.18796992481203, 0.012867682072], [7.2180451127819545, 0.0112030978485], [7.2481203007518795, 0.00954791291], [7.2781954887218046, 0.00790774641495], [7.30827067669173, 0.0062879975279], [7.338345864661654, 0.00469383269953], [7.368421052631579, 0.00313017415259], [7.398496240601504, 0.00160168957926], [7.428571428571429, 0.000112783050624], [7.458646616541353, -0.00133241286514], [7.488721804511278, -0.00273004378373], [7.518796992481203, -0.00407653899649], [7.548872180451128, -0.00536861578873], [7.578947368421052, -0.00660328260393], [7.609022556390977, -0.00777784107676], [7.639097744360902, -0.00888988696125], [7.669172932330827, -0.00993730998333], [7.6992481203007515, -0.0109182926505], [7.7293233082706765, -0.0118313080532], [7.7593984962406015, -0.0126751166966], [7.7894736842105265, -0.0134487624011], [7.819548872180451, -0.0141515673159], [7.849624060150376, -0.014783126088], [7.879699248120301, -0.0153432992329], [7.909774436090226, -0.015832205755], [7.93984962406015, -0.0162502150647], [7.969924812030075, -0.0165979382438], [8.0, -0.0168762187076], [8.030075187969924, -0.0170861223164], [8.06015037593985, -0.0172289269874], [8.090225563909774, -0.0173061118583], [8.1203007518797, -0.0173193460556], [8.150375939849624, -0.0172704771183], [8.180451127819548, -0.0171615191288], [8.210526315789474, -0.0169946406026], [8.240601503759398, -0.0167721521857], [8.270676691729323, -0.0164964942109], [8.300751879699249, -0.0161702241599], [8.330827067669173, -0.0157960040805], [8.360902255639099, -0.0153765880024], [8.390977443609023, -0.0149148094], [8.421052631578947, -0.0144135687421], [8.451127819548873, -0.0138758211724], [8.481203007518797, -0.0133045643598], [8.511278195488721, -0.0127028265582], [8.541353383458647, -0.0120736549095], [8.571428571428571, -0.0114201040267], [8.601503759398497, -0.0107452248892], [8.631578947368421, -0.0100520540787], [8.661654135338345, -0.00934360338659], [8.691729323308271, -0.00862284981661], [8.721804511278195, -0.00789272600834], [8.75187969924812, -0.00715611110212], [8.781954887218046, -0.00641582206539], [8.81203007518797, -0.00567460549745], [8.842105263157896, -0.00493512992787], [8.87218045112782, -0.00419997862111], [8.902255639097744, -0.00347164289829], [8.93233082706767, -0.00275251598425], [8.962406015037594, -0.00204488738661], [8.992481203007518, -0.00135093781075], [9.022556390977444, -0.000672734613308], [9.052631578947368, -1.22277940578e-5], [9.082706766917294, 0.000628753475135], [9.112781954887218, 0.0012485037881], [9.142857142857142, 0.00184544391407], [9.172932330827068, 0.00241812268643], [9.203007518796992, 0.00296521837921], [9.233082706766917, 0.00348553958154], [9.263157894736842, 0.00397802558194], [9.293233082706767, 0.00444174627545], [9.323308270676693, 0.00487590160818], [9.353383458646617, 0.00527982057494], [9.38345864661654, 0.00565295978673], [9.413533834586467, 0.00599490162595], [9.443609022556391, 0.00630535200817], [9.473684210526315, 0.00658413777], [9.503759398496241, 0.0068312037035], [9.533834586466165, 0.00704660925824], [9.563909774436091, 0.00723052493236], [9.593984962406015, 0.00738322837509], [9.62406015037594, 0.00750510022276], [9.654135338345865, 0.00759661969134], [9.68421052631579, 0.00765835994827], [9.714285714285714, 0.00769098328662], [9.74436090225564, 0.00769523612474], [9.774436090225564, 0.00767194385422], [9.80451127819549, 0.00762200555914], [9.834586466165414, 0.00754638862926], [9.864661654135338, 0.00744612328926], [9.894736842105264, 0.0073222970664], [9.924812030075188, 0.00717604921768], [9.954887218045112, 0.007008565138], [9.984962406015038, 0.00682107076943], [10.015037593984962, 0.00661482703174], [10.045112781954888, 0.00639112429331], [10.075187969924812, 0.00615127690083], [10.105263157894736, 0.00589661778577], [10.135338345864662, 0.0056284931643], [10.165413533834586, 0.005348257347], [10.19548872180451, 0.00505726767343], [10.225563909774436, 0.00475687958605], [10.25563909774436, 0.00444844185677], [10.285714285714286, 0.00413329197876], [10.31578947368421, 0.00381275173495], [10.345864661654135, 0.00348812295382], [10.37593984962406, 0.00316068346197], [10.406015037593985, 0.00283168324221], [10.436090225563909, 0.00250234080465], [10.466165413533835, 0.00217383977745], [10.496240601503759, 0.00184732572285], [10.526315789473685, 0.00152390318318], [10.556390977443609, 0.00120463296057], [10.586466165413533, 0.000890529633076], [10.61654135338346, 0.000582559309098], [10.646616541353383, 0.000281637621059], [10.676691729323307, -1.13720416435e-5], [10.706766917293233, -0.000295660061175], [10.736842105263158, -0.000570471882924], [10.766917293233083, -0.000835109072696], [10.796992481203008, -0.00108893014261], [10.827067669172932, -0.00133135114966], [10.857142857142858, -0.00156184607141], [10.887218045112782, -0.00177994696432], [10.917293233082706, -0.00198524391029], [10.947368421052632, -0.00217738475815], [10.977443609022556, -0.00235607466692], [11.007518796992482, -0.00252107545841], [11.037593984962406, -0.00267220478711], [11.06766917293233, -0.00280933513573], [11.097744360902256, -0.00293239264513], [11.12781954887218, -0.00304135578777], [11.157894736842104, -0.00313625389393], [11.18796992481203, -0.00321716554042], [11.218045112781954, -0.00328421681158], [11.24812030075188, -0.00333757944246], [11.278195488721805, -0.00337746885444], [11.308270676691729, -0.00340414209328], [11.338345864661655, -0.00341789568008], [11.368421052631579, -0.00341906338514], [11.398496240601503, -0.00340801393508], [11.428571428571429, -0.00338514866343], [11.458646616541353, -0.00335089911447], [11.488721804511279, -0.0033057246106], [11.518796992481203, -0.00325010979267], [11.548872180451127, -0.00318456214303], [11.578947368421053, -0.0031096095006], [11.609022556390977, -0.00302579757696], [11.639097744360901, -0.00293368748242], [11.669172932330827, -0.00283385327047], [11.699248120300751, -0.00272687950889], [11.729323308270677, -0.00261335888533], [11.759398496240602, -0.00249388985497], [11.789473684210526, -0.00236907433718], [11.819548872180452, -0.00223951546827], [11.849624060150376, -0.00210581541632], [11.8796992481203, -0.00196857326427], [11.909774436090226, -0.00182838296674], [11.93984962406015, -0.00168583138562], [11.969924812030076, -0.00154149640914], [12.0, -0.00139594515866]], "smooth" => true, "symbol" => "none", "markLine" => Dict{String, Any}("data" => Any[Dict{String, Any}("yAxis" => 0, "lineStyle" => Dict{String, Any}("color" => "#888", "type" => "dashed"))], "symbol" => "none", "silent" => true), "type" => "line")], "backgroundColor" => "transparent"))Exercise 3.1 — the transfer function. From $(ms^2+bs+k)X(s)=F(s)$, write the transfer function $H(s)=X(s)/F(s)$ as an expression in s, m, b, k.
# Transfer function H(s) = X(s)/F(s). Type it in the field, in terms of s, m, b, k:
H = giac""missingcheck(:transfer_fn, H)GiacSlate.GradeReport(GiacSlate.Section(:secondorder, "Section 3 · Second-order systems — oscillation", "The damped harmonic oscillator is the archetype of every resonant system. Its poles tell the story.", GiacSlate.Exercise[GiacSlate.Exercise(:transfer_fn, "3.1 · Transfer function of the oscillator", "For \$m\\ddot x+b\\dot x+kx=F(t)\$ at rest, transforming gives \$(ms^2+bs+k)X(s)=F(s)\$. The transfer function is \$H(s)=X(s)/F(s)\$.", GiacSlate.var"#46#47"())]), GiacSlate.ExResult[GiacSlate.ExResult(:transfer_fn, "3.1 · Transfer function of the oscillator", "For \$m\\ddot x+b\\dot x+kx=F(t)\$ at rest, transforming gives \$(ms^2+bs+k)X(s)=F(s)\$. The transfer function is \$H(s)=X(s)/F(s)\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$H(s)\$: not answered yet", "type your answer into the math field above")])], true)Exercise 3.2 — natural frequency. Write omega_n(k, m) returning the undamped natural frequency $\omega_n=\sqrt{k/m}$.
function omega_n(k, m)
missing
endomega_ncheck(:nat_freq, omega_n)GiacSlate.GradeReport(GiacSlate.Section(:secondorder, "Section 3 · Second-order systems — oscillation", "The damped harmonic oscillator is the archetype of every resonant system. Its poles tell the story.", GiacSlate.Exercise[GiacSlate.Exercise(:nat_freq, "3.2 · Natural frequency (numeric)", "Write `omega_n(k, m)` for the undamped natural frequency \$\\omega_n=\\sqrt{k/m}\$.", GiacSlate.var"#48#49"())]), GiacSlate.ExResult[GiacSlate.ExResult(:nat_freq, "3.2 · Natural frequency (numeric)", "Write `omega_n(k, m)` for the undamped natural frequency \$\\omega_n=\\sqrt{k/m}\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 3: not implemented yet", "replace the `missing` with your code")])], true)Exercise 3.3 — damping ratio. Write zeta(b, k, m) returning the damping ratio $\zeta=\dfrac{b}{2\sqrt{km}}$.
function zeta(b, k, m)
missing
endzetacheck(:damping_ratio, zeta)GiacSlate.GradeReport(GiacSlate.Section(:secondorder, "Section 3 · Second-order systems — oscillation", "The damped harmonic oscillator is the archetype of every resonant system. Its poles tell the story.", GiacSlate.Exercise[GiacSlate.Exercise(:damping_ratio, "3.3 · Damping ratio (numeric)", "Write `zeta(b, k, m)` for the damping ratio \$\\zeta=\\dfrac{b}{2\\sqrt{km}}\$.", GiacSlate.var"#52#53"())]), GiacSlate.ExResult[GiacSlate.ExResult(:damping_ratio, "3.3 · Damping ratio (numeric)", "Write `zeta(b, k, m)` for the damping ratio \$\\zeta=\\dfrac{b}{2\\sqrt{km}}\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 3: not implemented yet", "replace the `missing` with your code")])], true)Exercise 3.4 — name the regime. The damping ratio decides everything. Write classify(z) returning the string "underdamped", "critically damped", or "overdamped" depending on whether $\zeta$ is below, equal to, or above $1$.
function classify(z)
missing
endclassifycheck(:classify, classify)GiacSlate.GradeReport(GiacSlate.Section(:secondorder, "Section 3 · Second-order systems — oscillation", "The damped harmonic oscillator is the archetype of every resonant system. Its poles tell the story.", GiacSlate.Exercise[GiacSlate.Exercise(:classify, "3.4 · Classify the response", "Write `classify(z)` returning `\"underdamped\"`, `\"critically damped\"`, or `\"overdamped\"` from the damping ratio \$\\zeta\$ (boundaries at \$\\zeta=1\$).", GiacSlate.var"#56#57"())]), GiacSlate.ExResult[GiacSlate.ExResult(:classify, "3.4 · Classify the response", "Write `classify(z)` returning `\"underdamped\"`, `\"critically damped\"`, or `\"overdamped\"` from the damping ratio \$\\zeta\$ (boundaries at \$\\zeta=1\$).", true, GiacSlate.Check[GiacSlate.Check(false, "regime from ζ — case 1: not implemented yet", "compare ζ to 1"), GiacSlate.Check(false, "regime from ζ — case 2: not implemented yet", "compare ζ to 1"), GiacSlate.Check(false, "regime from ζ — case 3: not implemented yet", "compare ζ to 1")])], true)Your progress
This card tallies every exercise in the lesson and refreshes the moment you change any answer above. Fill the bar to complete the course.
course_report(;
lap_exp = L_exp,
lap_sin = L_sin,
inv_lap = f_cos,
decay_transform = N_s,
decay_solution = N_t,
half_life = half_life,
transfer_fn = H,
nat_freq = omega_n,
damping_ratio = zeta,
classify = classify,
)GiacSlate.CourseReport(GiacSlate.GradeReport[GiacSlate.GradeReport(GiacSlate.Section(:transforms, "Section 1 · Meeting the transform", "You can move a signal into the s-domain and back. That round trip is the whole game.", GiacSlate.Exercise[GiacSlate.Exercise(:lap_exp, "1.1 · Transform of a decaying exponential", "From the definition \$\\mathcal{L}\\{f\\}=\\int_0^\\infty f(t)e^{-st}dt\$, the integral of \$e^{-at}e^{-st}\$ is a geometric-style decay. The pole sits at \$s=-a\$.", GiacSlate.var"#21#22"()), GiacSlate.Exercise(:lap_sin, "1.2 · Transform of a sine", "Write \$\\sin(\\omega t)=\\tfrac{1}{2i}(e^{i\\omega t}-e^{-i\\omega t})\$ and transform each exponential, or recall the standard pair. The denominator is \$s^2+\\omega^2\$.", GiacSlate.var"#23#24"()), GiacSlate.Exercise(:inv_lap, "1.3 · An inverse transform", "Which time signal has transform \$\\dfrac{s}{s^2+\\omega^2}\$? Differentiate your Section-1.2 answer, or match the standard pair — no extra \$1/\\omega\$ this time.", GiacSlate.var"#25#26"())]), GiacSlate.ExResult[GiacSlate.ExResult(:lap_exp, "1.1 · Transform of a decaying exponential", "From the definition \$\\mathcal{L}\\{f\\}=\\int_0^\\infty f(t)e^{-st}dt\$, the integral of \$e^{-at}e^{-st}\$ is a geometric-style decay. The pole sits at \$s=-a\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}\\{e^{-at}\\}\$: not answered yet", "type your answer into the math field above")]), GiacSlate.ExResult(:lap_sin, "1.2 · Transform of a sine", "Write \$\\sin(\\omega t)=\\tfrac{1}{2i}(e^{i\\omega t}-e^{-i\\omega t})\$ and transform each exponential, or recall the standard pair. The denominator is \$s^2+\\omega^2\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}\\{\\sin\\omega t\\}\$: not answered yet", "type your answer into the math field above")]), GiacSlate.ExResult(:inv_lap, "1.3 · An inverse transform", "Which time signal has transform \$\\dfrac{s}{s^2+\\omega^2}\$? Differentiate your Section-1.2 answer, or match the standard pair — no extra \$1/\\omega\$ this time.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\mathcal{L}^{-1}\\{s/(s^2+\\omega^2)\\}\$: not answered yet", "type your answer into the math field above")])], false), GiacSlate.GradeReport(GiacSlate.Section(:firstorder, "Section 2 · First-order systems — decay", "Radioactive decay and an RC circuit are the same equation. Laplace turns the ODE into algebra.", GiacSlate.Exercise[GiacSlate.Exercise(:decay_transform, "2.1 · Transform the decay law", "Radioactive decay obeys \$\\dot N=-aN,\\;N(0)=N_0\$. Transforming gives \$sN(s)-N_0=-aN(s)\$. Solve that algebraic equation for \$N(s)\$.", GiacSlate.var"#31#32"()), GiacSlate.Exercise(:decay_solution, "2.2 · Invert to the time domain", "Take \$\\mathcal{L}^{-1}\$ of your \$N(s)=N_0/(s+a)\$. It is the exponential-decay pair from 1.1, scaled by \$N_0\$.", GiacSlate.var"#33#34"()), GiacSlate.Exercise(:half_life, "2.3 · Half-life (numeric)", "Write `half_life(a)` returning the time for \$N\$ to fall to \$N_0/2\$: solve \$e^{-a t}=\\tfrac12\$ for \$t\$. Answer in the same time units as \$1/a\$.", GiacSlate.var"#35#36"())]), GiacSlate.ExResult[GiacSlate.ExResult(:decay_transform, "2.1 · Transform the decay law", "Radioactive decay obeys \$\\dot N=-aN,\\;N(0)=N_0\$. Transforming gives \$sN(s)-N_0=-aN(s)\$. Solve that algebraic equation for \$N(s)\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$N(s)\$: not answered yet", "type your answer into the math field above")]), GiacSlate.ExResult(:decay_solution, "2.2 · Invert to the time domain", "Take \$\\mathcal{L}^{-1}\$ of your \$N(s)=N_0/(s+a)\$. It is the exponential-decay pair from 1.1, scaled by \$N_0\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$N(t)\$: not answered yet", "type your answer into the math field above")]), GiacSlate.ExResult(:half_life, "2.3 · Half-life (numeric)", "Write `half_life(a)` returning the time for \$N\$ to fall to \$N_0/2\$: solve \$e^{-a t}=\\tfrac12\$ for \$t\$. Answer in the same time units as \$1/a\$.", true, GiacSlate.Check[GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "half-life \$t_{1/2}=\\ln 2/a\$ — case 3: not implemented yet", "replace the `missing` with your code")])], false), GiacSlate.GradeReport(GiacSlate.Section(:secondorder, "Section 3 · Second-order systems — oscillation", "The damped harmonic oscillator is the archetype of every resonant system. Its poles tell the story.", GiacSlate.Exercise[GiacSlate.Exercise(:transfer_fn, "3.1 · Transfer function of the oscillator", "For \$m\\ddot x+b\\dot x+kx=F(t)\$ at rest, transforming gives \$(ms^2+bs+k)X(s)=F(s)\$. The transfer function is \$H(s)=X(s)/F(s)\$.", GiacSlate.var"#46#47"()), GiacSlate.Exercise(:nat_freq, "3.2 · Natural frequency (numeric)", "Write `omega_n(k, m)` for the undamped natural frequency \$\\omega_n=\\sqrt{k/m}\$.", GiacSlate.var"#48#49"()), GiacSlate.Exercise(:damping_ratio, "3.3 · Damping ratio (numeric)", "Write `zeta(b, k, m)` for the damping ratio \$\\zeta=\\dfrac{b}{2\\sqrt{km}}\$.", GiacSlate.var"#52#53"()), GiacSlate.Exercise(:classify, "3.4 · Classify the response", "Write `classify(z)` returning `\"underdamped\"`, `\"critically damped\"`, or `\"overdamped\"` from the damping ratio \$\\zeta\$ (boundaries at \$\\zeta=1\$).", GiacSlate.var"#56#57"())]), GiacSlate.ExResult[GiacSlate.ExResult(:transfer_fn, "3.1 · Transfer function of the oscillator", "For \$m\\ddot x+b\\dot x+kx=F(t)\$ at rest, transforming gives \$(ms^2+bs+k)X(s)=F(s)\$. The transfer function is \$H(s)=X(s)/F(s)\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$H(s)\$: not answered yet", "type your answer into the math field above")]), GiacSlate.ExResult(:nat_freq, "3.2 · Natural frequency (numeric)", "Write `omega_n(k, m)` for the undamped natural frequency \$\\omega_n=\\sqrt{k/m}\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\omega_n=\\sqrt{k/m}\$ — case 3: not implemented yet", "replace the `missing` with your code")]), GiacSlate.ExResult(:damping_ratio, "3.3 · Damping ratio (numeric)", "Write `zeta(b, k, m)` for the damping ratio \$\\zeta=\\dfrac{b}{2\\sqrt{km}}\$.", true, GiacSlate.Check[GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 1: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 2: not implemented yet", "replace the `missing` with your code"), GiacSlate.Check(false, "\$\\zeta=b/(2\\sqrt{km})\$ — case 3: not implemented yet", "replace the `missing` with your code")]), GiacSlate.ExResult(:classify, "3.4 · Classify the response", "Write `classify(z)` returning `\"underdamped\"`, `\"critically damped\"`, or `\"overdamped\"` from the damping ratio \$\\zeta\$ (boundaries at \$\\zeta=1\$).", true, GiacSlate.Check[GiacSlate.Check(false, "regime from ζ — case 1: not implemented yet", "compare ζ to 1"), GiacSlate.Check(false, "regime from ζ — case 2: not implemented yet", "compare ζ to 1"), GiacSlate.Check(false, "regime from ζ — case 3: not implemented yet", "compare ζ to 1")])], false)])