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
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)
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)
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)
Z_ij = [ 1, 0] [ 0, r^2]
Kontravariáns $Z_{ij}$ metrika tenzor
Zij = inv(Z_ij)
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
Gamma(:,:,1) = [ 0, 0] [ 0, -r] Gamma(:,:,2) = [ 0, 1/r] [ 1/r, 0]
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 ]
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)
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}$
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)
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) = $
$$\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
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)
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)
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))
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)
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)))
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)