#set document(title: "2.3 Subspace or Not", 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")) == 2.3#h(0.6em)Subspace or Not #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - State the subspace test: contains the zero vector, closed under addition, closed under scaling. - Apply the test by eye to a plane through the origin, a translated plane, and a curved surface. - Explain why every span passes the test, and why flatness through the origin is the geometric signature of a subspace. ] The last two sections kept meeting the same kind of shape. Spans were flat, passed through the origin, and combining two of their points always produced another of their points; the red line of solutions in the previous section was flat but #emph[missed] the origin, and adding two of its points threw you off it. It is time to name the property. A #strong[subspace] of #math.equation(block: false, alt: "ℝ cubed")[$ℝ^(3)$] is a set of vectors that contains the zero vector and is #strong[closed] under the two operations that build spans: adding any two of its vectors lands back in the set, and scaling any of its vectors lands back in the set. The definition sounds algebraic, but it is a test you can run by eye. The figure below offers three candidates. The first is the plane #math.equation(block: false, alt: "z equals 0.5 x plus 0.3 y")[$z = 0.5 x + 0.3 y$], which passes through the marked origin. The second is its translate #math.equation(block: false, alt: "z equals 0.5 x plus 0.3 y plus a")[$z = 0.5 x + 0.3 y + a$], floating above or below on the slider #math.equation(block: false, alt: "a")[$a$]. The third, hidden until you reveal it, is the curved surface #math.equation(block: false, alt: "z equals 0.2 x y")[$z = 0.2 x y$] — and it is the trap, because it #emph[does] pass through the origin. {"camera":{"fov":50,"position":\[5.5,4.5,3.5\],"projection":"perspective","target":\[0,0,0.3\]},"grid":{"axisColors":{"x":"\#ef4444","y":"\#22c55e","z":"\#3b82f6"},"divisions":10,"gridColor":"\#e5e7eb","showAxes":true,"showLabels":true,"size":10,"visible":true},"id":"a5a6d7c7-e4c0-41d5-a3d9-b2861dac7f4e","metadata":{"alt\_text":"A flat plane passing through a marked origin point, with a second, parallel plane floating above or below it, controlled by a slider named a. A hidden saddle-shaped curved surface through the origin can be toggled on. Sliding a to 0 drops the floating plane onto the origin plane; the reader compares which of the three surfaces could be a subspace.","created\_at":"2026-08-01T00:00:00.000Z","description":"Book scene: the subspace test by eye. Plane z = 0.5x + 0.3y through the origin, its translate z = 0.5x + 0.3y + a on slider a, a hidden curved surface z = 0.2xy that contains the origin but fails closure, and a point marking the origin.","tags":\["book","linear-algebra","subspace","closure"\],"updated\_at":"2026-08-01T00:00:00.000Z"},"objects":\[{"id":"242d6e4c-4c0f-4085-a8ec-b8ffeb74b076","kind":"parameter","label":{"text":"a (offset of the shifted plane)","visible":true},"max":2,"min":-2,"name":"a","step":0.05,"value":1,"visible":true},{"expression":"0.5\*x + 0.3\*y","id":"ee6c9bbe-dde1-42b1-9b5f-52081d1f6647","kind":"explicit-surface","label":{"text":"plane through the origin: z = 0.5x + 0.3y","visible":true},"resolution":32,"style":{"colormap":"viridis","doubleSided":true,"opacity":0.6,"wireframe":false,"wireframeColor":"\#000000"},"visible":true,"xDomain":\[-2,2\],"yDomain":\[-2,2\]},{"expression":"0.5\*x + 0.3\*y + a","id":"0d063d36-9de8-4fda-b0d4-cd26c8404980","kind":"explicit-surface","label":{"text":"shifted plane: z = 0.5x + 0.3y + a","visible":true},"resolution":32,"style":{"colormap":"plasma","doubleSided":true,"opacity":0.45,"wireframe":false,"wireframeColor":"\#000000"},"visible":true,"xDomain":\[-2,2\],"yDomain":\[-2,2\]},{"expression":"0.2\*x\*y","id":"f7b1a8c8-cce4-4480-a6f7-ed40179b14f7","kind":"explicit-surface","label":{"text":"curved surface: z = 0.2xy","visible":true},"resolution":48,"style":{"colormap":"coolwarm","doubleSided":true,"opacity":0.6,"wireframe":false,"wireframeColor":"\#000000"},"visible":false,"xDomain":\[-2,2\],"yDomain":\[-2,2\]},{"color":"\#111827","id":"e115da35-9e89-4884-bbf2-9d0f3c13ef30","kind":"point","label":{"text":"origin","visible":true},"radius":0.09,"visible":true,"x":0,"y":0,"z":0}\],"title":"Subspace or not","version":1} The plane #math.equation(block: false, alt: "z equals 0.5 x plus 0.3 y")[$z = 0.5 x + 0.3 y$] through the marked origin, and its translate #math.equation(block: false, alt: "z equals 0.5 x plus 0.3 y plus a")[$z = 0.5 x + 0.3 y + a$] on the slider #math.equation(block: false, alt: "a")[$a$]. A curved surface #math.equation(block: false, alt: "z equals 0.2 x y")[$z = 0.2 x y$] is hidden in the scene; reveal it to run the subspace test on all three candidates. === Explore the figure + At the default #math.equation(block: false, alt: "a equals 1")[$a = 1$], orbit the two planes. Only the lower one contains the origin point — the translate already fails the easiest part of the test. Does any point of the translate look "reachable" by scaling another of its points down toward zero? + Drag #math.equation(block: false, alt: "a")[$a$] to #math.equation(block: false, alt: "0")[$0$] and watch the translate drop onto the origin plane. Among all values of the slider, exactly one produces a subspace. Which failure returns the instant #math.equation(block: false, alt: "a")[$a$] leaves #math.equation(block: false, alt: "0")[$0$]? + Reveal the hidden surface labeled #emph[curved surface: #math.equation(block: false, alt: "z equals 0.2 x y")[$z = 0.2 x y$]]. Check by orbiting that it genuinely contains the origin. If containing the origin were the whole test, it would pass. + Now test closure on the curved surface by eye: find the points above #math.equation(block: false, alt: "open parenthesis 1 , 0 close parenthesis")[$( 1 , 0 )$] and #math.equation(block: false, alt: "open parenthesis 0 , 1 close parenthesis")[$( 0 , 1 )$] — both sit at height #math.equation(block: false, alt: "z equals 0")[$z = 0$] — and locate their sum #math.equation(block: false, alt: "open parenthesis 1 , 1 , 0 close parenthesis")[$( 1 , 1 , 0 )$]. Does the surface pass through it? === Running the test The origin plane passes in full generality. If #math.equation(block: false, alt: "open parenthesis x sub 1 , y sub 1 , z sub 1 close parenthesis")[$( x_(1) , y_(1) , z_(1) )$] and #math.equation(block: false, alt: "open parenthesis x sub 2 , y sub 2 , z sub 2 close parenthesis")[$( x_(2) , y_(2) , z_(2) )$] both satisfy #math.equation(block: false, alt: "z equals 0.5 x plus 0.3 y")[$z = 0.5 x + 0.3 y$], then their sum satisfies #math.equation(block: false, alt: "z sub 1 plus z sub 2 equals 0.5 open parenthesis x sub 1 plus x sub 2 close parenthesis plus 0.3 open parenthesis y sub 1 plus y sub 2 close parenthesis")[$z_(1) + z_(2) = 0.5 ( x_(1) + x_(2) ) + 0.3 ( y_(1) + y_(2) )$] — the same equation again, because the equation is linear with zero constant term. Scaling works the same way. In fact this plane is a span: every point of it is #math.equation(block: false, alt: "x open parenthesis 1 , 0 , 0.5 close parenthesis plus y open parenthesis 0 , 1 , 0.3 close parenthesis")[$x ( 1 , 0 , 0.5 ) + y ( 0 , 1 , 0.3 )$], so it is the span of two vectors, and every span passes the subspace test for exactly the reason above. The translate fails at #math.equation(block: false, alt: "a not equal to 0")[$a ≠ 0$], and not only because it misses the origin. Take #math.equation(block: false, alt: "a equals 1")[$a = 1$]: the points #math.equation(block: false, alt: "open parenthesis 0 , 0 , 1 close parenthesis")[$( 0 , 0 , 1 )$] and #math.equation(block: false, alt: "open parenthesis 2 , 0 , 2 close parenthesis")[$( 2 , 0 , 2 )$] both lie on it, but their sum #math.equation(block: false, alt: "open parenthesis 2 , 0 , 3 close parenthesis")[$( 2 , 0 , 3 )$] needs #math.equation(block: false, alt: "z equals 0.5 times 2 plus 1 equals 2")[$z = 0.5 · 2 + 1 = 2$], not #math.equation(block: false, alt: "3")[$3$]. Closure fails because adding two points #emph[doubles] the constant #math.equation(block: false, alt: "plus 1")[$+ 1$]. A flat sheet in the wrong place is not a subspace — it is a subspace's translate, the shape solution sets of inhomogeneous systems take. #examplebox("Example 1")[The curved surface fails closure twice][ The surface #math.equation(block: false, alt: "z equals 0.2 x y")[$z = 0.2 x y$] contains the origin. Show it is still not a subspace, by exhibiting one failure of addition and one failure of scaling. Addition: #math.equation(block: false, alt: "open parenthesis 1 , 0 , 0 close parenthesis")[$( 1 , 0 , 0 )$] and #math.equation(block: false, alt: "open parenthesis 0 , 1 , 0 close parenthesis")[$( 0 , 1 , 0 )$] are on the surface, since #math.equation(block: false, alt: "0.2 times 1 times 0 equals 0")[$0.2 · 1 · 0 = 0$] and #math.equation(block: false, alt: "0.2 times 0 times 1 equals 0")[$0.2 · 0 · 1 = 0$]. Their sum is #math.equation(block: false, alt: "open parenthesis 1 , 1 , 0 close parenthesis")[$( 1 , 1 , 0 )$], but the surface above #math.equation(block: false, alt: "open parenthesis 1 , 1 close parenthesis")[$( 1 , 1 )$] sits at #math.equation(block: false, alt: "z equals 0.2 times 1 times 1 equals 0.2")[$z = 0.2 · 1 · 1 = 0.2$], not #math.equation(block: false, alt: "0")[$0$]. Scaling: #math.equation(block: false, alt: "open parenthesis 1 , 1 , 0.2 close parenthesis")[$( 1 , 1 , 0.2 )$] is on the surface; doubling gives #math.equation(block: false, alt: "open parenthesis 2 , 2 , 0.4 close parenthesis")[$( 2 , 2 , 0.4 )$], but the surface requires #math.equation(block: false, alt: "z equals 0.2 times 2 times 2 equals 0.8")[$z = 0.2 · 2 · 2 = 0.8$]. Doubling the inputs #emph[quadrupled] the output — the signature of the product #math.equation(block: false, alt: "x y")[$x y$], which is not linear. Both closure tests fail, so containing the origin was not enough. ] The three verdicts assemble into a picture worth keeping: the subspaces of #math.equation(block: false, alt: "ℝ cubed")[$ℝ^(3)$] are exactly the origin alone, the lines through the origin, the planes through the origin, and all of #math.equation(block: false, alt: "ℝ cubed")[$ℝ^(3)$]. Flat, through the origin, closed under the span-building operations — any curvature or any offset breaks the test somewhere. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ The subspace test has three clauses, but the picture has one: a subspace is a set that #emph[is] its own span. That is why spans, homogeneous solution sets, and — starting next chapter — the images and null spaces of matrices all pass automatically: each is built from adding and scaling, and the test asks for nothing else. ]