Tartalomjegyzék

Script anal3_diffgeom_tenzor_polar_1

Teljes Matlab script (és live script) kiegészítő függvényekkel.
Tekintsd meg LiveEditor nézetben is!

File: anal3_diffgeom_tenzor_polar_1.m

Author: Peter Polcz (ppolcz@gmail.com)

Created on 2017.08.08. Tuesday, 02:56:40

Polárkoordináta rendszer bázisvektorai

A polárkoordináták mögé odaképzeljuk a Descartes coordinátákat.

r: sugar t: theta

syms x y z r t p real
Z = [ r ; t ];

R = [
    r*cos(t)
    r*sin(t)
    ];

$\vec Z_i$ bázisvektorok külön-külön számolva

Zr = diff(R,r)
Zt = diff(R,t)
Output:
Zr =
 cos(t)
 sin(t)
Zt =
 -r*sin(t)
  r*cos(t)

Kovariáns $\vec Z_i$ bázisvektorok (oszloposan)

Z_i = jacobian(R,Z)
Output:
Z_i =
[ cos(t), -r*sin(t)]
[ sin(t),  r*cos(t)]

Kovariáns $Z_{ij}$ metrika tenzor

Z_ij = simplify(Z_i'*Z_i)
Output:
Z_ij =
[ 1,   0]
[ 0, r^2]

Kontravariáns $Z_{ij}$ metrika tenzor

Zij = inv(Z_ij)
Output:
Zij =
[ 1,     0]
[ 0, 1/r^2]

Christoffel szimbólum $\Gamma_{ij}^k$

n = numel(Z);
Gamma = sym(zeros(n,n,n));

for k = 1:n % delta spans the variable labels over which symbols will be calculated
  for j = 1:n
    for i = 1:n
      for m = 1:n
        Gamma(i,j,k) = Gamma(i,j,k) + 0.5 * Zij(k,m) * ( ...
          diff(Z_ij(m,i), Z(j)) + diff(Z_ij(m,j), Z(i)) - diff(Z_ij(i,j), Z(m)) ...
          );
      end
    end
  end
end
Gamma
Output:
Gamma(:,:,1) =
[ 0,  0]
[ 0, -r]
Gamma(:,:,2) =
[   0, 1/r]
[ 1/r,   0]

Divergencia polárkoordinátákban

Először: kovariáns derivált számolása $\nabla_j V^i$, ahol $\vec V = V^1 \vec Z_r + V^2 \vec Z_\theta$.

syms r theta p real
Z = [r ; theta];
n = numel(Z);

syms V1(r,theta) V2(r,theta)

Ez egy szimbolikus függvény, nem indexelhető

Vi = [ V1 ; V2 ]
Output:
Vi(r, theta) =
 V1(r, theta)
 V2(r, theta)

Ez már egy szimbolikus mátrix (objektum), ez már indexelhető

Vi = Vi(r,theta)
diff(Vi,theta)
Nabla_jVi = jacobian(Vi,Z);

for j = 1:n
    for i = 1:n
        for m = 1:n
            Nabla_jVi(i,j) = Nabla_jVi(i,j) + Gamma(j,m,i)*Vi(m);
        end
    end
end

Nabla_jVi
div_Vi = trace(Nabla_jVi)
Output:
Vi =
 V1(r, theta)
 V2(r, theta)
ans =
 diff(V1(r, theta), theta)
 diff(V2(r, theta), theta)
Nabla_jVi =
[                  diff(V1(r, theta), r), diff(V1(r, theta), theta) - r*V2(r, theta)]
[ diff(V2(r, theta), r) + V2(r, theta)/r, diff(V2(r, theta), theta) + V1(r, theta)/r]
div_Vi =
diff(V1(r, theta), r) + diff(V2(r, theta), theta) + V1(r, theta)/r

Tehát $\nabla_i V^i = \frac{\partial V^1(r,\theta)}{\partial r} + \frac{\partial V^2(r,\theta)}{\partial \theta} + \frac{V^1(r,\theta)}{r}$

Laplace polárkoordinátákban

Először kiszámítjuk a $\nabla_i \nabla_j F(r,\theta)$ második kovariáns deriváltat. Majd ezt követően a $\Delta F(r,\theta)$-t is megkapjuk a következő módon: $\Delta F(r,\theta) = Z^{ij} \nabla_i \nabla_j F(r,\theta)$.

Általános függvény:

F = str2sym('f(r,theta)');

Nabla_iNabla_jF = sym(zeros(n,n));
for i = 1:n
    for j = 1:n
        Nabla_iNabla_jF(i,j) = diff(F,Z(i),Z(j));
        for k = 1:n
            Nabla_iNabla_jF(i,j) = Nabla_iNabla_jF(i,j) - Gamma(i,j,k) * diff(F,Z(k));
        end
    end
end

LaplaceF = sym(0);
for i = 1:n
    for j = 1:n
        LaplaceF = LaplaceF + Zij(i,j) * Nabla_iNabla_jF(i,j);
    end
end

expand(LaplaceF)
latex(ans)
Output:
ans =
diff(f(r, theta), r)/r + diff(f(r, theta), theta, theta)/r^2 + diff(f(r, theta), r, r)
ans =
    '\frac{\frac{\partial }{\partial r} f\left(r,\mathrm{theta}\right)}{r}+\frac{\frac{\partial ^2}{\partial {\mathrm{theta}}^2} f\left(r,\mathrm{theta}\right)}{r^2}+\frac{\partial ^2}{\partial r^2} f\left(r,\mathrm{theta}\right)'

Tehát $\Delta f(r,t) = $

Gradiens polárkoordinátákban

$$\nabla F = \frac{\partial F}{\partial Z^j} Z^{ij} \vec Z_i$$

Általános függvény:

F = str2sym('F(r,theta)');

grad_Fi = sym(zeros(1,n));
grad_F = sym(zeros(n,1));
for i = 1:n
    for j = 1:n
        grad_Fi(i) = grad_Fi(i) + diff(F,Z(j)) * Zij(i,j);
    end
    grad_F = grad_F + grad_Fi(i) * Z_i(:,i);
end
grad_Fi
grad_F
Output:
grad_Fi =
[ diff(F(r, theta), r), diff(F(r, theta), theta)/r^2]
grad_F =
 cos(t)*diff(F(r, theta), r) - (sin(t)*diff(F(r, theta), theta))/r
 sin(t)*diff(F(r, theta), r) + (cos(t)*diff(F(r, theta), theta))/r

Gradiense egy konkrét skalárfüggvénynek, pl. $F(r,\theta) = r$ vagy $F(r,\theta) = sin(\theta) e^{-r}$.

F = sin(theta) * exp(-r);
F = r;
subs(grad_Fi, str2sym('F(r,theta)'), F)
subs(grad_F, str2sym('F(r,theta)'), F)
Output:
ans =
[ 1, 0]
ans =
 cos(t)
 sin(t)

Kovariáns derivált számolása $\nabla_j V^i$, ahol $\vec V = V^1 \vec Z_r + V^2 \vec Z_\theta$, továbbá: $V^i = \left(\begin{array}{c} 1 \\ 0 \end{array}\right)$, ezért $\vec V = \vec Z_r$

Vi = [
    1
    0
    ];

Nabla_jVi = jacobian(Vi,Z);

for j = 1:n
    for i = 1:n
        for m = 1:n
            Nabla_jVi(i,j) = Nabla_jVi(i,j) + ...
                Gamma(j,m,i)*Vi(m);
        end
    end
end

div_Vi = trace(Nabla_jVi)
Output:
div_Vi =
1/r

Kiszámoljuk a divergenciáját Descartes koordináta rendszerben is!

syms x y real
Zp = [x ; y];

Vi = [
    x
    y
    ] / sqrt(x^2 + y^2);

div_Vi = simplify(divergence(Vi,Zp))
Output:
div_Vi =
1/(x^2 + y^2)^(1/2)

Kontravariáns derivált számolása egy teljesen általános tenzormezőre

syms r theta real

syms V1(r,theta) V2(r,theta)
Vi = [ V1 ; V2 ]; Vi = Vi(r,theta);

assume(in(Vi, 'real'))

Nabla_jVi = jacobian(Vi,Z);

for j = 1:n
    for i = 1:n
        for m = 1:n
            Nabla_jVi(i,j) = Nabla_jVi(i,j) + ...
                Gamma(j,m,i)*Vi(m);
        end
    end
end
Nabla_jVi
div_Vi = trace(Nabla_jVi)
Output:
Nabla_jVi =
[                  diff(V1(r, theta), r), diff(V1(r, theta), theta) - r*V2(r, theta)]
[ diff(V2(r, theta), r) + V2(r, theta)/r, diff(V2(r, theta), theta) + V1(r, theta)/r]
div_Vi =
diff(V1(r, theta), r) + diff(V2(r, theta), theta) + V1(r, theta)/r

Second-order covariant derivative of a scalar field

syms r theta real
F = str2sym('F(r,theta)');

Nabla_iNabla_jF = sym(zeros(n,n));
for i = 1:n
    for j = 1:n
        Nabla_iNabla_jF(i,j) = diff(F,Z(i),Z(j));
        for k = 1:n
            Nabla_iNabla_jF(i,j) = Nabla_iNabla_jF(i,j) - Gamma(i,j,k) * diff(F,Z(k));
        end
    end
end
Nabla_iNabla_jF
LaplaceF = expand(sum(sum(Zij .* Nabla_iNabla_jF)))
Output:
Nabla_iNabla_jF =
[                                  diff(F(r, theta), r, r), diff(F(r, theta), r, theta) - diff(F(r, theta), theta)/r]
[ diff(F(r, theta), r, theta) - diff(F(r, theta), theta)/r, r*diff(F(r, theta), r) + diff(F(r, theta), theta, theta)]
LaplaceF =
diff(F(r, theta), r)/r + diff(F(r, theta), theta, theta)/r^2 + diff(F(r, theta), r, r)