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/0514b5040ef9db4c80a3445c1e72d023700318f4630a4fd5eb81157575e8a4fa.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/cd621f25dc28f421fd3c544ef0c41dbf331ea1666ee6e12f7687073f238fa222.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/970ab74c9761206dba47c4d66f2d081487f5d366075a5206f767d8b9fe1bb351.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/5bff1bf48475d5fc9adb6865d54e242a55432c05168ed8fb994a01bd376999f0.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/7a27e8ca8191d051fda204c2866597053f6d61c041eff76014c5479be5129116.png

Restriktionen af funktionen til kurven er:

begrænsning = f(*r).simplify()
begrænsning
../_images/5645ceb1e37c77d1527e159b20719e5bf92537268ea7e90b6b460803990b99cb.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/af03a64ac56cab269f1bef3975e8a8bd95a68922aebbb7f9a7072aefcf849391.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/6eaad6b6fc4bdadae770bc8216c3272eecc4f4c8811211d0ba989241d3443146.png

Vi kan nu finde integralet langs kurven,

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

og kurvens længde,

integrate(jacobiant,(u,0,5)).evalf()
../_images/8c29ac36692f6c409bc2612b8d3d94b4e5639a7bebc65992be88b58bdfd3a494.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/1939d2c9f9dae9cec85a9798fa514e98ee2281c02d0e31c42fee6461ead37d95.png
<spb.backends.matplotlib.matplotlib.MatplotlibBackend at 0x7f92f96dde50>

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/72be0fd5f14a63ecdccb3adaa95dbb7227630b8a810df27cb50bc4594d746383.png
integrand = f(*r) * jacobianten
integrand
../_images/205cc1814b40e364d0023cefec76537a5df4e4423af7f741ea81a3806f9feff6.png
integrate(integrand,(v,0,1),(u,0,pi/2)).evalf()
../_images/92ce73bf597d8a209ce3918896bc34577cc2efb51b9a0b84a772a77541cfc40e.png