文章目录
- 极坐标基向量的推导
- 可视化
极坐标基向量的推导
极坐标其实很神奇,一方面,它描述的是平直时空,另一方面,任意两点间的坐标差为 d r , d θ \text dr, \text d\theta dr,dθ时,两点间的距离却是不固定的。极坐标到直角坐标的转换函数为
x = f x ( r , θ ) = r cos θ y = f y ( r , θ ) = r sin θ x=f_x(r,\theta)=r\cos\theta\quad y=f_y(r,\theta)=r\sin\theta x=fx(r,θ)=rcosθy=fy(r,θ)=rsinθ
考虑到行文简洁,在不引起歧义的情况下,用 x , y x,y x,y来表示 f x , f y f_x, f_y fx,fy。
对 r , θ r,\theta r,θ求偏导数,就可以得到二者在转换为直角坐标是时的变化情况,则
d s = d x 2 + d y 2 \text ds=\sqrt{\text dx^2+\text dy^2}\\ ds=dx2+dy2
其中
d x = ∂ x ∂ r d r + ∂ x ∂ θ d θ d y = ∂ y ∂ r d r + ∂ y ∂ θ d θ → [ d x d y ] = [ ∂ x ∂ r ∂ x ∂ θ ∂ y ∂ r ∂ y ∂ θ ] [ d r d θ ] \begin{aligned} \text dx=\frac{\partial x}{\partial r}\text dr+\frac{\partial x}{\partial\theta}\text d\theta\\ \text dy=\frac{\partial y}{\partial r}\text dr+\frac{\partial y}{\partial\theta}\text d\theta \end{aligned}\to \begin{bmatrix} \text dx\\ \text dy \end{bmatrix}=\begin{bmatrix} \frac{\partial x}{\partial r}&\frac{\partial x}{\partial \theta}\\ \frac{\partial y}{\partial r}&\frac{\partial y}{\partial \theta} \end{bmatrix}\begin{bmatrix} \text dr\\\text d\theta \end{bmatrix} dx=∂r∂xdr+∂θ∂xdθdy=∂r∂ydr+∂θ∂ydθ→[dxdy]=[∂r∂x∂r∂y∂θ∂x∂θ∂y][drdθ]
记 e r = [ ∂ x ∂ r , ∂ y ∂ r ] e_r=[\frac{\partial x}{\partial r}, \frac{\partial y}{\partial r}] er=[∂r∂x,∂r∂y], e θ = [ ∂ x ∂ θ , ∂ y ∂ θ ] e_\theta=[\frac{\partial x}{\partial\theta}, \frac{\partial y}{\partial\theta}] eθ=[∂θ∂x,∂θ∂y],称作极坐标系的基向量。
可以看到,这个基向量在不同的位置 ( x , y ) (x,y) (x,y)处的值显然是不同的,将其带入极坐标和直角坐标的换算关系,就可以得到基向量的具体表达式,
e r = [ cos θ , − r sin θ ] e θ = [ sin θ , r cos θ ] e_r=[\cos\theta, -r\sin\theta]\\ e_\theta=[\sin\theta, r\cos\theta] er=[cosθ,−rsinθ]eθ=[sinθ,rcosθ]
可视化
下面可以绘制一下这个基向量,采用matplotlib中的quiver函数。
import numpy as np
import matplotlib.pyplot as plt
M, N = 10, 20
r, th = np.indices([M, N])
r = r/10
th = th/N*np.pi*2
X, Y = r*np.cos(th), r*np.sin(th)
U1, V1 = np.cos(th), -r*np.sin(th)
U2, V2 = np.sin(th), r*np.cos(th)
style = dict(width=0.005, headwidth=8, headlength=6, headaxislength=4)
fig, ax = plt.subplots(1, 2, figsize=(8,4))
ax[0].quiver(X, Y, U1, V1, np.sqrt(U1**2+V1**2), **style)
ax[1].quiver(X, Y, U2, V2, np.sqrt(U2**2+V2**2), **style)
plt.tight_layout()
plt.show()
效果如下