题 1.1
题中所给数均加星号表示估计值。
数 绝对误差限 相对误差限 a ∗ = 3580 a^*=3580 a ∗ = 3580 ∣ e ( a ∗ ) ∣ = 0.5 \vert e(a^*) \vert = 0.5 ∣ e ( a ∗ ) ∣ = 0.5 ∣ e r ( a ∗ ) ∣ = ∣ e ( a ∗ ) / a ∗ ∣ = 1.397 × 10 − 4 \vert e_r(a^*) \vert = \vert e(a^*)/a^* \vert = 1.397 \times 10^{-4} ∣ e r ( a ∗ ) ∣ = ∣ e ( a ∗ ) / a ∗ ∣ = 1.397 × 1 0 − 4 b ∗ = 0.00476 b^*=0.00476 b ∗ = 0.00476 ∣ e ( b ∗ ) ∣ = 5 × 10 − 6 \vert e(b^*) \vert = 5 \times 10^{-6} ∣ e ( b ∗ ) ∣ = 5 × 1 0 − 6 ∣ e r ( b ∗ ) ∣ = ∣ e ( b ∗ ) / b ∗ ∣ = 1.050 × 10 − 3 \vert e_r(b^*) \vert = \vert e(b^*)/b^* \vert = 1.050 \times 10^{-3} ∣ e r ( b ∗ ) ∣ = ∣ e ( b ∗ ) / b ∗ ∣ = 1.050 × 1 0 − 3 c ∗ = 2958 × 10 − 2 c^*=2958 \times 10^{-2} c ∗ = 2958 × 1 0 − 2 ∣ e ( c ∗ ) ∣ = 5 × 10 − 3 \vert e(c^*) \vert = 5 \times 10^{-3} ∣ e ( c ∗ ) ∣ = 5 × 1 0 − 3 ∣ e r ( c ∗ ) ∣ = ∣ e ( c ∗ ) / c ∗ ∣ = 1.690 × 10 − 4 \vert e_r(c^*) \vert = \vert e(c^*)/c^* \vert = 1.690 \times 10^{-4} ∣ e r ( c ∗ ) ∣ = ∣ e ( c ∗ ) / c ∗ ∣ = 1.690 × 1 0 − 4 d ∗ = 0.1430 × 10 8 d^*=0.1430 \times 10^8 d ∗ = 0.1430 × 1 0 8 ∣ e ( d ∗ ) ∣ = 5 × 10 3 \vert e(d^*) \vert = 5 \times 10^{3} ∣ e ( d ∗ ) ∣ = 5 × 1 0 3 ∣ e r ( d ∗ ) ∣ = ∣ e ( d ∗ ) / d ∗ ∣ = 3.497 × 10 − 4 \vert e_r(d^*) \vert = \vert e(d^*)/d^* \vert = 3.497 \times 10^{-4} ∣ e r ( d ∗ ) ∣ = ∣ e ( d ∗ ) / d ∗ ∣ = 3.497 × 1 0 − 4
题 1.2
证明:
令 y ( x ) = x y(x) = \sqrt{x} y ( x ) = x ,则由误差传播:
e r ( y ∗ ) = d y d x ( x ∗ ) ⋅ x ∗ y ∗ ⋅ e r ( x ∗ ) = 1 2 x ∗ ⋅ x ∗ x ∗ ⋅ e r ( x ∗ ) = 1 2 e r ( x ∗ ) e_r(y^*) = \frac{dy}{dx}(x^*) \cdot \frac{x^*}{y^*} \cdot e_r(x^*)
= \frac{1}{2} \sqrt{x^*} \cdot \frac{x^*}{\sqrt{x^*}} \cdot e_r(x^*)
= \frac{1}{2} e_r(x^*) e r ( y ∗ ) = d x d y ( x ∗ ) ⋅ y ∗ x ∗ ⋅ e r ( x ∗ ) = 2 1 x ∗ ⋅ x ∗ x ∗ ⋅ e r ( x ∗ ) = 2 1 e r ( x ∗ )
题 1.3
记正方形边长为 x x x ,则面积为 S ( x ) = x 2 S(x) = x^2 S ( x ) = x 2
面积的绝对误差限:
∣ e ( S ∗ ) ∣ = ∣ d S d x ( x ∗ ) ⋅ e ( x ∗ ) ∣ = 2 x ∗ ∣ e ( x ∗ ) ∣ \vert e(S^*) \vert = \vert \frac{dS}{dx}(x^*) \cdot e(x^*) \vert
= 2 x^* \vert e(x^*) \vert ∣ e ( S ∗ ) ∣ = ∣ d x d S ( x ∗ ) ⋅ e ( x ∗ ) ∣ = 2 x ∗ ∣ e ( x ∗ ) ∣
故允许的边长测量绝对误差限为:
∣ e ( x ∗ ) ∣ = ∣ e ( S ∗ ) ∣ 2 x ∗ = 5 × 10 − 3 [ c m ] \vert e(x^*) \vert = \frac{\vert e(S^*) \vert}{2 x^*} = 5 \times 10^{-3} [cm] ∣ e ( x ∗ ) ∣ = 2 x ∗ ∣ e ( S ∗ ) ∣ = 5 × 1 0 − 3 [ c m ]
题 1.4
距离的绝对误差限:
∣ e ( s ∗ ) ∣ = ∣ d s d t ( t ∗ ) ⋅ e ( t ∗ ) ∣ = g t ∗ ∣ e ( t ∗ ) ∣ \vert e(s^*) \vert = \vert \frac{ds}{dt}(t^*) \cdot e(t^*) \vert
= g t^* \vert e(t^*) \vert ∣ e ( s ∗ ) ∣ = ∣ d t d s ( t ∗ ) ⋅ e ( t ∗ ) ∣ = g t ∗ ∣ e ( t ∗ ) ∣
e ( t ∗ ) e(t^*) e ( t ∗ ) 不变,t ∗ t^* t ∗ 增加时,距离的绝对误差限也增加。
距离的相对误差限:
∣ e r ( s ∗ ) ∣ = ∣ d s d t ( t ∗ ) ⋅ e ( t ∗ ) s ∗ ∣ = 2 ∣ e ( t ∗ ) ∣ t ∗ \vert e_r(s^*) \vert = \vert \frac{ds}{dt}(t^*) \cdot \frac{e(t^*)}{s^*} \vert = \frac{2 \vert e(t^*) \vert}{t^*} ∣ e r ( s ∗ ) ∣ = ∣ d t d s ( t ∗ ) ⋅ s ∗ e ( t ∗ ) ∣ = t ∗ 2∣ e ( t ∗ ) ∣
e ( t ∗ ) e(t^*) e ( t ∗ ) 不变,t ∗ t^* t ∗ 增加时,距离的相对误差限减少。
题 1.5
记 a = 783 a = \sqrt{783} a = 783 ,a ∗ = 27.983 a^* = 27.983 a ∗ = 27.983 ,则
∣ e ( a ∗ ) ∣ ≤ 1 2 × 10 − 3 \vert e(a*) \vert \le \frac{1}{2} \times 10^{-3} ∣ e ( a ∗ ) ∣ ≤ 2 1 × 1 0 − 3
x 1 , 2 = 56 ± 56 2 − 4 2 = 28 ± a x_{1, 2} = \frac{56 \pm \sqrt{56^2 - 4}}{2} = 28 \pm a x 1 , 2 = 2 56 ± 5 6 2 − 4 = 28 ± a
故
x 1 ∗ = 28 + a ∗ = 55.983 x_1^* = 28 + a^* = 55.983 x 1 ∗ = 28 + a ∗ = 55.983
且绝对误差限
∣ e ( x 1 ∗ ) ∣ = ∣ e ( a ∗ ) ∣ ≤ 1 2 × 10 − 3 \vert e(x_1^*) \vert = \vert e(a^*) \vert \le \frac{1}{2} \times 10^{-3} ∣ e ( x 1 ∗ ) ∣ = ∣ e ( a ∗ ) ∣ ≤ 2 1 × 1 0 − 3
故 x 1 ∗ x_1^* x 1 ∗ 至少有5位有效数字
另一方面,由 x 1 ⋅ x 2 = 1 x_1 \cdot x_2 = 1 x 1 ⋅ x 2 = 1 得:
x 2 ∗ = 1 x 1 ∗ = 0.017863 x_2^* = \frac{1}{x_1^*} = 0.017863 x 2 ∗ = x 1 ∗ 1 = 0.017863
且绝对误差限
∣ e ( x 2 ∗ ) ∣ = ∣ − 1 ( x 1 ∗ ) 2 ⋅ e ( x 1 ∗ ) ∣ ≤ 1.60 × 10 − 7 \vert e(x_2^*) \vert = \vert -\frac{1}{(x_1^*)^2} \cdot e(x_1^*) \vert \le 1.60 \times 10^{-7} ∣ e ( x 2 ∗ ) ∣ = ∣ − ( x 1 ∗ ) 2 1 ⋅ e ( x 1 ∗ ) ∣ ≤ 1.60 × 1 0 − 7
故 x 2 ∗ x_2^* x 2 ∗ 至少有5位有效数字
题 1.6
问题 1
我们先对连续世界定义两种圆度:等周型圆度与曲率型圆度,并比较它们之间的差异。本质上等周型圆度是利用曲线的整体性质(周长、面积)来度量,而曲率型圆度则是利用曲线的局部性质(曲率)来度量。所以等周型圆度对震荡不敏感,而后者对曲线的震荡更加敏感。
设 γ ⊂ R 2 \gamma \subset \mathbb{R}^2 γ ⊂ R 2 为简单闭曲线(C 2 C^2 C 2 光滑),并取弧长参数 s ∈ [ 0 , L ] s \in [0,L] s ∈ [ 0 , L ] 。定义:
L = ∫ γ d s L = \int_\gamma ds L = ∫ γ d s :周长
A = 1 2 ∮ γ ( x d y − y d x ) A = \frac{1}{2}\oint_\gamma (x\,dy - y\,dx) A = 2 1 ∮ γ ( x d y − y d x ) :包围面积
κ ( s ) \kappa(s) κ ( s ) :相对曲率
定义一:等周型圆度(Isoperimetric Circularity)
ξ iso ( γ ) : = L 2 4 A \xi_{\text{iso}}(\gamma) := \frac{L^2}{4A} ξ iso ( γ ) := 4 A L 2
定理 1.1 (等周不等式):对任意简单闭曲线 γ \gamma γ ,
ξ iso ( γ ) ≥ π \xi_{\text{iso}}(\gamma) \geq \pi ξ iso ( γ ) ≥ π
等号成立当且仅当 γ \gamma γ 为圆。
证明 :由等周不等式 L 2 ≥ 4 π A L^2 \geq 4\pi A L 2 ≥ 4 π A 可得。∎
定义二:曲率型圆度(Curvatural Circularity)
设曲率半径 ρ ( s ) : = κ ( s ) − 1 \rho(s) := \kappa(s)^{-1} ρ ( s ) := κ ( s ) − 1 (约定 κ ≠ 0 \kappa \neq 0 κ = 0 对简单闭曲线),定义:
ξ cur ( γ ) : = π ⋅ ∫ 0 L ρ ( s ) 2 d s ( ∫ 0 L ρ ( s ) d s ) 2 ⋅ L = π ⋅ E [ ρ 2 ] E [ ρ ] 2 \xi_{\text{cur}}(\gamma) := \pi \cdot \frac{\displaystyle\int_0^L \rho(s)^2\,ds}{\left(\displaystyle\int_0^L \rho(s)
\,ds\right)^2} \cdot L = \pi \cdot \frac{\mathbb{E}[\rho^2]}{\mathbb{E}[\rho]^2} ξ cur ( γ ) := π ⋅ ( ∫ 0 L ρ ( s ) d s ) 2 ∫ 0 L ρ ( s ) 2 d s ⋅ L = π ⋅ E [ ρ ] 2 E [ ρ 2 ]
定理 1.2 :对任意简单闭曲线 γ \gamma γ (κ ≠ 0 \kappa \neq 0 κ = 0 ),
ξ cur ( γ ) ≥ π \xi_{\text{cur}}(\gamma) \geq \pi ξ cur ( γ ) ≥ π
等号成立当且仅当 ρ ( s ) ≡ const \rho(s) \equiv \text{const} ρ ( s ) ≡ const ,即 γ \gamma γ 为圆。
证明 :由柯西-施瓦茨不等式,
( ∫ ρ ) 2 ≤ ( ∫ 1 2 ) ( ∫ ρ 2 ) = L ∫ ρ 2 \left(\int \rho\right)^2 \leq \left(\int 1^2\right)\left(\int \rho^2\right) = L \int \rho^2 ( ∫ ρ ) 2 ≤ ( ∫ 1 2 ) ( ∫ ρ 2 ) = L ∫ ρ 2
故 L ⋅ ∫ ρ 2 ( ∫ ρ ) 2 ≥ 1 \frac{L \cdot \int \rho^2}{(\int \rho)^2} \geq 1 ( ∫ ρ ) 2 L ⋅ ∫ ρ 2 ≥ 1 。等号成立当且仅当 ρ ( s ) ≡ c \rho(s) \equiv c ρ ( s ) ≡ c 。∎
近圆凸曲线下两种定义的比较
既然给出了两种定义,那么我们还是希望比较一下两者的差异。利用一点变分法的思想,在近圆曲线下比较一下两种圆度与 π \pi π 的差异。如果不想看过于复杂的数学推导,可以直接跳到比较部分
设 γ ϵ \gamma_\epsilon γ ϵ 为近圆曲线:
h ( θ ) = r + ϵ u ( θ ) , θ ∈ [ 0 , 2 π ] h(\theta) = r + \epsilon u(\theta), \quad \theta \in [0, 2\pi] h ( θ ) = r + ϵ u ( θ ) , θ ∈ [ 0 , 2 π ]
其中:
r > 0 r > 0 r > 0 为半径(常数)
ϵ \epsilon ϵ 为小量(常数)
u ( θ ) u(\theta) u ( θ ) 为光滑扰动函数,满足标准化条件 :
∫ 0 2 π u ( θ ) d θ = 0 \int_0^{2\pi} u(\theta)\,d\theta = 0 ∫ 0 2 π u ( θ ) d θ = 0
对凸闭曲线,各几何量可用 h ( θ ) h(\theta) h ( θ ) 表示为:
曲率半径:ρ ( θ ) = h ( θ ) + h ′ ′ ( θ ) \rho(\theta) = h(\theta) + h''(\theta) ρ ( θ ) = h ( θ ) + h ′′ ( θ )
周长:L = ∫ 0 2 π h ( θ ) d θ L = \int_0^{2\pi} h(\theta)\,d\theta L = ∫ 0 2 π h ( θ ) d θ
面积:A = 1 2 ∫ 0 2 π ( h 2 − h ′ 2 ) d θ A = \frac{1}{2}\int_0^{2\pi} (h^2 - h'^2)\,d\theta A = 2 1 ∫ 0 2 π ( h 2 − h ′2 ) d θ
等周型圆度
近圆曲线周长:
L = ∫ 0 2 π ( r + ϵ u ) d θ = 2 π r + ϵ ∫ 0 2 π u d θ = 2 π r L = \int_0^{2\pi} (r + \epsilon u)\,d\theta = 2\pi r + \epsilon \int_0^{2\pi} u\,d\theta = 2\pi r L = ∫ 0 2 π ( r + ϵ u ) d θ = 2 π r + ϵ ∫ 0 2 π u d θ = 2 π r
又因为:
h 2 = r 2 + 2 ϵ r u + ϵ 2 u 2 h^2 = r^2 + 2\epsilon r u + \epsilon^2 u^2 h 2 = r 2 + 2 ϵr u + ϵ 2 u 2
h ′ 2 = ϵ 2 u ′ 2 h'^2 = \epsilon^2 u'^2 h ′2 = ϵ 2 u ′2
h 2 − h ′ 2 = r 2 + 2 ϵ r u + ϵ 2 ( u 2 − u ′ 2 ) h^2 - h'^2 = r^2 + 2\epsilon r u + \epsilon^2(u^2 - u'^2) h 2 − h ′2 = r 2 + 2 ϵr u + ϵ 2 ( u 2 − u ′2 )
故面积:
A = 1 2 ∫ 0 2 π ( r 2 + 2 ϵ r u + ϵ 2 ( u 2 − u ′ 2 ) ) d θ A = \frac{1}{2}\int_0^{2\pi}\left(r^2 + 2\epsilon r u + \epsilon^2(u^2 - u'^2)\right)d\theta A = 2 1 ∫ 0 2 π ( r 2 + 2 ϵr u + ϵ 2 ( u 2 − u ′2 ) ) d θ
= π r 2 + ϵ r ∫ 0 2 π u d θ ⏟ = 0 + ϵ 2 2 ∫ 0 2 π ( u 2 − u ′ 2 ) d θ = \pi r^2 + \epsilon r \underbrace{\int_0^{2\pi} u\,d\theta}_{=0} + \frac{\epsilon^2}{2}\int_0^{2\pi}(u^2 - u'^2)\,d\theta = π r 2 + ϵr = 0 ∫ 0 2 π u d θ + 2 ϵ 2 ∫ 0 2 π ( u 2 − u ′2 ) d θ
从而等周圆度:
ξ iso = L 2 4 A = 4 π 2 r 2 4 ( π r 2 + ϵ 2 2 ∫ ( u 2 − u ′ 2 ) d θ ) \xi_{\text{iso}} = \frac{L^2}{4A} = \frac{4\pi^2 r^2}{4\left(\pi r^2 + \frac{\epsilon^2}{2}\int(u^2-u'^2)d\theta \right)} ξ iso = 4 A L 2 = 4 ( π r 2 + 2 ϵ 2 ∫ ( u 2 − u ′2 ) d θ ) 4 π 2 r 2
= π ⋅ ( 1 + ϵ 2 2 π r 2 ∫ 0 2 π ( u 2 − u ′ 2 ) d θ ) − 1 = \pi \cdot \left(1 + \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi}(u^2-u'^2)\,d\theta\right)^{-1} = π ⋅ ( 1 + 2 π r 2 ϵ 2 ∫ 0 2 π ( u 2 − u ′2 ) d θ ) − 1
对 ϵ ≪ 1 \epsilon \ll 1 ϵ ≪ 1 展开也即:
ξ iso = π ( 1 − ϵ 2 2 π r 2 ∫ 0 2 π ( u 2 − u ′ 2 ) d θ + O ( ϵ 4 ) ) \xi_{\text{iso}} = \pi\left(1 - \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi}(u^2-u'^2)\,d\theta + O(\epsilon^4)\right) ξ iso = π ( 1 − 2 π r 2 ϵ 2 ∫ 0 2 π ( u 2 − u ′2 ) d θ + O ( ϵ 4 ) )
曲率型圆度
曲率半径:
ρ = h + h ′ ′ = r + ϵ ( u + u ′ ′ ) = : r + ϵ v \rho = h + h'' = r + \epsilon(u + u'') =: r + \epsilon v ρ = h + h ′′ = r + ϵ ( u + u ′′ ) =: r + ϵ v
其中 v : = u + u ′ ′ v := u + u'' v := u + u ′′ ,且 ∫ 0 2 π v d θ = ∫ 0 2 π ( u + u ′ ′ ) d θ = 0 \int_0^{2\pi} v\,d\theta = \int_0^{2\pi}(u + u'')\,d\theta = 0 ∫ 0 2 π v d θ = ∫ 0 2 π ( u + u ′′ ) d θ = 0 (因 u u u 是周期的)。
计算 ∫ 0 L ρ d s \int_0^L \rho\,ds ∫ 0 L ρ d s (分母):
∫ 0 L ρ d s = ∫ 0 2 π ρ 2 d θ \int_0^L \rho\,ds = \int_0^{2\pi} \rho^2\,d\theta ∫ 0 L ρ d s = ∫ 0 2 π ρ 2 d θ
= ∫ 0 2 π ( r + ϵ v ) 2 d θ = \int_0^{2\pi}(r + \epsilon v)^2\,d\theta = ∫ 0 2 π ( r + ϵ v ) 2 d θ
= 2 π r 2 + 2 ϵ r ∫ 0 2 π v d θ ⏟ = 0 + ϵ 2 ∫ 0 2 π v 2 d θ = 2\pi r^2 + 2\epsilon r \underbrace{\int_0^{2\pi} v\,d\theta}_{=0} + \epsilon^2 \int_0^{2\pi} v^2\,d\theta = 2 π r 2 + 2 ϵr = 0 ∫ 0 2 π v d θ + ϵ 2 ∫ 0 2 π v 2 d θ
= 2 π r 2 + ϵ 2 ∫ 0 2 π v 2 d θ = 2\pi r^2 + \epsilon^2 \int_0^{2\pi} v^2\,d\theta = 2 π r 2 + ϵ 2 ∫ 0 2 π v 2 d θ
计算 ∫ 0 L ρ 2 d s \int_0^L \rho^2\,ds ∫ 0 L ρ 2 d s (分子):
∫ 0 L ρ 2 d s = ∫ 0 2 π ρ 3 d θ \int_0^L \rho^2\,ds = \int_0^{2\pi} \rho^3\,d\theta ∫ 0 L ρ 2 d s = ∫ 0 2 π ρ 3 d θ
= ∫ 0 2 π ( r + ϵ v ) 3 d θ = \int_0^{2\pi}(r + \epsilon v)^3\,d\theta = ∫ 0 2 π ( r + ϵ v ) 3 d θ
= ∫ 0 2 π ( r 3 + 3 ϵ r 2 v + 3 ϵ 2 r v 2 + ϵ 3 v 3 ) d θ = \int_0^{2\pi}(r^3 + 3\epsilon r^2 v + 3\epsilon^2 r v^2 + \epsilon^3 v^3)\,d\theta = ∫ 0 2 π ( r 3 + 3 ϵ r 2 v + 3 ϵ 2 r v 2 + ϵ 3 v 3 ) d θ
= 2 π r 3 + 3 ϵ r 2 ∫ 0 2 π v d θ ⏟ = 0 + 3 ϵ 2 r ∫ 0 2 π v 2 d θ + O ( ϵ 3 ) = 2\pi r^3 + 3\epsilon r^2 \underbrace{\int_0^{2\pi} v\,d\theta}_{=0} + 3\epsilon^2 r \int_0^{2\pi} v^2\,d\theta + O(\epsilon^3) = 2 π r 3 + 3 ϵ r 2 = 0 ∫ 0 2 π v d θ + 3 ϵ 2 r ∫ 0 2 π v 2 d θ + O ( ϵ 3 )
= 2 π r 3 + 3 ϵ 2 r ∫ 0 2 π v 2 d θ + O ( ϵ 3 ) = 2\pi r^3 + 3\epsilon^2 r \int_0^{2\pi} v^2\,d\theta + O(\epsilon^3) = 2 π r 3 + 3 ϵ 2 r ∫ 0 2 π v 2 d θ + O ( ϵ 3 )
计算 v 2 v^2 v 2 的积分:
∫ 0 2 π v 2 d θ = ∫ 0 2 π ( u 2 − 2 u ′ 2 + u ′ ′ 2 ) d θ \int_0^{2\pi} v^2\,d\theta = \int_0^{2\pi}(u^2 - 2u'^2 + u''^2)\,d\theta ∫ 0 2 π v 2 d θ = ∫ 0 2 π ( u 2 − 2 u ′2 + u ′′2 ) d θ
其中用到分部积分 ∫ u u ′ ′ = − ∫ u ′ 2 \int uu'' = -\int u'^2 ∫ u u ′′ = − ∫ u ′2
故曲率圆度:
ξ cur = π ⋅ L ⋅ ∫ 0 L ρ 2 d s ( ∫ 0 L ρ d s ) 2 = π ⋅ 2 π r ⋅ ( 2 π r 3 + 3 ϵ 2 r ∫ v 2 ) ( 2 π r 2 + ϵ 2 ∫ v 2 ) 2 \xi_{\text{cur}} = \pi \cdot \frac{L \cdot \int_0^L \rho^2\,ds}{\left(\int_0^L \rho\,ds\right)^2}
= \pi \cdot \frac{2\pi r \cdot \left(2\pi r^3 + 3\epsilon^2 r \int v^2\right)}{\left(2\pi r^2 + \epsilon^2 \int v^2\right)^2} ξ cur = π ⋅ ( ∫ 0 L ρ d s ) 2 L ⋅ ∫ 0 L ρ 2 d s = π ⋅ ( 2 π r 2 + ϵ 2 ∫ v 2 ) 2 2 π r ⋅ ( 2 π r 3 + 3 ϵ 2 r ∫ v 2 )
= π ⋅ 4 π 2 r 4 ( 1 + 3 ϵ 2 2 π r 2 ∫ v 2 ) 4 π 2 r 4 ( 1 + ϵ 2 π r 2 ∫ v 2 + O ( ϵ 4 ) ) = \pi \cdot \frac{4\pi^2 r^4\left(1 + \frac{3\epsilon^2}{2\pi r^2}\int v^2\right)}
{4\pi^2 r^4\left(1 + \frac{\epsilon^2}{\pi r^2}\int v^2 + O(\epsilon^4)\right)} = π ⋅ 4 π 2 r 4 ( 1 + π r 2 ϵ 2 ∫ v 2 + O ( ϵ 4 ) ) 4 π 2 r 4 ( 1 + 2 π r 2 3 ϵ 2 ∫ v 2 )
= π ⋅ ( 1 + 3 ϵ 2 2 π r 2 ∫ v 2 ) ( 1 − ϵ 2 π r 2 ∫ v 2 + O ( ϵ 4 ) ) = \pi \cdot \left(1 + \frac{3\epsilon^2}{2\pi r^2}\int v^2\right)\left(1 - \frac{\epsilon^2}{\pi r^2}\int v^2 + O(\epsilon^4)\right) = π ⋅ ( 1 + 2 π r 2 3 ϵ 2 ∫ v 2 ) ( 1 − π r 2 ϵ 2 ∫ v 2 + O ( ϵ 4 ) )
= π ⋅ ( 1 + 3 ϵ 2 2 π r 2 ∫ v 2 − 2 ϵ 2 2 π r 2 ∫ v 2 + O ( ϵ 4 ) ) = \pi \cdot \left(1 + \frac{3\epsilon^2}{2\pi r^2}\int v^2 - \frac{2\epsilon^2}{2\pi r^2}\int v^2 + O(\epsilon^4)\right) = π ⋅ ( 1 + 2 π r 2 3 ϵ 2 ∫ v 2 − 2 π r 2 2 ϵ 2 ∫ v 2 + O ( ϵ 4 ) )
= π ⋅ ( 1 + ϵ 2 2 π r 2 ∫ 0 2 π v 2 d θ + O ( ϵ 4 ) ) = \pi \cdot \left(1 + \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi} v^2\,d\theta + O(\epsilon^4)\right) = π ⋅ ( 1 + 2 π r 2 ϵ 2 ∫ 0 2 π v 2 d θ + O ( ϵ 4 ) )
也即:
ξ cur = π ( 1 + ϵ 2 2 π r 2 ∫ 0 2 π ( u 2 − 2 u ′ 2 + u ′ ′ 2 ) d θ + O ( ϵ 4 ) ) \xi_{\text{cur}} = \pi\left(1 + \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi}(u^2 - 2u'^2 + u''^2)\,d\theta + O(\epsilon^4)\right) ξ cur = π ( 1 + 2 π r 2 ϵ 2 ∫ 0 2 π ( u 2 − 2 u ′2 + u ′′2 ) d θ + O ( ϵ 4 ) )
比较
ξ iso = π ( 1 − ϵ 2 2 π r 2 ∫ 0 2 π ( u 2 − u ′ 2 ) d θ + O ( ϵ 4 ) ) \xi_{\text{iso}} = \pi\left(1 - \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi}(u^2-u'^2)\,d\theta + O(\epsilon^4)\right) ξ iso = π ( 1 − 2 π r 2 ϵ 2 ∫ 0 2 π ( u 2 − u ′2 ) d θ + O ( ϵ 4 ) )
ξ cur = π ( 1 + ϵ 2 2 π r 2 ∫ 0 2 π ( u 2 − 2 u ′ 2 + u ′ ′ 2 ) d θ + O ( ϵ 4 ) ) \xi_{\text{cur}} = \pi\left(1 + \frac{\epsilon^2}{2\pi r^2}\int_0^{2\pi}(u^2 - 2u'^2 + u''^2)\,d\theta + O(\epsilon^4)\right) ξ cur = π ( 1 + 2 π r 2 ϵ 2 ∫ 0 2 π ( u 2 − 2 u ′2 + u ′′2 ) d θ + O ( ϵ 4 ) )
可以看出等周型圆度中仅包含 u u u 和 u ′ u' u ′ ,而曲率型圆度还包含 u ′ ′ u'' u ′′ ,故前者对曲线的震荡并不敏感,而后者对曲线的震荡更加敏感。事实上,这也是符合我们的直观认识的,对于一个”锯齿形”的近圆曲线,它的周长和面积受到影响并不大,但是曲率就会有很大影响。本质上是因为周长和面积是曲线的整体性质,而曲率则是曲线的局部性质。
问题 2
想要将连续情形转化为离散情形,我们需要先定义离散世界中的两种圆度。
设 S ⊂ Z 2 S \subset \mathbb{Z}^2 S ⊂ Z 2 为单连通像素区域,∂ S \partial S ∂ S 为其边界像素集。
将 ∂ S \partial S ∂ S 中的像素按逆时针排序得到有序边界点序列 { p 0 , p 1 , . . . , p n − 1 } \{p_0, p_1, ..., p_{n-1}\} { p 0 , p 1 , ... , p n − 1 } ,其中 p i = ( x i , y i ) ∈ Z 2 p_i = (x_i, y_i) \in \mathbb{Z}^2 p i = ( x i , y i ) ∈ Z 2 。
基本几何量定义
面积 A A A :
A = 1 2 ∣ ∑ i = 0 n − 1 ( x i y i + 1 − x i + 1 y i ) ∣ A = \frac{1}{2} | \sum_{i=0}^{n - 1} (x_i y_{i+1} - x_{i+1} y_i) | A = 2 1 ∣ i = 0 ∑ n − 1 ( x i y i + 1 − x i + 1 y i ) ∣
其中 ( x n , y n ) = ( x 0 , y 0 ) (x_{n}, y_{n}) = (x_0, y_0) ( x n , y n ) = ( x 0 , y 0 )
def _polygon_area (verts: List[Tuple[ int , int ]]) -> float :
"""多边形面积"""
s = 0
n = len (verts)
for i in range (n):
x1, y1 = verts[i]
x2, y2 = verts[(i + 1 ) % n]
s += x1 * y2 - x2 * y1 # verts 为逆时针点列,故为正
return abs (s) / 2.0
周长 P P P :
边界点间的欧氏距离之和:
P = ∑ i = 0 n − 1 ∥ p i + 1 − p i ∥ , p n = p 0 P = \sum_{i=0}^{n-1} \|p_{i+1} - p_i\|, \quad p_n = p_0 P = i = 0 ∑ n − 1 ∥ p i + 1 − p i ∥ , p n = p 0
def _exact_perimeter (verts: List[Tuple[ int , int ]]) -> float :
"""精确周长"""
per = 0.0
n = len (verts)
for i in range (n):
x1, y1 = verts[i]
x2, y2 = verts[(i + 1 ) % n]
per += math.hypot(x2 - x1, y2 - y1)
return per
质心 c = ( c x , c y ) c = (c_x, c_y) c = ( c x , c y ) :
c x = 1 6 A ∑ i = 0 n − 1 ( x i + x i + 1 ) ( x i y i + 1 − x i + 1 y i ) c y = 1 6 A ∑ i = 0 n − 1 ( y i + y i + 1 ) ( x i y i + 1 − x i + 1 y i ) \begin{aligned}
c_x &= \frac{1}{6A}\sum_{i=0}^{n-1} (x_i + x_{i+1})(x_i y_{i+1} - x_{i+1} y_i) \\
c_y &= \frac{1}{6A}\sum_{i=0}^{n-1} (y_i + y_{i+1})(x_i y_{i+1} - x_{i+1} y_i)
\end{aligned} c x c y = 6 A 1 i = 0 ∑ n − 1 ( x i + x i + 1 ) ( x i y i + 1 − x i + 1 y i ) = 6 A 1 i = 0 ∑ n − 1 ( y i + y i + 1 ) ( x i y i + 1 − x i + 1 y i )
其中 ( x n , y n ) = ( x 0 , y 0 ) (x_{n}, y_{n}) = (x_0, y_0) ( x n , y n ) = ( x 0 , y 0 )
def _polygon_centroid (verts: List[Tuple[ int , int ]]) -> Tuple[ float , float ]:
n = len (verts)
if n == 0 :
return ( 0 , 0 )
area = 0
cx = cy = 0
for i in range (n):
x0, y0 = verts[i]
x1, y1 = verts[(i + 1 ) % n]
cross = x0 * y1 - x1 * y0
area += cross
cx += (x0 + x1) * cross
cy += (y0 + y1) * cross
if area == 0 :
# 退化多边形,返回顶点平均值
xs = [v[ 0 ] for v in verts]
ys = [v[ 1 ] for v in verts]
return ( sum (xs) / n, sum (ys) / n)
area *= 0.5
cx /= ( 6 * area)
cy /= ( 6 * area)
return (cx, cy)
离散等周型圆度
为了消除局部锯齿效应对周长的影响,我们使用步长 k k k 采样:
ξ iso digital ( S , k ) : = P k 2 4 A k \xi_{\text{iso}}^{\text{digital}}(S, k) := \frac{P_k^2}{4A_k} ξ iso digital ( S , k ) := 4 A k P k 2
其中:
P k = 1 k ∑ j = 0 k − 1 ∑ i = 0 m j − 1 ∥ p i + 1 ( j ) − p i ( j ) ∥ P_k = \frac{1}{k}\sum_{j=0}^{k-1} \sum_{i=0}^{m_j-1} \|p_{i+1}^{(j)} - p_i^{(j)}\| P k = k 1 ∑ j = 0 k − 1 ∑ i = 0 m j − 1 ∥ p i + 1 ( j ) − p i ( j ) ∥ (多个起始位置平均)
A k = 1 k ∑ j = 0 k − 1 Area ( { p i ( j ) } ) A_k = \frac{1}{k}\sum_{j=0}^{k-1} \text{Area}(\{p_i^{(j)}\}) A k = k 1 ∑ j = 0 k − 1 Area ({ p i ( j ) }) (对应采样点的多边形面积)
{ p i ( j ) } \{p_i^{(j)}\} { p i ( j ) } 是从 p j p_j p j 开始每隔 k k k 个点采样的子序列
def isoperimetric_circularity (self) -> float :
"""
使用最优步长计算等周型圆度
"""
if self .optimal_stride is None :
self .find_optimal_stride()
if self .optimal_stride == 1 :
return ( self .perimeter ** 2 ) / ( 4.0 * self .area)
return self .optimal_xi
最优步长 :
k opt ( S ) = arg min k ≥ 1 ∣ ξ iso digital ( S , k ) − π ∣ k_{\text{opt}}(S) = \arg\min_{k \ge 1} |\xi_{\text{iso}}^{\text{digital}}(S, k) - \pi| k opt ( S ) = arg k ≥ 1 min ∣ ξ iso digital ( S , k ) − π ∣
在实际计算中测试得出最优步长用以计算圆度。
def find_optimal_stride (self, max_stride: int = None ) -> Tuple[ int , float ]:
"""
寻找最优步长:使圆度最接近π的步长
返回: (最优步长, 对应的圆度)
"""
verts = self .ordered
n = len (verts)
best_stride = 1
best_xi = ( self .perimeter ** 2 ) / ( 4.0 * self .area) # 初始圆度
best_error = abs (best_xi - math.pi)
# 测试不同步长
for stride in range ( 2 , max_stride + 1 ):
if n < stride + 2 :
continue
total_xi = 0.0
count = 0
# 多个起始位置取平均
for start in range (stride):
sampled = []
for i in range (start, n, stride):
sampled.append(verts[i])
if len (sampled) < 3 :
continue
# 计算采样多边形的周长和面积
per = 0.0
area = 0.0
m = len (sampled)
for i in range (m):
x1, y1 = sampled[i]
x2, y2 = sampled[(i + 1 ) % m]
per += math.hypot(x2 - x1, y2 - y1)
area += x1 * y2 - x2 * y1
area = abs (area) / 2.0
if area > 0 :
xi = (per * per) / ( 4.0 * area)
total_xi += xi
count += 1
if count > 0 :
avg_xi = total_xi / count
error = abs (avg_xi - math.pi)
if error < best_error:
best_error = error
best_xi = avg_xi
best_stride = stride
self .optimal_stride = best_stride
self .optimal_xi = best_xi
return best_stride, best_xi
离散曲率型圆度
ξ cur digital ( S ) : = π ⋅ P ⋅ ∑ i = 0 n − 1 d ( p i ) 2 ⋅ Δ s i ( ∑ i = 0 n − 1 d ( p i ) ⋅ Δ s i ) 2 \xi_{\text{cur}}^{\text{digital}}(S) :=
\pi \cdot \frac{P \cdot \displaystyle\sum_{i=0}^{n-1} d(p_i)^2 \cdot \Delta s_i}
{\left(\displaystyle\sum_{i=0}^{n-1} d(p_i) \cdot \Delta s_i\right)^2} ξ cur digital ( S ) := π ⋅ ( i = 0 ∑ n − 1 d ( p i ) ⋅ Δ s i ) 2 P ⋅ i = 0 ∑ n − 1 d ( p i ) 2 ⋅ Δ s i
其中:
d ( p i ) = ∥ p i − c ∥ d(p_i) = \|p_i - c\| d ( p i ) = ∥ p i − c ∥ :边界点到质心的距离
Δ s i = ∥ p i + 1 − p i ∥ \Delta s_i = \|p_{i+1} - p_i\| Δ s i = ∥ p i + 1 − p i ∥ :相邻边界点间的弧长微元
def curvature_circularity (self) -> float :
"""曲率型圆度"""
verts = self .ordered
n = len (verts)
if n < 3 :
return float ( 'inf' )
cx, cy = self .centroid
sum_rho_ds = 0.0
sum_rho2_ds = 0.0
for i in range (n):
x, y = verts[i]
rho = math.hypot(x - cx, y - cy)
x2, y2 = verts[(i + 1 ) % n]
ds = math.hypot(x2 - x, y2 - y)
sum_rho_ds += rho * ds
sum_rho2_ds += (rho * rho) * ds
if sum_rho_ds == 0 :
return float ( 'inf' )
return math.pi * self .perimeter * sum_rho2_ds / (sum_rho_ds ** 2 )
最小值
实际最小值应当是与像素网格边长有关的量。由于想不到精确的数学公式,故采用上述离散圆度定义进行数值计算,拟合最小值与误差函数曲线。完整代码见 GitHub 仓库 ,下面是运行结果:
图1:等周型圆度圆度计算结果
图2:曲率型圆度圆度计算结果
也即在 [ − R , R ] × [ − R , R ] [-R, R] \times [-R, R] [ − R , R ] × [ − R , R ] 的离散像素网格中,拟合得到的等周型圆度最小值:
ξ iso m i n = π + 0.671942 R 0.9968 \xi_{\text{iso}}^{min} = \pi + \frac{0.671942}{R^{0.9968}} ξ iso min = π + R 0.9968 0.671942
拟合得到的曲率型圆度最小值:
ξ cur m i n = π + 0.208273 R 1.9950 \xi_{\text{cur}}^{min} = \pi + \frac{0.208273}{R^{1.9950}} ξ cur min = π + R 1.9950 0.208273
最后的结果竟然是等周型圆度的误差符合 1 R \frac{1}{R} R 1 变化规律,曲率型圆度的误差符合 1 R 2 \frac{1}{R^2} R 2 1 变化规律,这其中是否有什么奥秘?还是留待以后探索吧。