#set document(title: "1.1 Solution Families", author: "XYZ Homework") #set page(width: 8.5in, height: auto, margin: 1in) #import "@preview/cetz:0.5.2" #set text(font: ("STIX Two Text", "Libertinus Serif", "New Computer Modern"), size: 10.5pt, lang: "en") #show math.equation: set text(font: ("STIX Two Math", "New Computer Modern Math")) #set par(justify: true, leading: 0.62em, spacing: 0.9em) #set enum(spacing: 1.1em) // room between list items so tall inline fractions don't collide #set list(spacing: 1.1em) #set table(stroke: 0.5pt + rgb("#c7ccd3")) #let BLUE = rgb("#183B6F") // brand navy — section bars + example/solution labels (white on navy 11.09:1) #let ORANGE = rgb("#A94509") // brand primary-700 — AA-safe deep orange for TEXT (5.93:1 on white; raw brand #F37021 is 2.94:1 and must never carry text) #let RED = rgb("#DC2626") // brand error-600 #let GREEN = rgb("#059669") // brand success-600 (decoration only; small green text uses green-text #007942) #show heading.where(level: 1): it => block(width: 100%, above: 0pt, below: 16pt, fill: gradient.linear(BLUE, rgb("#2C5AA0")), inset: (x: 14pt, y: 12pt), radius: 3pt, text(fill: white, weight: "bold", size: 19pt, it.body)) #show heading.where(level: 2): it => block(width: 100%, above: 18pt, below: 10pt, fill: BLUE, inset: (x: 10pt, y: 6pt), radius: 2pt, text(fill: white, weight: "bold", size: 12pt, it.body)) #show heading.where(level: 3): it => text(fill: ORANGE, weight: "bold", size: 12.5pt, it.body) #show heading.where(level: 4): it => text(fill: BLUE, weight: "bold", size: 10.5pt, it.body) #let examplebox(label, title, body) = block(width: 100%, breakable: true, fill: rgb("#EFF1F5"), stroke: 0.5pt + rgb("#CFDDF0"), radius: 4pt, inset: 10pt, above: 12pt, below: 12pt)[ #block(below: 6pt)[#box(fill: BLUE, inset: (x: 6pt, y: 2pt), radius: 2pt, text(fill: white, weight: "bold", size: 8.5pt, label)) #h(0.4em) #strong[#title]] #body] // rail = decorative left rule (raw brand token); labelcolor = AA-safe label text shade #let notebox(label, rail, labelcolor, tint, body) = block(width: 100%, breakable: true, fill: tint, stroke: (left: 3pt + rail), inset: (left: 10pt, rest: 8pt), radius: (right: 4pt), above: 11pt, below: 11pt)[ #text(fill: labelcolor, weight: "bold", size: 7.5pt, tracking: 0.5pt)[#upper(label)] #linebreak() #body] #let solutionbox(body) = block(above: 4pt, below: 8pt)[ #text(fill: BLUE, weight: "bold", size: 8.5pt)[Solution] #linebreak() #body] #let figph(msg) = block(width: 100%, height: 60pt, fill: rgb("#f6f7f9"), stroke: (paint: rgb("#c7ccd3"), dash: "dashed"), radius: 4pt, inset: 10pt)[ #align(center + horizon, text(fill: rgb("#889"), style: "italic", size: 9pt, msg))] // Standardize inlined figure sizes: measure the natural CeTZ canvas, then scale to a // consistent envelope (aspect-aware; see build_typst.py FIG_* constants). Unlike the // print preamble, dimensions are FLOORED: in an editor a user can trim a figure to a // degenerate 1-D shape (a bare line), and w/h or tw/w would then divide by zero. #let _STD_W = 3.5 #let _WIDE_W = 5.6 #let _MAX_H = 3.4 #let _ASPECT_WIDE = 2.2 #let _UPSCALE_MAX = 1.15 #let stdfig(body) = context { let m = measure(body) let w = calc.max(m.width / 1in, 0.01) let h = calc.max(m.height / 1in, 0.01) let tw = if w / h > _ASPECT_WIDE { _WIDE_W } else { _STD_W } let s = calc.min(tw / w, _MAX_H / h, _UPSCALE_MAX) align(center, box(scale(x: s * 100%, y: s * 100%, reflow: true, body))) } #show figure: set block(breakable: false) #set figure(gap: 8pt) #show figure.caption: set text(size: 8.5pt, fill: rgb("#555")) == 1.1#h(0.6em)Solution Families #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - Recognize #math.equation(block: false, alt: "y prime equals k y")[$y^(′) = k y$] as the statement "rate is proportional to amount" and #math.equation(block: false, alt: "y equals a e to the power k t")[$y = a e^(k t)$] as everything that statement allows. - Explain what each constant in a solution family controls, and how an initial condition selects one member of the family. - Solve an initial value problem for exponential growth or decay and read off doubling times and half-lives. ] The shortest differential equation with something to say is #math.equation(block: true, alt: "the fraction d y over d t equals k y .")[$frac(d y, d t) = k y .$] In words: the rate of change of #math.equation(block: false, alt: "y")[$y$] is proportional to #math.equation(block: false, alt: "y")[$y$] itself. Money earning continuous interest obeys it, a bacterial culture with unlimited food obeys it, a radioactive sample obeys it with #math.equation(block: false, alt: "k")[$k$] negative. The equation does not mention any particular starting amount — and that is the point. A differential equation constrains the #emph[shape] of a solution, not its starting place, so it is satisfied not by one function but by a whole family of them: #math.equation(block: true, alt: "y open parenthesis t close parenthesis equals a e to the power k t ,")[$y ( t ) = a e^(k t) ,$] one member for every choice of the constant #math.equation(block: false, alt: "a")[$a$]. Substitute back to check: the derivative of #math.equation(block: false, alt: "a e to the power k t")[$a e^(k t)$] is #math.equation(block: false, alt: "k times a e to the power k t")[$k · a e^(k t)$], which is exactly #math.equation(block: false, alt: "k")[$k$] times the function. The constant #math.equation(block: false, alt: "a")[$a$] is not decoration; it is the answer to a question the differential equation never asked, namely #emph[where does the solution start?] Setting #math.equation(block: false, alt: "t equals 0")[$t = 0$] gives #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis equals a")[$y ( 0 ) = a$]. The figure below puts the whole family under your hands. The slider #math.equation(block: false, alt: "a")[$a$] is the initial value #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis")[$y ( 0 )$] and the slider #math.equation(block: false, alt: "b")[$b$] plays the role of the rate constant #math.equation(block: false, alt: "k")[$k$]. {"camera":{"fov":50,"position":\[0.5,2,9\],"projection":"perspective","target":\[0.5,2,0\]},"grid":{"axisColors":{"x":"\#ef4444","y":"\#22c55e","z":"\#3b82f6"},"divisions":10,"gridColor":"\#e5e7eb","showAxes":true,"showLabels":true,"size":10,"visible":true},"id":"96c76162-23fa-4c17-835d-b75cc3c4530f","metadata":{"alt\_text":"A single red exponential curve drawn in the plane, crossing the vertical axis at height a. The slider a slides the whole curve up or down through its starting value, flipping it below the axis when a is negative; the slider b bends it from steep growth through a flat horizontal line to rapid decay.","created\_at":"2026-08-01T00:00:00.000Z","description":"The one-parameter-at-a-time exponential family y = a\*exp(b\*t) on t in \[-2, 3\], with a in \[-3, 3\] the initial value and b in \[-2, 2\] the rate constant.","tags":\["diffeq","first-order","exponential","solution-family","slider"\],"updated\_at":"2026-08-01T00:00:00.000Z"},"objects":\[{"id":"9a48e881-7697-44de-85bc-713dbd19c794","kind":"parameter","label":{"text":"a = initial value y(0)","visible":true},"max":3,"min":-3,"name":"a","step":0.1,"value":1,"visible":true},{"id":"72e2af9f-d9e9-44b4-8f3e-6d171cff3771","kind":"parameter","label":{"text":"b = growth rate","visible":true},"max":2,"min":-2,"name":"b","step":0.1,"value":0.5,"visible":true},{"id":"cd26f278-ff35-4c0a-9c62-a74e61f631de","kind":"parametric-curve","label":{"text":"y(t) = a e^(bt)","visible":true},"samples":600,"style":{"color":"\#ef4444","dash":\[\],"lineWidth":4},"tDomain":\[-2,3\],"visible":true,"xExpr":"t","yExpr":"a\*exp(b\*t)","zExpr":"0"}\],"title":"The exponential solution family y = a e^(bt)","version":1} The exponential family #math.equation(block: false, alt: "y equals a e to the power b t")[$y = a e^(b t)$]. The slider #math.equation(block: false, alt: "a")[$a$] sets the starting value #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis")[$y ( 0 )$]; the slider #math.equation(block: false, alt: "b")[$b$] sets the growth rate. Every curve that these two dials can produce is a solution of #math.equation(block: false, alt: "y prime equals b y")[$y^(′) = b y$]. === Explore + #strong[Observe.] Set #math.equation(block: false, alt: "b equals 0.5")[$b = 0.5$] and sweep #math.equation(block: false, alt: "a")[$a$] from #math.equation(block: false, alt: "3")[$3$] down through #math.equation(block: false, alt: "0")[$0$] to #math.equation(block: false, alt: "minus 3")[$− 3$]. Every curve in the sweep passes through the point #math.equation(block: false, alt: "open parenthesis 0 , a close parenthesis")[$( 0 , a )$]. What single point does the entire family have in common when #math.equation(block: false, alt: "a equals 0")[$a = 0$]? + #strong[Predict.] With #math.equation(block: false, alt: "a equals 2")[$a = 2$] fixed, what will happen to the curve as you drag #math.equation(block: false, alt: "b")[$b$] from #math.equation(block: false, alt: "0.5")[$0.5$] down through #math.equation(block: false, alt: "0")[$0$] to #math.equation(block: false, alt: "minus 1")[$− 1$]? Sketch your guess for all three regimes before touching the slider. + #strong[Verify.] Now drag #math.equation(block: false, alt: "b")[$b$]. At #math.equation(block: false, alt: "b equals 0")[$b = 0$] the equation reads #math.equation(block: false, alt: "y prime equals 0")[$y^(′) = 0$] — which functions satisfy that, and is the flat line you see one of them? + #strong[Observe.] Make the curve decay: #math.equation(block: false, alt: "a equals 3")[$a = 3$], #math.equation(block: false, alt: "b equals minus 1")[$b = − 1$]. Read off roughly where the curve has dropped to half its starting height. Then set #math.equation(block: false, alt: "b equals minus 2")[$b = − 2$] and read the half-height time again. How did doubling the decay rate change the half-life? + #strong[Predict, then verify.] Can you find slider settings that make the curve pass through the point #math.equation(block: false, alt: "open parenthesis 1 , 2 close parenthesis")[$( 1 , 2 )$]? There are many — find two visibly different ones, and explain why the initial value problem #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis equals 2")[$y ( 0 ) = 2$] has only one. === Connect An #emph[initial value problem] bundles a differential equation with a starting fact: #math.equation(block: false, alt: "y prime equals k y")[$y^(′) = k y$] together with #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis equals y sub 0")[$y ( 0 ) = y_(0)$]. The equation supplies the family #math.equation(block: false, alt: "y equals a e to the power k t")[$y = a e^(k t)$]; the initial condition picks the member with #math.equation(block: false, alt: "a equals y sub 0")[$a = y_(0)$]; and that member is the only one. This one-condition-one-solution pattern is the normal situation for first-order equations, and it is why the sliders in the figure feel like coordinates: the pair #math.equation(block: false, alt: "open parenthesis a , b close parenthesis")[$( a , b )$] is a complete address for a curve. Exploration step 5 shows the flip side — a point away from #math.equation(block: false, alt: "t equals 0")[$t = 0$] does not pin down a curve unless the rate is also known, which is why the problem statement must say #emph[which] equation and #emph[which] starting value. #examplebox("Example 1")[An initial value problem][ A culture obeys #math.equation(block: false, alt: "y prime equals 0.5 y")[$y^(′) = 0.5 y$] with #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis equals 3")[$y ( 0 ) = 3$], in thousands of cells and hours. Find #math.equation(block: false, alt: "y open parenthesis t close parenthesis")[$y ( t )$] and determine when the culture reaches #math.equation(block: false, alt: "6")[$6$] thousand cells. The family is #math.equation(block: false, alt: "y equals a e to the power 0.5 t")[$y = a e^(0.5 t)$], and #math.equation(block: false, alt: "y open parenthesis 0 close parenthesis equals 3")[$y ( 0 ) = 3$] forces #math.equation(block: false, alt: "a equals 3")[$a = 3$], so #math.equation(block: false, alt: "y open parenthesis t close parenthesis equals 3 e to the power 0.5 t")[$y ( t ) = 3 e^(0.5 t)$]. Setting #math.equation(block: false, alt: "3 e to the power 0.5 t equals 6")[$3 e^(0.5 t) = 6$] gives #math.equation(block: false, alt: "e to the power 0.5 t equals 2")[$e^(0.5 t) = 2$], so #math.equation(block: false, alt: "0.5 t equals ln 2")[$0.5 t = ln 2$] and #math.equation(block: false, alt: "t equals 2 ln 2 approximately equals 1.39")[$t = 2 ln 2 ≈ 1.39$] hours. Check it on the figure: with #math.equation(block: false, alt: "a equals 3")[$a = 3$] and #math.equation(block: false, alt: "b equals 0.5")[$b = 0.5$], the curve crosses height #math.equation(block: false, alt: "6")[$6$] just short of #math.equation(block: false, alt: "t equals 1.4")[$t = 1.4$]. Note the doubling time did not depend on the starting amount — only on the rate. ]