#set document(title: "1.9 First Order Linear PDE", author: "Jiří Lebl") #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.9#h(0.6em)First Order Linear PDE We only considered ODE so far, so let us solve a linear first order PDE. Consider the equation #math.equation(block: true, alt: "a open parenthesis x , t close parenthesis u sub x plus b open parenthesis x , t close parenthesis u sub t plus c open parenthesis x , t close parenthesis u equals g open parenthesis x , t close parenthesis , u open parenthesis x , 0 close parenthesis equals f open parenthesis x close parenthesis , minus infinity less than x less than infinity , t greater than 0 ,")[$a ( x , t ) u_(x) + b ( x , t ) u_(t) + c ( x , t ) u = g ( x , t ) , #h(2em) u ( x , 0 ) = f ( x ) , #h(2em) − ∞ < x < ∞ , #h(1em) t > 0 ,$] where #math.equation(block: false, alt: "u open parenthesis x , t close parenthesis")[$u ( x , t )$] is a function of #math.equation(block: false, alt: "x")[$x$] and #math.equation(block: false, alt: "t")[$t$]. The #emph[initial condition] #math.equation(block: false, alt: "u open parenthesis x , 0 close parenthesis equals f open parenthesis x close parenthesis")[$u ( x , 0 ) = f ( x )$] is now a function of #math.equation(block: false, alt: "x")[$x$] rather than just a number. In these problems, it is useful to think of #math.equation(block: false, alt: "x")[$x$] as position and #math.equation(block: false, alt: "t")[$t$] as time. The equation describes the evolution of a function of #math.equation(block: false, alt: "x")[$x$] as time goes on. Below, the coefficients #math.equation(block: false, alt: "a")[$a$], #math.equation(block: false, alt: "b")[$b$], #math.equation(block: false, alt: "c")[$c$], and the function #math.equation(block: false, alt: "g")[$g$] are mostly going to be constant or zero. The method we describe works with nonconstant coefficients, although the computations may get difficult quickly. This method we use is the . The idea is that we find lines along which the equation is an ODE that we solve. We will see this technique again for second order PDE when we encounter the wave equation in #link("https://math.libretexts.org/Bookshelves/Differential_Equations/Differential_Equations_for_Engineers_(Lebl)/4%3A_Fourier_series_and_PDEs/4.08%3A_DAlembert_solution_of_the_wave_equation")[Section 4.8]. #examplebox("Example 1")[][ Consider the equation #math.equation(block: true, alt: "u sub t plus α u sub x equals 0 , u open parenthesis x , 0 close parenthesis equals f open parenthesis x close parenthesis .")[$u_(t) + α u_(x) = 0 , #h(2em) u ( x , 0 ) = f ( x ) .$] This particular equation, #math.equation(block: false, alt: "u sub t plus α u sub x equals 0")[$u_(t) + α u_(x) = 0$], is called the #emph[transport equation]. The data will propagate along curves called characteristics. The idea is to change to the so-called #emph[characteristic coordinates]. If we change to these coordinates, the equation simplifies. The change of variables for this equation is #math.equation(block: true, alt: "ξ equals x minus α t , s equals t .")[$ξ = x − α t , #h(2em) s = t .$] Let’s see what the equation becomes. Remember the chain rule in several variables. #math.equation(block: true, alt: "u sub t equals u sub ξ ξ sub t plus u sub s s sub t equals minus α u sub ξ plus u sub s ,; u sub x equals u sub ξ ξ sub x plus u sub s s sub x equals u sub ξ .")[$u_(t) = u_(ξ) ξ_(t) + u_(s) s_(t) = − α u_(ξ) + u_(s) , \ u_(x) = u_(ξ) ξ_(x) + u_(s) s_(x) = u_(ξ) .$] The equation in the coordinates #math.equation(block: false, alt: "ξ")[$ξ$] and #math.equation(block: false, alt: "s")[$s$] becomes #math.equation(block: true, alt: "open parenthesis minus α u sub ξ plus u sub s close parenthesis ⏟ u sub t plus α open parenthesis u sub ξ close parenthesis ⏟ u sub x equals 0 ,")[$limits(underbrace(( − α u_(ξ) + u_(s) )))_(u_(t)) + α limits(underbrace(( u_(ξ) )))_(u_(x)) = 0 ,$] or in other words #math.equation(block: true, alt: "u sub s equals 0 .")[$u_(s) = 0 .$] That is trivial to solve. Treating #math.equation(block: false, alt: "ξ")[$ξ$] as simply a parameter, we have obtained the ODE #math.equation(block: false, alt: "the fraction d u over d s equals 0")[$frac(d u, d s) = 0$]. The solution is a function that does not depend on #math.equation(block: false, alt: "s")[$s$] (but it does depend on #math.equation(block: false, alt: "ξ")[$ξ$]). That is, there is some function #math.equation(block: false, alt: "A")[$A$] such that #math.equation(block: true, alt: "u equals A open parenthesis ξ close parenthesis equals A open parenthesis x minus α t close parenthesis .")[$u = A ( ξ ) = A ( x − α t ) .$] The initial condition says that: #math.equation(block: true, alt: "f open parenthesis x close parenthesis equals u open parenthesis x , 0 close parenthesis equals A open parenthesis x minus α 0 close parenthesis equals A open parenthesis x close parenthesis ,")[$f ( x ) = u ( x , 0 ) = A ( x − α 0 ) = A ( x ) ,$] so #math.equation(block: false, alt: "A equals f")[$A = f$]. In other words, #math.equation(block: true, alt: "u open parenthesis x , t close parenthesis equals f open parenthesis x minus α t close parenthesis .")[$u ( x , t ) = f ( x − α t ) .$] Everything is simply moving right at speed #math.equation(block: false, alt: "α")[$α$] as #math.equation(block: false, alt: "t")[$t$] increases. The curve given by the equation #math.equation(block: true, alt: "ξ equals constant")[$ξ = "constant"$] is called the characteristic. See Figure #math.equation(block: false, alt: "1")[$1$]. In this case, the solution does not change along the characteristic. #figure(figph[Three characteristic curves. All lines of the same positive slope, but different x-intercepts], alt: "Three characteristic curves. All lines of the same positive slope, but different x-intercepts", caption: [Figure #math.equation(block: false, alt: "1")[$1$]: Characteristic curves.]) In the #math.equation(block: false, alt: "open parenthesis x , t close parenthesis")[$( x , t )$] coordinates, the characteristic curves satisfy #math.equation(block: false, alt: "t equals the fraction 1 over α open parenthesis x minus ξ close parenthesis")[$t = frac(1, α) ( x − ξ )$], and are in fact lines. The slope of characteristic lines is #math.equation(block: false, alt: "the fraction 1 over α")[$frac(1, α)$], and for each different #math.equation(block: false, alt: "ξ")[$ξ$] we get a different characteristic line. We see why #math.equation(block: false, alt: "u sub t plus α u sub x equals 0")[$u_(t) + α u_(x) = 0$] is called the transport equation: everything travels at some constant speed. Sometimes this is called . An example application is material being moved by a river where the material does not diffuse and is simply carried along. In this setup, #math.equation(block: false, alt: "x")[$x$] is the position along the river, #math.equation(block: false, alt: "t")[$t$] is the time, and #math.equation(block: false, alt: "u open parenthesis x , t close parenthesis")[$u ( x , t )$] the concentration the material at position #math.equation(block: false, alt: "x")[$x$] and time #math.equation(block: false, alt: "t")[$t$]. See Figure #math.equation(block: false, alt: "2")[$2$] for an example. #figure(figph[Two graphs. The left centered at y=0 and the right centered at y=1. Both start flat, then go up and down, and then flatten out again], alt: "Two graphs. The left centered at y=0 and the right centered at y=1. Both start flat, then go up and down, and then flatten out again", caption: [Figure #math.equation(block: false, alt: "2")[$2$]: Example of “transport” in #math.equation(block: false, alt: "u sub t minus u sub x equals 0")[$u_(t) − u_(x) = 0$] (that is, #math.equation(block: false, alt: "α equals 1")[$α = 1$]) where the initial condition #math.equation(block: false, alt: "f open parenthesis x close parenthesis")[$f ( x )$] is a peak at the origin. On the left is a graph of the initial condition #math.equation(block: false, alt: "u open parenthesis x , 0 close parenthesis")[$u ( x , 0 )$]. On the right is a graph of the function #math.equation(block: false, alt: "u open parenthesis x , 1 close parenthesis")[$u ( x , 1 )$], that is at time #math.equation(block: false, alt: "t equals 1")[$t = 1$]. Notice it is the same graph shifted one unit to the right.]) ] We use similar idea in the more general case: #math.equation(block: true, alt: "a u sub x plus b u sub t plus c u equals g , u open parenthesis x , 0 close parenthesis equals f open parenthesis x close parenthesis .")[$a u_(x) + b u_(t) + c u = g , #h(2em) u ( x , 0 ) = f ( x ) .$] We change coordinates to the characteristic coordinates. Let us call these coordinates #math.equation(block: false, alt: "open parenthesis ξ , s close parenthesis")[$( ξ , s )$]. These are coordinates where #math.equation(block: false, alt: "a u sub x plus b u sub t")[$a u_(x) + b u_(t)$] becomes differentiation in the #math.equation(block: false, alt: "s")[$s$] variable. Along the characteristic curves (where #math.equation(block: false, alt: "ξ")[$ξ$] is constant), we get a new ODE in the #math.equation(block: false, alt: "s")[$s$] variable. In the transport equation, we got the simple #math.equation(block: false, alt: "the fraction d u over d s equals 0")[$frac(d u, d s) = 0$]. In general, we get the linear equation #math.equation(block: true, alt: "the fraction d u over d s plus c u equals g .")[$frac(d u, d s) + c u = g .$] We think of everything as a function of #math.equation(block: false, alt: "ξ")[$ξ$] and #math.equation(block: false, alt: "s")[$s$], although we are thinking of #math.equation(block: false, alt: "ξ")[$ξ$] as a parameter rather than an independent variable. So the equation is an ODE. It is a linear ODE that we can solve using the integrating factor. To find the characteristics, think of a curve given parametrically #math.equation(block: false, alt: "open parenthesis x open parenthesis s close parenthesis , t open parenthesis s close parenthesis close parenthesis")[$( x ( s ) , t ( s ) )$]. We try to have the curve satisfy #math.equation(block: true, alt: "the fraction d x over d s equals a , the fraction d t over d s equals b .")[$frac(d x, d s) = a , #h(2em) frac(d t, d s) = b .$] Why? Because when we think of #math.equation(block: false, alt: "x")[$x$] and #math.equation(block: false, alt: "t")[$t$] as functions of #math.equation(block: false, alt: "s")[$s$] we find, using the chain rule, #math.equation(block: true, alt: "the fraction d u over d s plus c u equals open parenthesis u sub x the fraction d x over d s plus u sub t the fraction d t over d s close parenthesis ⏟ the fraction d u over d s plus c u equals a u sub x plus b u sub t plus c u equals g .")[$frac(d u, d s) + c u = limits(underbrace(( u_(x) frac(d x, d s) + u_(t) frac(d t, d s) )))_(frac(d u, d s)) + c u = a u_(x) + b u_(t) + c u = g .$] So we get the ODE (1.9.1), which then describes the value of the solution #math.equation(block: false, alt: "u")[$u$] of the PDE along this characteristic curve. It is also convenient to make sure that #math.equation(block: false, alt: "s equals 0")[$s = 0$] corresponds to #math.equation(block: false, alt: "t equals 0")[$t = 0$], that is #math.equation(block: false, alt: "t open parenthesis 0 close parenthesis equals 0")[$t ( 0 ) = 0$]. It will be convenient also for #math.equation(block: false, alt: "x open parenthesis 0 close parenthesis equals ξ")[$x ( 0 ) = ξ$]. See Figure #math.equation(block: false, alt: "3")[$3$]. #figure(figph[The graph contains (epsilon,0) at x=0 and goes through (x(s),t(s)).], alt: "The graph contains (epsilon,0) at x=0 and goes through (x(s),t(s)).", caption: [Figure #math.equation(block: false, alt: "3")[$3$]: General characteristic curve.]) #examplebox("Example 2")[][ Consider #math.equation(block: true, alt: "u sub x plus u sub t plus u equals x , u open parenthesis x , 0 close parenthesis equals e to the power minus x squared .")[$u_(x) + u_(t) + u = x , #h(2em) u ( x , 0 ) = e^(− x^(2)) .$] We find the characteristics, that is, the curves given by #math.equation(block: true, alt: "the fraction d x over d s equals 1 , the fraction d t over d s equals 1 .")[$frac(d x, d s) = 1 , #h(2em) frac(d t, d s) = 1 .$] So #math.equation(block: true, alt: "x equals s plus c sub 1 , t equals s plus c sub 2 ,")[$x = s + c_(1) , #h(2em) t = s + c_(2) ,$] for some #math.equation(block: false, alt: "c sub 1")[$c_(1)$] and #math.equation(block: false, alt: "c sub 2")[$c_(2)$]. At #math.equation(block: false, alt: "s equals 0")[$s = 0$] we want #math.equation(block: false, alt: "t equals 0")[$t = 0$], and #math.equation(block: false, alt: "x")[$x$] should be #math.equation(block: false, alt: "ξ")[$ξ$]. So we let #math.equation(block: false, alt: "c sub 1 equals ξ")[$c_(1) = ξ$] and #math.equation(block: false, alt: "c sub 2 equals 0")[$c_(2) = 0$]: #math.equation(block: true, alt: "x equals s plus ξ , t equals s .")[$x = s + ξ , #h(2em) t = s .$] The ODE is #math.equation(block: false, alt: "the fraction d u over d s plus u equals x")[$frac(d u, d s) + u = x$], and #math.equation(block: false, alt: "x equals s plus ξ")[$x = s + ξ$]. So, the ODE to solve along the characteristic is #math.equation(block: true, alt: "the fraction d u over d s plus u equals s plus ξ .")[$frac(d u, d s) + u = s + ξ .$] The general solution of this equation, treating #math.equation(block: false, alt: "ξ")[$ξ$] as a parameter, is #math.equation(block: false, alt: "u equals C e to the power minus s plus s plus ξ minus 1")[$u = C e^(− s) + s + ξ − 1$], for some constant #math.equation(block: false, alt: "C")[$C$]. At #math.equation(block: false, alt: "s equals 0")[$s = 0$], our initial condition is that #math.equation(block: false, alt: "u")[$u$] is #math.equation(block: false, alt: "e to the power minus ξ squared")[$e^(− ξ^(2))$], since at #math.equation(block: false, alt: "s equals 0")[$s = 0$] we have #math.equation(block: false, alt: "x equals ξ")[$x = ξ$]. Given this initial condition, we find #math.equation(block: false, alt: "C equals e to the power minus ξ squared minus ξ plus 1")[$C = e^(− ξ^(2)) − ξ + 1$]. So, #math.equation(block: true, alt: "u equals open parenthesis e to the power minus ξ squared minus ξ plus 1 close parenthesis e to the power minus s plus s plus ξ minus 1; equals e to the power minus ξ squared minus s plus open parenthesis 1 minus ξ close parenthesis e to the power minus s plus s plus ξ minus 1 .")[$u = ( e^(− ξ^(2)) − ξ + 1 ) e^(− s) + s + ξ − 1 \ = e^(− ξ^(2) − s) + ( 1 − ξ ) e^(− s) + s + ξ − 1 .$] Substitute #math.equation(block: false, alt: "ξ equals x minus t")[$ξ = x − t$] and #math.equation(block: false, alt: "s equals t")[$s = t$] to find #math.equation(block: false, alt: "u")[$u$] in terms of #math.equation(block: false, alt: "x")[$x$] and #math.equation(block: false, alt: "t")[$t$]: #math.equation(block: true, alt: "u equals e to the power minus ξ squared minus s plus open parenthesis 1 minus ξ close parenthesis e to the power minus s plus s plus ξ minus 1; equals e to the power minus open parenthesis x minus t close parenthesis squared minus t plus open parenthesis 1 minus x plus t close parenthesis e to the power minus t plus x minus 1 .")[$u = e^(− ξ^(2) − s) + ( 1 − ξ ) e^(− s) + s + ξ − 1 \ = e^(− attach(( x − t ), t: 2) − t) + ( 1 − x + t ) e^(− t) + x − 1 .$] See Figure #math.equation(block: false, alt: "4")[$4$] for a plot of #math.equation(block: false, alt: "u open parenthesis x , t close parenthesis")[$u ( x , t )$] as a function of two variables. The section's worked solution u = e^(−(x−t)²−t) + (1 − x + t)e^(−t) + x − 1, drawn as a profile in x instead of a frozen 3D surface. Drag t: at t = 0 the curve is exactly the initial condition e^(−x²), then the bump rides right at unit speed along the characteristics x − t = constant while the u term damps its height like e^(−t), and the whole profile relaxes onto the dashed steady state u = x − 1 forced by g = x. {"functions":\[{"color":"\#6b3fa0","domain":null,"expression":"x - 1","expression2":"","id":"steady-state","inequality":"lt","lineDash":\[6,4\],"lineWidth":1.5,"mode":"cartesian","tMax":10,"tMin":-10,"variable":"x","visible":true},{"color":"\#1f4e79","domain":null,"expression":"exp(-(x-t)^2 - t) + (1-x+t)\*exp(-t) + x - 1","expression2":"","id":"u-profile","inequality":"lt","lineDash":\[\],"lineWidth":2.5,"mode":"cartesian","tMax":10,"tMin":-10,"variable":"x","visible":true}\],"grid":{"axisColor":"\#333333","gridColor":"\#cccccc","majorSpacing":1,"minorGridColor":"\#eeeeee","showAxes":true,"showLabels":true},"parameters":\[{"id":"p-t","label":"Time","max":5,"min":0,"name":"t","step":0.05,"unit":"","value":0}\],"title":"u\_x + u\_t + u = x: the profile u(x,t) as time runs","version":1,"viewport":{"centerX":1.5,"centerY":0.5,"scale":55}} #figure(figph[A surface plot in R3.], alt: "A surface plot in R3.", caption: [Figure #math.equation(block: false, alt: "4")[$4$]: Plot of the solution #math.equation(block: false, alt: "u open parenthesis x , t close parenthesis")[$u ( x , t )$] to #math.equation(block: false, alt: "u sub x plus u sub t plus u equals x")[$u_(x) + u_(t) + u = x$], #math.equation(block: false, alt: "u open parenthesis x , 0 close parenthesis equals e to the power minus x squared")[$u ( x , 0 ) = e^(− x^(2))$].]) ] When the coefficients are not constants, the characteristic curves are not going to be straight lines anymore. #examplebox("Example 3")[][ Consider the following variable coefficient equation: #math.equation(block: true, alt: "x u sub x plus u sub t plus 2 u equals 0 , u open parenthesis x , 0 close parenthesis equals cos open parenthesis x close parenthesis .")[$x u_(x) + u_(t) + 2 u = 0 , #h(2em) u ( x , 0 ) = cos ( x ) .$] We find the characteristics, that is, the curves given by #math.equation(block: true, alt: "the fraction d x over d s equals x , the fraction d t over d s equals 1 .")[$frac(d x, d s) = x , #h(2em) frac(d t, d s) = 1 .$] So #math.equation(block: true, alt: "x equals c sub 1 e to the power s , t equals s plus c sub 2 .")[$x = c_(1) e^(s) , #h(2em) t = s + c_(2) .$] At #math.equation(block: false, alt: "s equals 0")[$s = 0$], we wish to get the line #math.equation(block: false, alt: "t equals 0")[$t = 0$], and #math.equation(block: false, alt: "x")[$x$] should be #math.equation(block: false, alt: "ξ")[$ξ$]. So #math.equation(block: true, alt: "x equals ξ e to the power s , t equals s .")[$x = ξ e^(s) , #h(2em) t = s .$] OK, the ODE we need to solve is #math.equation(block: true, alt: "the fraction d u over d s plus 2 u equals 0 .")[$frac(d u, d s) + 2 u = 0 .$] This is for a fixed #math.equation(block: false, alt: "ξ")[$ξ$]. At #math.equation(block: false, alt: "s equals 0")[$s = 0$], we should get that #math.equation(block: false, alt: "u")[$u$] is #math.equation(block: false, alt: "cos open parenthesis ξ close parenthesis")[$cos ( ξ )$], so that is our initial condition. Consequently, #math.equation(block: true, alt: "u equals e to the power minus 2 s cos open parenthesis ξ close parenthesis equals e to the power minus 2 t cos open parenthesis x e to the power minus t close parenthesis .")[$u = e^(− 2 s) cos ( ξ ) = e^(− 2 t) cos ( x e^(− t) ) .$] ] We make a few closing remarks. One thing to keep in mind is that we would get into trouble if the coefficient in front of #math.equation(block: false, alt: "u sub t")[$u_(t)$], that is the #math.equation(block: false, alt: "b")[$b$], is ever zero. Let us consider a quick example of what can go wrong: #math.equation(block: true, alt: "u sub x plus u equals 0 , u open parenthesis x , 0 close parenthesis equals sin open parenthesis x close parenthesis .")[$u_(x) + u = 0 , #h(2em) u ( x , 0 ) = sin ( x ) .$] This problem has no solution. If we had a solution, it would imply that #math.equation(block: false, alt: "u sub x open parenthesis x , 0 close parenthesis equals cos open parenthesis x close parenthesis")[$u_(x) ( x , 0 ) = cos ( x )$], but #math.equation(block: false, alt: "u sub x open parenthesis x , 0 close parenthesis plus u open parenthesis x , 0 close parenthesis equals cos open parenthesis x close parenthesis plus sin open parenthesis x close parenthesis ⧸ equals 0")[$u_(x) ( x , 0 ) + u ( x , 0 ) = cos ( x ) + sin ( x ) "⧸" = 0$]. The problem is that the characteristic curve is now the line #math.equation(block: false, alt: "t equals 0")[$t = 0$], and the solution is already provided on that line! As long as #math.equation(block: false, alt: "b")[$b$] is nonzero, it is convenient to ensure that #math.equation(block: false, alt: "b")[$b$] is positive by multiplying by #math.equation(block: false, alt: "minus 1")[$− 1$] if necessary, so that positive #math.equation(block: false, alt: "s")[$s$] means positive #math.equation(block: false, alt: "t")[$t$]. Another remark is that if #math.equation(block: false, alt: "a")[$a$] or #math.equation(block: false, alt: "b")[$b$] in the equation are variable, the computations can quickly get out of hand, as the expressions for the characteristic coordinates become messy and then solving the ODE becomes even messier. In the examples above, #math.equation(block: false, alt: "b")[$b$] was always #math.equation(block: false, alt: "1")[$1$], meaning we got #math.equation(block: false, alt: "s equals t")[$s = t$] in the characteristic coordinates. If #math.equation(block: false, alt: "b")[$b$] is not constant, your expression for #math.equation(block: false, alt: "s")[$s$] will be more complicated. Finding the characteristic coordinates is really a system of ODE in general if #math.equation(block: false, alt: "a")[$a$] depends on #math.equation(block: false, alt: "t")[$t$] or if #math.equation(block: false, alt: "b")[$b$] depends on #math.equation(block: false, alt: "x")[$x$]. In that case, we would need techniques of systems of ODE to solve, see #link("https://math.libretexts.org/Bookshelves/Differential_Equations/Differential_Equations_for_Engineers_(Lebl)/3%3A_Systems_of_ODEs")[Chapter 3] or #link("https://math.libretexts.org/Bookshelves/Differential_Equations/Differential_Equations_for_Engineers_(Lebl)/8%3A_Nonlinear_Systems")[Chapter 8]. In general, if #math.equation(block: false, alt: "a")[$a$] and #math.equation(block: false, alt: "b")[$b$] are not linear functions or constants, finding closed form expressions for the characteristic coordinates may be impossible. Finally, the method of characteristics applies to nonlinear first order PDE as well. In the nonlinear case, the characteristics depend not only on the differential equation, but also on the initial data. This leads to not only more difficult computations, but also the formation of singularities where the solution breaks down at a certain point in time. An example application where first order nonlinear PDE come up is traffic flow theory, and you have probably experienced the formation of singularities: traffic jams. But we digress.