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
\[\begin{split}\displaystyle \left[\begin{matrix}\sin{\left(u \right)}\\\sin{\left(u \right)} \cos{\left(u \right)}\end{matrix}\right]\end{split}\]

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")
../_images/6c1fb237351636478050a9304c42656ef23d2afbf602a7268755f28981110394.png

Tangentvektor og tangent#

Vi finder tangentvektoren,

dr = r.diff(u)
dr
\[\begin{split}\displaystyle \left[\begin{matrix}\cos{\left(u \right)}\\- \sin^{2}{\left(u \right)} + \cos^{2}{\left(u \right)}\end{matrix}\right]\end{split}\]

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
\[\begin{split}\displaystyle \left[\begin{matrix}\frac{t}{2} + \frac{\sqrt{3}}{2}\\- \frac{t}{2} + \frac{\sqrt{3}}{4}\end{matrix}\right]\end{split}\]
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()
../_images/5de42aa013de8a399dd94bfdde1a7c175e212a9a8fbfe71c0e811ce8d5c5c9df.png

Længden af kurven#

Og så kan længden af denne kurve findes ved

\[\begin{equation*} \int_K\; \mathrm{d}\pmb{s} = \int_{0}^{2\pi} \Vert r'(u) \Vert \mathrm{d}u \end{equation*}\]
jacobiant = dtutools.l2_norm(dr)
integrate(jacobiant, (u,0,2*pi)).n()
../_images/27f459208ba7ae689ec4f79cb3c21fb875f6cc26b515b42a3b3680d2842c4256.png

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)
../_images/e7c97d9dcd7c3b25cb2afc87891d422640e6e94e46a6cedb93c40a63e277f65f.png

og en parameterkurve

r = Matrix([u*cos(u), u*sin(u), u])
r
\[\begin{split}\displaystyle \left[\begin{matrix}u \cos{\left(u \right)}\\u \sin{\left(u \right)}\\u\end{matrix}\right]\end{split}\]

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)
../_images/5db05fcb59d671e3aace5b5a7fcacebf5db41ab5b2e752e14660543bf3c65297.png

Restriktionen af funktionen til kurven er:

begrænsning = f(*r).simplify()
begrænsning
../_images/8e124b99a6fab88401c5c1587366b0c5b3627b59e593bb98ca8531b84dd0920a.png

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
../_images/34161a8bb3f16241c0c9c8919119e935e32444ce7210ee9efad11eda36a0a016.png

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
\[\begin{split}\displaystyle \left[\begin{matrix}- u \sin{\left(u \right)} + \cos{\left(u \right)}\\u \cos{\left(u \right)} + \sin{\left(u \right)}\\1\end{matrix}\right]\end{split}\]

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
../_images/dddd3db1592e73144655148e88e1e75e28a424771080ee564e1b9af4892cff06.png

Vi kan nu finde integralet langs kurven,

integrate( f(*r) * jacobiant ,(u,0,5)).evalf()
../_images/61c9ecd68f835faa488bf78bc0720849c918690632e63af499a17b8a4a0f6e74.png

og kurvens længde,

integrate(jacobiant,(u,0,5)).evalf()
../_images/1d49e626b7472a61c6596d291242ebe965a09db03db35d50e8dca6209c8c6061.png

Integral over cylinderflade i \(\mathbb{R}^3\)#

Vi betragter en funktion \(f: \mathbb{R}^3 \to \mathbb{R}\) givet ved

\[\begin{equation*} f(x,y,z) = 8 z \end{equation*}\]

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)
\[\begin{split}\displaystyle \left( \left[\begin{matrix}u \cos{\left(u \right)}\\u \sin{\left(u \right)}\\u v\end{matrix}\right], \ 8 z\right)\end{split}\]
dtuplot.plot3d_parametric_surface(*r,(u,0,pi/2),(v,0,1), aspect='equal')
../_images/85c5515e94ddf328b06052612ee41611fba509a5815eadf4867708a17e2c50f0.png
<spb.backends.matplotlib.matplotlib.MatplotlibBackend at 0x7f8c298f9190>

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
../_images/75b4ac99f31860ec3b24a28b895a51ad7ae237fa58f958bcda5027f554eee33a.png
integrand = f(*r) * jacobianten
integrand
../_images/e8e1ba65c7c57a1bb497651eabef9b5007cb490aa65605e1151bcd524c0a8513.png
integrate(integrand,(v,0,1),(u,0,pi/2)).evalf()
../_images/0a1a395c8a1da35cf49f1d818c1eb6c4653bb02d2470544d3277f5571abad8b1.png