#set document(title: "3.4 Tangent Planes and Local Flatness", 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")) == 3.4#h(0.6em)Tangent Planes and Local Flatness #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - Assemble the tangent plane at a point from the two partial derivatives there. - Test differentiability visually by shrinking the plotted window until surface and tangent plane cannot be told apart. - Use the linear approximation to estimate function values and quantify the error. ] The last section measured two slopes at a point of a surface. This section makes the central claim of differential calculus: near a point where #math.equation(block: false, alt: "f")[$f$] is differentiable, those two slopes are #emph[all you need], because the curved surface is locally indistinguishable from a plane. The plane through #math.equation(block: false, alt: "open parenthesis a , b , f open parenthesis a , b close parenthesis close parenthesis")[$( a , b , f ( a , b ) )$] whose #math.equation(block: false, alt: "x")[$x$]-slope is #math.equation(block: false, alt: "f sub x open parenthesis a , b close parenthesis")[$f_(x) ( a , b )$] and whose #math.equation(block: false, alt: "y")[$y$]-slope is #math.equation(block: false, alt: "f sub y open parenthesis a , b close parenthesis")[$f_(y) ( a , b )$] is the #strong[tangent plane], the graph of the #strong[linear approximation] #math.equation(block: true, alt: "L open parenthesis x , y close parenthesis equals f open parenthesis a , b close parenthesis plus f sub x open parenthesis a , b close parenthesis open parenthesis x minus a close parenthesis plus f sub y open parenthesis a , b close parenthesis open parenthesis y minus b close parenthesis .")[$L ( x , y ) = f ( a , b ) + f_(x) ( a , b ) ( x − a ) + f_(y) ( a , b ) ( y − b ) .$] Claims deserve tests, and the only fair test of "locally flat" is to zoom in and look. The figure is built for exactly that: the zoom is performed by editing the plotted window, not by trusting a picture. {"camera":{"fov":50,"position":\[5,4,3\],"projection":"perspective","target":\[1,0.5,0.75\]},"grid":{"axisColors":{"x":"\#ef4444","y":"\#22c55e","z":"\#3b82f6"},"divisions":10,"gridColor":"\#e5e7eb","showAxes":true,"showLabels":true,"size":10,"visible":true},"id":"59d1e955-a125-4b94-a740-1ef85c25133f","metadata":{"alt\_text":"A green-to-yellow saddle-shaped surface z = x squared minus y squared, pierced by a half-transparent red-and-blue flat plane. The two touch at a single dark marked point P at (1, 0.5, 0.75), where the plane is tangent to the saddle.","created\_at":"2026-07-07T00:00:00.000Z","description":"Workbook scene: saddle z = x^2 - y^2 on \[-2,2\]^2 with its tangent plane z = 2x - y - 0.75 at P = (1, 0.5, 0.75), and a labeled point at P. Camera targets P so shrinking both domains zooms in on the point of tangency.","tags":\["workbook","calc3","tangent-plane","linear-approximation","differentiability"\],"updated\_at":"2026-07-07T00:00:00.000Z"},"objects":\[{"expression":"x^2 - y^2","id":"8baa21e5-2754-4db7-9099-b9cd14157e03","kind":"explicit-surface","label":{"text":"z = x^2 - y^2","visible":true},"resolution":128,"style":{"colormap":"viridis","doubleSided":true,"opacity":0.6,"wireframe":false,"wireframeColor":"\#000000"},"visible":true,"xDomain":\[-2,2\],"yDomain":\[-2,2\]},{"expression":"2\*x - y - 0.75","id":"7211707c-982c-4b05-af46-6e9d71bf0fe1","kind":"explicit-surface","label":{"text":"tangent plane at P","visible":true},"resolution":32,"style":{"colormap":"coolwarm","doubleSided":true,"opacity":0.5,"wireframe":false,"wireframeColor":"\#000000"},"visible":true,"xDomain":\[-2,2\],"yDomain":\[-2,2\]},{"color":"\#111827","id":"10fdf0b4-ffe1-4643-a4a5-b48ea44ff54b","kind":"point","label":{"text":"P","visible":true},"radius":0.08,"visible":true,"x":1,"y":0.5,"z":0.75}\],"title":"Flat If You Get Close Enough \\u2014 saddle and tangent plane","version":1} The saddle #math.equation(block: false, alt: "z equals x squared minus y squared")[$z = x^(2) − y^(2)$] pierced by its half-transparent tangent plane #math.equation(block: false, alt: "z equals 2 x minus y minus 0.75")[$z = 2 x − y − 0.75$], the two touching at the single marked dark point #math.equation(block: false, alt: "P equals open parenthesis 1 , 0.5 , 0.75 close parenthesis")[$P = ( 1 , 0.5 , 0.75 )$]. The camera is aimed at #math.equation(block: false, alt: "P")[$P$], not the origin, so shrinking both objects' plotted domains zooms the scene in on the point of tangency. === Explore + Orbit around #math.equation(block: false, alt: "P")[$P$]. The plane is tangent at #math.equation(block: false, alt: "P")[$P$], yet away from #math.equation(block: false, alt: "P")[$P$] it slices straight through the saddle. Find a region where the plane runs above the surface and one where it runs below. + Orbit until you sight edge-on along the plane, so it reads as a line. Near #math.equation(block: false, alt: "P")[$P$], does the gap between surface and plane open quickly or slowly as you move away? + Predict before acting: if the plotted window shrinks to #math.equation(block: false, alt: "x")[$x$] from #math.equation(block: false, alt: "0.8")[$0.8$] to #math.equation(block: false, alt: "1.2")[$1.2$] and #math.equation(block: false, alt: "y")[$y$] from #math.equation(block: false, alt: "0.3")[$0.3$] to #math.equation(block: false, alt: "0.7")[$0.7$] on #emph[both] objects, will you still be able to tell which patch is the curved one? + Retype the saddle's domain fields to those values, then the plane's. Each edit regenerates instantly. Zoom in on the two small patches and orbit edge-on again. Can you tell them apart? + Push it: set both domains to #math.equation(block: false, alt: "x")[$x$] from #math.equation(block: false, alt: "0.95")[$0.95$] to #math.equation(block: false, alt: "1.05")[$1.05$], #math.equation(block: false, alt: "y")[$y$] from #math.equation(block: false, alt: "0.45")[$0.45$] to #math.equation(block: false, alt: "0.55")[$0.55$]. At this window the saddle #emph[is] its tangent plane, to the eye. + Widen both domains back to #math.equation(block: false, alt: "minus 2")[$− 2$], #math.equation(block: false, alt: "2")[$2$] and watch curvature return. Zooming never changed the function — only the window. Moving away from #math.equation(block: false, alt: "P")[$P$], does the gap open fastest in the #math.equation(block: false, alt: "x")[$x$]-direction, the #math.equation(block: false, alt: "y")[$y$]-direction, or diagonally? === What differentiability means Differentiability at #math.equation(block: false, alt: "P")[$P$] is precisely the success of this experiment: the error #math.equation(block: false, alt: "f open parenthesis x , y close parenthesis minus L open parenthesis x , y close parenthesis")[$f ( x , y ) − L ( x , y )$] shrinks #emph[faster] than your distance to #math.equation(block: false, alt: "P")[$P$], so every step of zoom makes the surface look flatter, without limit. No other plane through the point survives the test — tilt the plane by any amount and the edge-on gap reappears at some zoom level. That is why the tangent plane is worth naming: near #math.equation(block: false, alt: "P")[$P$], evaluating the easy linear #math.equation(block: false, alt: "L")[$L$] is as good as evaluating #math.equation(block: false, alt: "f")[$f$], and the next chapters spend the profit. #examplebox("Example 1")[Building the plane, then cashing it in][ Find the tangent plane to #math.equation(block: false, alt: "f open parenthesis x , y close parenthesis equals x squared minus y squared")[$f ( x , y ) = x^(2) − y^(2)$] at #math.equation(block: false, alt: "P equals open parenthesis 1 , 0.5 close parenthesis")[$P = ( 1 , 0.5 )$], use it to estimate #math.equation(block: false, alt: "f open parenthesis 1.1 , 0.6 close parenthesis")[$f ( 1.1 , 0.6 )$] and #math.equation(block: false, alt: "f open parenthesis 1.2 , 0.5 close parenthesis")[$f ( 1.2 , 0.5 )$], and compare with the true values. The partials are #math.equation(block: false, alt: "f sub x equals 2 x")[$f_(x) = 2 x$] and #math.equation(block: false, alt: "f sub y equals minus 2 y")[$f_(y) = − 2 y$], so at #math.equation(block: false, alt: "open parenthesis 1 , 0.5 close parenthesis")[$( 1 , 0.5 )$]: #math.equation(block: false, alt: "f equals 0.75")[$f = 0.75$], #math.equation(block: false, alt: "f sub x equals 2")[$f_(x) = 2$], #math.equation(block: false, alt: "f sub y equals minus 1")[$f_(y) = − 1$], and #math.equation(block: true, alt: "L open parenthesis x , y close parenthesis equals 0.75 plus 2 open parenthesis x minus 1 close parenthesis minus open parenthesis y minus 0.5 close parenthesis equals 2 x minus y minus 0.75 ,")[$L ( x , y ) = 0.75 + 2 ( x − 1 ) − ( y − 0.5 ) = 2 x − y − 0.75 ,$] exactly the plane in the scene. Now estimate. First, #math.equation(block: false, alt: "L open parenthesis 1.1 , 0.6 close parenthesis equals 2.2 minus 0.6 minus 0.75 equals 0.85")[$L ( 1.1 , 0.6 ) = 2.2 − 0.6 − 0.75 = 0.85$], while the true value is #math.equation(block: false, alt: "f open parenthesis 1.1 , 0.6 close parenthesis equals 1.21 minus 0.36 equals 0.85")[$f ( 1.1 , 0.6 ) = 1.21 − 0.36 = 0.85$] — #emph[exactly] equal. That is no accident: the error is #math.equation(block: false, alt: "f minus L equals open parenthesis x minus 1 close parenthesis squared minus open parenthesis y minus 0.5 close parenthesis squared")[$f − L = ( x − 1 )^(2) − ( y − 0.5 )^(2)$], itself a tiny saddle centered at #math.equation(block: false, alt: "P")[$P$], and it vanishes along the two diagonals through #math.equation(block: false, alt: "P")[$P$]; the point #math.equation(block: false, alt: "open parenthesis 1.1 , 0.6 close parenthesis")[$( 1.1 , 0.6 )$] sits on one. Second, #math.equation(block: false, alt: "L open parenthesis 1.2 , 0.5 close parenthesis equals 2.4 minus 0.5 minus 0.75 equals 1.15")[$L ( 1.2 , 0.5 ) = 2.4 − 0.5 − 0.75 = 1.15$] against the true #math.equation(block: false, alt: "f open parenthesis 1.2 , 0.5 close parenthesis equals 1.44 minus 0.25 equals 1.19")[$f ( 1.2 , 0.5 ) = 1.44 − 0.25 = 1.19$]: an error of #math.equation(block: false, alt: "0.04 equals open parenthesis 0.2 close parenthesis squared")[$0.04 = ( 0.2 )^(2)$], the square of the step. Quadratic error is the signature of a correct tangent plane — halve your distance to #math.equation(block: false, alt: "P")[$P$] and the error drops by four. ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ "Differentiable at #math.equation(block: false, alt: "P")[$P$]" and "locally flat at #math.equation(block: false, alt: "P")[$P$]" are the same sentence in two languages. The tangent plane is the flat stand-in, built from just two slice slopes — and the error of using it shrinks like the #emph[square] of your distance, which is why linearization is the workhorse of applied mathematics. ]