Uge 9a: Kurve- og fladeintegraler af skalære funktioner#
Demo af Christian Mikkelstrup, Hans Henrik Hermansen, Jakob Lemvig, Karl Johan Måstrup Kristensen og Magnus Troen
from sympy import *
from dtumathtools import*
init_printing()
x,y,z = symbols('x y z', real=True)
Kurvelængder#
Vi får givet en parameter-kurve,
u,v = symbols('u v', real=True)
r = Matrix([sin(u), sin(u)*cos(u)])
r
hvor \(u \in [0, 2\pi]\)
p_kurve = dtuplot.plot_parametric(*r, (u,0,2*pi), use_cm=False, label="r(u)",axis_center="auto")
Tangentvektor og tangent#
Vi finder tangentvektoren,
dr = r.diff(u)
dr
Vi finder nu parameterfremstillingen for tangenten svarende til kurvepunktet \(r(\pi/3)\),
t = symbols("t")
r_tan = r.subs(u,pi/3) + t*dr.subs(u,pi/3)
r_tan
p_point = dtuplot.scatter(r.subs(u,pi/3), show=False)
p_tan = dtuplot.plot_parametric(*r_tan, (t,-1,1), use_cm=False, label="r '(pi/3)", show=False)
(p_kurve + p_point + p_tan).show()
Længden af kurven#
Og så kan længden af denne kurve findes ved
jacobiant = dtutools.l2_norm(dr)
integrate(jacobiant, (u,0,2*pi)).n()
Kurveintegral i rummet#
Vi får givet en funktion:
x,y,z = symbols("x y z")
f = lambda x,y,z: sqrt(x**2 + y**2 + z**2)
f(x,y,z)
og en parameterkurve
r = Matrix([u*cos(u), u*sin(u), u])
r
for \(u\in[0,5]\).
p_rumkurve = dtuplot.plot3d_parametric_line(*r, (u,0,2*pi), use_cm=False, label="r(u)",aspect="equal", legend=True)
Restriktionen af funktionen til kurven er:
begrænsning = f(*r).simplify()
begrænsning
og hvis man husker at \(u\) er positiv, da vi har defineret \(u\in [0, 5]\), er absolutværdien irrelevant. Vi har dog, ved definitionen af vores u
og v
, defineret dem ved
u,v = symbols('u v', real=True)
hvor SymPy kun tager højde for at \(u=|u|\) i lige præcis det her tilfælde, hvis vi havde defineret dem ved
u,v = symbols('u v', real=True, nonnegative=True)
i stedet kan vi nu bruge \(\verb|refine()|\) og \(\verb|Q.|\textit{assumption}\verb|(symbol)|\), hvor assumption kan skiftes ud med prædikaterne i denne tabel.
Vi skal her bruge \(\verb|Q.nonnegative()|\), og så viser SymPy at begrænsningen faktisk er
ægte_begrænsning = refine(begrænsning, Q.nonnegative(u)) # Q.nonnegative(u) fortæller refine() at u >= 0
ægte_begrænsning
for \(u \in [0,5]\). Hvorvidt der står \(u\) eller \(|u|\) i udtrykket, kan nogen gange gøre forskellen hvis SymPy prøver integrerer det
Tilbage til kurveintegralet vi ønsker at bestemme: \(\int_K f(x,y,z)\, \mathrm{d}\pmb{s}\).
Først finder vi tangentvektoren,
dr = r.diff(u)
dr
Længden af tangentvektoren \(||r_u'(u)||\) er lig med jacobianten,
jacobiant = dtutools.l2_norm(dr).simplify()
# Følgende linje virker kun hvis $u$ er en reel variabel
# altså hvis 'u = symbols('u', real=True)'
# jacobi = dr.norm()
jacobiant
Vi kan nu finde integralet langs kurven,
integrate( f(*r) * jacobiant ,(u,0,5)).evalf()
og kurvens længde,
integrate(jacobiant,(u,0,5)).evalf()
Integral over cylinderflade i \(\mathbb{R}^3\)#
Vi betragter en funktion \(f: \mathbb{R}^3 \to \mathbb{R}\) givet ved
Vi betragter også en flade givet ved følgende parameterfremstilling med \(u \in [0,\frac{\pi}{2}]\) og \(v \in [0,1]\)
# Denne gang husker vi 'nonnegative=True', da vi igen ser at
# ingen af intervallerne for u og v indeholder negative tal
u,v = symbols('u v', real=True, nonnegative=True)
r = Matrix([u*cos(u),u*sin(u),u*v])
def f(x,y,z):
return 8*z
r, f(x,y,z)
dtuplot.plot3d_parametric_surface(*r,(u,0,pi/2),(v,0,1), aspect='equal')
<spb.backends.matplotlib.matplotlib.MatplotlibBackend at 0x7f60f07939a0>
Sidenote: Interaktive 3D-plots#
OBS: Dette behøves ikke. Personligt synes vi dog at det er rart at kunne vende og dreje 3D-plots, og få et bedre overblik over hvad der sker i plottet.
OBS 2: Derudover skal man være opmærksom på at ens notebook ikke kan eksporteres til PDF, hvis man har plot af denne type med. Det kan dog omgås, men overvej om du gider at bruge tid på at finde ud af det.
Vil man gerne kunne bevæge et 3D-plot, for få en bedre fornemmelse er det en mulighed at bruge en anden backend
når man plotter. Det kræver dog at man installere pakken plotly
med pip:
pip install plotly
Eller ved at udkommentere cellen nedenfor og eksekvere den en enkelt gang, så bliver plotly installeret i den version af Python din notebook bruger lige nu.
# ! pip install plotly
# vvvvvvvvvvvvvvvvvv her
# dtuplot.plot3d_parametric_surface(*r,(u,0,pi/2),(v,0,1), aspect='equal', backend=dtuplot.PB, use_cm=True)
Jacobianten for en flade i 3D#
Vi finder jacobianten og indsætter parameterfremstillingen i \(f\)
kryds = r.diff(u).cross(r.diff(v))
jacobianten = sqrt((kryds.T * kryds)[0]).simplify()
jacobianten
integrand = f(*r) * jacobianten
integrand
integrate(integrand,(v,0,1),(u,0,pi/2)).evalf()