<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Rigel&apos;s site</title><description>debug myself</description><link>https://astro-pure.js.org</link><item><title>角色动画与运动仿真-关键帧动画</title><link>https://astro-pure.js.org/blog/mocca-notes/03</link><guid isPermaLink="true">https://astro-pure.js.org/blog/mocca-notes/03</guid><description>角色动画与运动仿真笔记-03</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;插值&lt;/h2&gt;
&lt;p&gt;参考&lt;a href=&quot;../numerical-analysis-notes/03/&quot;&gt;数值分析-函数的多项式插值（下）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在这里有一些其他的补充：&lt;/p&gt;
&lt;h3&gt;Catmull-Rom Spline&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Catmull-Rom 样条&lt;/strong&gt;是一种常用的插值曲线，它通过一组控制点并确保在连接点处具有平滑的切线过渡（$C^1$ 连续性）。&lt;/p&gt;
&lt;p&gt;曲线 $S(t)$ 在区间内可以表示为一个三次多项式：&lt;/p&gt;
&lt;p&gt;$$
S(t) = at^3 + bt^2 + ct + d
$$&lt;/p&gt;
&lt;p&gt;利用 &lt;strong&gt;Hermite 插值基函数&lt;/strong&gt;，曲线可以表示为基函数向量与控制参数向量的乘积：&lt;/p&gt;
&lt;p&gt;$$
S(t) = \begin{bmatrix} 2t^3 - 3t^2 + 1 \ -2t^3 + 3t^2 \ t^3 - 2t^2 + t \ t^3 - t^2 \end{bmatrix}^T \begin{bmatrix} y_1 \ y_2 \ m_1 \ m_2 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$y_1, y_2$ 是曲线段的&lt;strong&gt;起点和终点&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;$m_1, m_2$ 是曲线在起点和终点的&lt;strong&gt;斜率（切矢量）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Catmull-Rom 样条的关键特点是：某一点的斜率是由其&lt;strong&gt;前一个点&lt;/strong&gt;和&lt;strong&gt;后一个点&lt;/strong&gt;确定的。&lt;/p&gt;
&lt;p&gt;根据图中定义，对于由 $P_0, P_1, P_2, P_3$ 四个控制点定义的中间段（$P_1$ 到 $P_2$）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;端点赋值：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$y_1 = p_1$&lt;/li&gt;
&lt;li&gt;$y_2 = p_2$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;斜率（切线）计算：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$m_1 = \frac{1}{2} \frac{p_2 - p_0}{x_2 - x_0}$&lt;/li&gt;
&lt;li&gt;$m_2 = \frac{1}{2} \frac{p_3 - p_1}{x_3 - x_1}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fcatmull-rom.C8E_H3rn.png&amp;#x26;w=1044&amp;#x26;h=584&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;旋转的插值&lt;/h3&gt;
&lt;p&gt;回顾&lt;a href=&quot;./01#%E7%90%83%E9%9D%A2%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC&quot;&gt;球面线性插值 (SLERP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一些插值方法简介：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catmull-Rom Euler（欧拉角插值）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先将四元数转换为&lt;strong&gt;欧拉角&lt;/strong&gt;（如 $Pitch, Yaw, Roll$），然后在欧拉角空间进行 Catmull-Rom 样条插值，最后转回四元数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catmull-Rom Axis-Angle（轴角插值）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将旋转表示为&lt;strong&gt;旋转轴和旋转角度&lt;/strong&gt;（Axis-Angle），在这一空间进行插值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Piecewise Slerp（分段球面线性插值）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在每两个关键帧之间直接进行 &lt;strong&gt;Slerp（Spherical Linear Interpolation）&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TCB Interp（TCB 样条插值 / Kochanek-Bartels Spline）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在四元数空间（通常是单位球面上）引入 &lt;strong&gt;Tension（张力）、Continuity（连续性）和 Bias（偏移）&lt;/strong&gt; 三个参数来控制切线。&lt;/p&gt;
&lt;h3&gt;双线性插值&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;计算过程&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;水平方向&lt;/strong&gt;：在两对端点间插值，求出中间值 $m_2$ 和 $m_4$。
&lt;ul&gt;
&lt;li&gt;$m_2 = (1-s)p_{11} + sp_{21}$&lt;/li&gt;
&lt;li&gt;$m_4 = (1-s)p_{12} + sp_{22}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;垂直方向&lt;/strong&gt;：在 $m_2$ 和 $m_4$ 之间进行最后的混合。
&lt;ul&gt;
&lt;li&gt;$x = (1-t)m_2 + tm_4$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;双三次插值&lt;/h3&gt;
&lt;p&gt;不仅考虑目标点周围的 4 个点，而是扩展到 &lt;strong&gt;16 个 (4x4)&lt;/strong&gt; 邻近像素点。&lt;/p&gt;
&lt;p&gt;在两个方向上均使用三次多项式（Cubic Polynomial）进行拟合。&lt;/p&gt;
&lt;h3&gt;2D 三角形插值&lt;/h3&gt;
&lt;p&gt;对于三角形 $ABC$ 内的点 $P$，其位置由三个顶点的加权平均决定：&lt;/p&gt;
&lt;p&gt;$$
P = w_a A + w_b B + w_c C
$$&lt;/p&gt;
&lt;p&gt;其中权重（重心坐标）满足 $w_a + w_b + w_c = 1$。&lt;/p&gt;
&lt;p&gt;权重计算（面积比法）：每个顶点的权重等于其对边三角形与总面积的比值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$w_a = \frac{\Delta PBC}{\Delta ABC}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$w_b = \frac{\Delta PCA}{\Delta ABC}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$w_c = \frac{\Delta PAB}{\Delta ABC}$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3D 四面体插值&lt;/h3&gt;
&lt;p&gt;对于空间中的四面体 $ABCD$ 内的点 $P$，原理同理扩展：&lt;/p&gt;
&lt;p&gt;$$
P = w_a A + w_b B + w_c C + w_d D
$$&lt;/p&gt;
&lt;p&gt;权重计算（体积比法）：每个顶点的权重等于该点与相对面构成的子四面体体积与总面积之比。&lt;/p&gt;
&lt;h3&gt;离散数据插值&lt;/h3&gt;
&lt;p&gt;离散数据插值旨在通过一组不规则分布的数据点，构建一个连续的函数表面。常见的方法包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;线性插值 (Linear)&lt;/strong&gt;：包括最小二乘法 (Least squares)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样条插值 (Splines)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反距离权重法 (Inverse distance weighting)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高斯过程 (Gaussian process)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;径向基函数 (Radial Basis Function, RBF)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;径向基函数插值&lt;/h3&gt;
&lt;p&gt;RBF 插值的基本思想是将插值函数 $y$ 表示为一组基函数的加权线性组合：&lt;/p&gt;
&lt;p&gt;$$
y = \sum_{i=1}^{K} w_i \varphi(| \mathbf{x} - \mathbf{x}_i |)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mathbf{x}$：待求点的坐标。&lt;/li&gt;
&lt;li&gt;$\mathbf{x}_i$：已知数据点（中心点）的坐标。&lt;/li&gt;
&lt;li&gt;$| \mathbf{x} - \mathbf{x}_i |$：待求点到已知点之间的欧几里得距离。&lt;/li&gt;
&lt;li&gt;$\varphi$：径向基函数（只依赖于距离的函数）。&lt;/li&gt;
&lt;li&gt;$w_i$：对应基函数的权重。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了确定权重，我们需要满足插值条件，即在已知点 $\mathbf{x}_i$ 处的函数值必须等于观测值 $y_i$（即 $f(\mathbf{x}_i) = y_i$）。这可以转化为一个线性方程组：&lt;/p&gt;
&lt;h1&gt;$$
\begin{bmatrix}
R_{1,1} &amp;#x26; R_{1,2} &amp;#x26; \cdots &amp;#x26; R_{1,K} \
R_{2,1} &amp;#x26; R_{2,2} &amp;#x26; \cdots &amp;#x26; R_{2,K} \
\vdots &amp;#x26; \vdots &amp;#x26; \ddots &amp;#x26; \vdots \
R_{K,1} &amp;#x26; \cdots &amp;#x26; \cdots &amp;#x26; R_{K,K}
\end{bmatrix}
\begin{bmatrix}
w_1 \
w_2 \
\vdots \
w_K
\end{bmatrix}&lt;/h1&gt;
&lt;p&gt;\begin{bmatrix}
y_1 \
y_2 \
\vdots \
y_K
\end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;其中，矩阵元素定义为：&lt;/p&gt;
&lt;p&gt;$$
R_{i,j} = \varphi(| \mathbf{x}_i - \mathbf{x}_j |)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常见的径向基函数 $\varphi(r)$ 类型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设 $r$ 是点与点之间的距离 $| \mathbf{x} - \mathbf{x}_i |$：&lt;/p&gt;
&lt;p&gt;| 类型 | 数学表达式 $\varphi(r)$ |
| :--- | :--- |
| &lt;strong&gt;Gaussian (高斯)&lt;/strong&gt; | $e^{-(r/c)^2}$ |
| &lt;strong&gt;Inverse multiquadric (反多二次项)&lt;/strong&gt; | $\frac{1}{\sqrt{r^2 + c^2}}$ |
| &lt;strong&gt;Thin plate spline (薄板样条)&lt;/strong&gt; | $r^2 \log r$ |
| &lt;strong&gt;Polyharmonic splines (多谐样条)&lt;/strong&gt; | $\begin{cases} r^k, &amp;#x26; k=2n+1 \ r^k \log r, &amp;#x26; k=2n \end{cases}$ |&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>数值分析-函数的多项式插值（上）</title><link>https://astro-pure.js.org/blog/numerical-analysis-notes/02</link><guid isPermaLink="true">https://astro-pure.js.org/blog/numerical-analysis-notes/02</guid><description>数值分析笔记-02</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;拉格朗日插值多项式&lt;/h2&gt;
&lt;h3&gt;概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$n$ 次插值基函数&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
l_k(x) = \frac{(x-x_0)...(x-x_{k-1})(x-x_{k+1})...(x-x_n)}{(x_k-x_0)...(x_k-x_{k-1})(x_k-x_{k+1})...(x_k-x_n)}
$$&lt;/p&gt;
&lt;p&gt;$$
= \prod_{j=0, j \neq k}^{n} \frac{x-x_j}{x_k-x_j} \quad (k=0, 1, ..., n)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;插值多项式 $L_n(x)$&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
L_n(x) = \sum_{k=0}^{n} y_k l_k(x)
$$&lt;/p&gt;
&lt;p&gt;形如上式的插值多项式 $L_n(x)$ 称为 &lt;strong&gt;拉格朗日插值多项式&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;备注：&lt;/strong&gt; 通常情况下次数为 $n$，但是特殊情形次数可以小于 $n$。&lt;/p&gt;
&lt;h3&gt;拉格朗日插值余项&lt;/h3&gt;
&lt;p&gt;设 $f(x)$ 在 $[a, b]$ 上有 $n+1$ 阶导数，节点 $a \leqslant x_0 &amp;#x3C; x_1 &amp;#x3C; \dots &amp;#x3C; x_n \leqslant b$，$L_n(x)$ 是满足条件 $L_n(x_i) = f(x_i), i = 0, 1, \dots, n$ 的插值多项式。&lt;/p&gt;
&lt;p&gt;则对于任何 $x \in [a, b]$，存在 $\xi \in (a, b)$，有&lt;strong&gt;插值余项&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$R_n(x) = f(x) - L_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} \omega_{n+1}(x)$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\xi$ 依赖于 $x$。&lt;/li&gt;
&lt;li&gt;$\omega_{n+1}(x) = (x - x_0)(x - x_1)\dots(x - x_n)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误差估计（上界）&lt;/strong&gt;：
若记 $\max_{a \leqslant x \leqslant b} |f^{(n+1)}(x)| = M_{n+1}$，则有：
$$
|R_n(x)| \leqslant \frac{M_{n+1}}{(n+1)!} |\omega_{n+1}(x)|
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;拉格朗日插值基函数的性质&lt;/h3&gt;
&lt;p&gt;若节点满足 $a \leqslant x_0 &amp;#x3C; x_1 &amp;#x3C; \dots &amp;#x3C; x_n \leqslant b$，且次数 $i \leqslant n$，则有：
$$
\sum_{k=0}^{n} x_k^i l_k(x) = x^i, \quad k = 0, 1, \dots, n
$$
特别地，当 $i=0$ 时：
$$
\sum_{k=0}^{n} l_k(x) = 1
$$&lt;/p&gt;
&lt;h3&gt;误差估计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;核心问题：&lt;strong&gt;函数的高阶导数未知，如何估计截断误差？&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构造思路&lt;/p&gt;
&lt;p&gt;假设插值条件中包含 $n + 2$ 个数据节点：$f(x_i)=y_i, \quad i=0, 1, \dots, n, n+1$。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;利用前 $n+1$ 个数据&lt;/strong&gt;：构造一个 $n$ 次 Lagrange 插值多项式 $L_n(x)$。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;利用后 $n+1$ 个数据&lt;/strong&gt;：构造一个 $n$ 次 Lagrange 插值多项式 $L^*_n(x)$。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各自的插值余项分别为：&lt;/p&gt;
&lt;p&gt;$$
f(x) - L_n(x) = \frac{1}{(n+1)!} f^{(n+1)}(\xi) (x - x_0)(x - x_1) \cdots (x - x_n)
$$&lt;/p&gt;
&lt;p&gt;$$
f(x) - L^&lt;em&gt;_n(x) = \frac{1}{(n+1)!} f^{(n+1)}(\xi^&lt;/em&gt;) (x - x_1)(x - x_2) \cdots (x - x_{n+1})
$$&lt;/p&gt;
&lt;p&gt;若假设在高阶导数连续且节点较近时，$f^{(n+1)}(\xi) \approx f^{(n+1)}(\xi^*)$，则将上述两式相减可得：&lt;/p&gt;
&lt;p&gt;$$
L^*&lt;em&gt;n(x) - L_n(x) \approx \frac{1}{(n+1)!} f^{(n+1)}(\xi) (x - x_1) \cdots (x - x_n) (x&lt;/em&gt;{n+1} - x_0)
$$&lt;/p&gt;
&lt;p&gt;由此可以解出包含高阶导数的项：
$$
\frac{1}{(n+1)!} f^{(n+1)}(\xi) (x - x_1) \cdots (x - x_n) \approx \frac{L^*&lt;em&gt;n(x) - L_n(x)}{x&lt;/em&gt;{n+1} - x_0}
$$&lt;/p&gt;
&lt;p&gt;因此，我们得到了不需要高阶导数的余项估计式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对于 $L_n(x)$ 的余项估计：&lt;/strong&gt;
$$
R_n(x) = f(x) - L_n(x) \approx \frac{L_n(x) - L^*&lt;em&gt;n(x)}{x_0 - x&lt;/em&gt;{n+1}} (x - x_0)
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于 $L^*_n(x)$ 的余项估计：&lt;/strong&gt;
$$
R^&lt;em&gt;_n(x) = f(x) - L^&lt;/em&gt;&lt;em&gt;n(x) \approx \frac{L^*&lt;em&gt;n(x) - L_n(x)}{x&lt;/em&gt;{n+1} - x_0} (x - x&lt;/em&gt;{n+1})
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Aitken 逐次线性插值法&lt;/h3&gt;
&lt;p&gt;对于未知函数或复杂函数 $f(x)$，假设已知信息：
$f(x_i) = y_i, \quad i = 0, 1, \dots, n$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：计算 $f(x)$ 在任何一点 $x$ 处的近似值，且近似误差不超过上限 $\varepsilon_0$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;步骤 1：构造初始线性插值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;记 $I_i(x) = y_i, \quad i = 0, 1, \dots, n$。&lt;/p&gt;
&lt;p&gt;利用节点 $x_0, x_1$ 构造线性插值多项式 $I_{0,1}(x)$。&lt;/p&gt;
&lt;p&gt;利用节点 $x_0, x_2$ 构造另一个线性插值多项式 $I_{0,2}(x)$：&lt;/p&gt;
&lt;p&gt;$$
I_{0,2} = I_{0,2}(x) = f_0 + \frac{f_2 - f_0}{x_2 - x_0}(x - x_0) = I_0 + \frac{I_2 - I_0}{x_2 - x_0}(x - x_0)
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;步骤 2：估计误差与判定&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;估计 $I_{0,1}(x)$ 的误差：&lt;/p&gt;
&lt;p&gt;$$
R_{0,1,2}(x) = \frac{I_{0,1} - I_{0,2}}{x_1 - x_2}(x - x_1)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;若 $|R_{0,1,2}(x)| &amp;#x3C; \varepsilon_0$&lt;/strong&gt;：算法终止。&lt;/p&gt;
&lt;p&gt;记 $f(x) \approx I_{0,1,2} = I_{0,1} + R_{0,1,2}(x)$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;否则&lt;/strong&gt;：继续执行步骤 3。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;步骤 3：进一步迭代&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;利用节点 $x_0, x_3$ 构造线性插值多项式 $I_{0,3}(x)$。&lt;/p&gt;
&lt;p&gt;估计 $I_{0,1}(x)$ 的误差 $R_{0,1,3}(x)$ 并计算 $I_{0,1,3} = I_{0,1} + R_{0,1,3}(x)$。&lt;/p&gt;
&lt;p&gt;估计 $I_{0,1,2}(x)$ 的误差，计算 $I_{0,1,2,3}(x)$。&lt;/p&gt;
&lt;p&gt;类似地进行后续迭代&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Neville 逐次线性插值法&lt;/h3&gt;
&lt;p&gt;已知节点 $a \leqslant x_0 &amp;#x3C; x_1 &amp;#x3C; \dots &amp;#x3C; x_n \leqslant b$ 和相应的函数值 $f(x_i), i=0, 1, \dots, n$，则 $k$ 次插值多项式有递推公式：
$$
\begin{cases}
P_j(x) = f(x_j) &amp;#x26; j=0, 1, \dots, k \
P_{0, 1, \dots, k}(x) = \frac{(x - x_0)P_{1, 2, \dots, k}(x) - (x - x_k)P_{0, 1, \dots, k-1}(x)}{x_k - x_0} &amp;#x26; k=0, 1, \dots
\end{cases}
$$
上述公式可以化简为：
$$
\begin{cases}
P_j(x) = f(x_j) &amp;#x26; j=0, 1, \dots, k \
P_{0, 1, \dots, k}(x) = P_{0, 1, \dots, k-1}(x) + \frac{P_{1, 2, \dots, k}(x) - P_{0, 1, \dots, k-1}(x)}{x_k - x_0}(x - x_0) &amp;#x26; k=0, 1, \dots
\end{cases}
$$&lt;/p&gt;
&lt;h2&gt;牛顿插值多项式&lt;/h2&gt;
&lt;h3&gt;均差及性质&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一阶均差&lt;/strong&gt;：$f[x_0, x_k] = \frac{f(x_k) - f(x_0)}{x_k - x_0}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;二阶均差&lt;/strong&gt;：$f[x_0, x_1, x_k] = \frac{f[x_1, x_k] - f[x_0, x_1]}{x_k - x_0}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k 阶均差&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
f[x_0, x_1, \dots, x_k] = \frac{f[x_1, \dots, x_k] - f[x_0, \dots, x_{k-1}]}{x_k - x_0}
$$&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(均差也称为差商)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;线性组合表示&lt;/strong&gt;：$k$ 阶均差可以表示为函数值 $f(x_0), \dots, f(x_k)$ 的线性组合：
$$
f[x_0, x_1, \dots, x_k] = \sum_{j=0}^{k} \frac{f(x_j)}{(x_j - x_0) \dots (x_j - x_{j-1})(x_j - x_{j+1}) \dots (x_j - x_k)}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对称性&lt;/strong&gt;：均差的值与节点的排列顺序无关。例如：$f[x_0, x_1] = f[x_1, x_0]$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;与导数的关系&lt;/strong&gt;：若 $f(x)$ 在 $[a, b]$ 上存在 $n$ 阶导数，则：&lt;/p&gt;
&lt;p&gt;$$
f[x_0, x_1, \dots, x_n] = \frac{f^{(n)}(\xi)}{n!}, \quad \xi \in (a, b)
$$&lt;/p&gt;
&lt;h3&gt;牛顿插值公式与余项&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;牛顿插值多项式 $N_n(x)$：&lt;/strong&gt;
$$
N_n(x) = f(x_0) + f[x_0, x_1](x - x_0) + f[x_0, x_1, x_2](x - x_0)(x - x_1) + \dots + f[x_0, \dots, x_n]\omega_n(x)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;牛顿插值余项 $R_n(x)$：&lt;/strong&gt;
$$
R_n(x) = f(x) - N_n(x) = f[x, x_0, x_1, \dots, x_n]\omega_{n+1}(x)
$$
其中 $\omega_{n+1}(x) = (x - x_0)(x - x_1)\dots(x - x_n)$。&lt;/p&gt;
&lt;h3&gt;Lagrange 插值与牛顿型插值的比较&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）等价性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;两者都是 $n$ 次插值多项式，且均满足插值条件：
$$
L_n(x_i) = f(x_i), \quad N_n(x_i) = f(x_i) \quad (i=0, 1, \dots, n)
$$
基于多项式的唯一性可知，$L_n(x) \equiv N_n(x)$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（2）误差一致性&lt;/strong&gt;
它们的插值余项公式完全相同：
$$
R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} \omega_{n+1}(x)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（3）承继性&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lagrange 插值&lt;/strong&gt;：当多项式次数从 $n-1$ 次增加到 $n$ 次时，&lt;strong&gt;必须重新计算所有&lt;/strong&gt;的基本插值基函数 $l_k(x)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Newton 插值&lt;/strong&gt;：具有良好的承继性。只需在原有的均差表基础上再计算一个 &lt;strong&gt;$n$ 阶均差&lt;/strong&gt;，然后在末尾加上新的一项即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;差分&lt;/h2&gt;
&lt;h3&gt;定义&lt;/h3&gt;
&lt;p&gt;设节点为&lt;strong&gt;等距节点&lt;/strong&gt;，即步长 $h$ 为常数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x_k = x_0 + kh, \quad (k=0, 1, \dots, n)$&lt;/li&gt;
&lt;li&gt;$f(x_k) = f_k$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;一阶差分&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向前差分&lt;/strong&gt;：$\Delta f_k = f_{k+1} - f_k$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向后差分&lt;/strong&gt;：$\nabla f_k = f_k - f_{k-1}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中心差分&lt;/strong&gt;：$\delta f_k = f_{k+1/2} - f_{k-1/2}$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;高阶差分&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;二阶向前差分&lt;/strong&gt;：$\Delta^2 f_k = \Delta f_{k+1} - \Delta f_k = f_{k+2} - 2f_{k+1} + f_k$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$m$ 阶向前差分&lt;/strong&gt;：$\Delta^m f_k = \Delta(\Delta^{m-1} f_k) = \Delta^{m-1} f_{k+1} - \Delta^{m-1} f_k$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;性质&lt;/h3&gt;
&lt;p&gt;在等距插值的情况下，均差可以简化为差分与步长 $h$ 的组合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向前形式&lt;/strong&gt;：
$$
f[x_0, x_1, \dots, x_k] = \frac{\Delta^k f_0}{k! h^k}
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向后形式&lt;/strong&gt;：
$$
f[x_k, x_{k-1}, \dots, x_{k-m}] = \frac{\nabla^m f_k}{m! h^m}
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要换算关系&lt;/strong&gt;：
$$
\nabla^m f_{k+m} = \Delta^m f_k
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;均差、差分与导数的关系&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;均差与导数&lt;/strong&gt;：$f[x_0, x_1, \dots, x_k] = \frac{f^{(k)}(\xi)}{k!}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;差分与均差&lt;/strong&gt;：$f[x_0, x_1, \dots, x_k] = \frac{\Delta^k f_0}{k! h^k}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;差分与导数&lt;/strong&gt;：
$$
\Delta^k f_0 = h^k f^{(k)}(\xi)
$$&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Newton 向前与向后插值公式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newton 向前差分插值公式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：适合于计算函数表&lt;strong&gt;表头附近&lt;/strong&gt;（靠近 $x_0$）的函数值。&lt;/p&gt;
&lt;p&gt;引入变换 $t = \frac{x - x_0}{h}$，公式为：
$$
N_n(x) = f_0 + t \Delta f_0 + \frac{t(t-1)}{2!} \Delta^2 f_0 + \dots + \frac{t(t-1)\dots(t-n+1)}{n!} \Delta^n f_0
$$
&lt;strong&gt;简化形式&lt;/strong&gt;：
$$
N_n(x) = \sum_{k=0}^{n} \binom{t}{k} \Delta^k f_0
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插值余项&lt;/strong&gt;：
$$
R_n(x) = \frac{t(t-1)\dots(t-n)}{(n+1)!} h^{n+1} f^{(n+1)}(\xi), \quad \xi \in (x_0, x_n)
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newton 向后差分插值公式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：适合于计算函数表&lt;strong&gt;表尾附近&lt;/strong&gt;（靠近 $x_n$）的函数值。&lt;/p&gt;
&lt;p&gt;引入变换 $t = \frac{x - x_n}{h}$（注意此处 $t$ 通常为负数），公式为：
$$
N_n(x) = f_N + t \nabla f_N + \frac{t(t+1)}{2!} \nabla^2 f_N + \dots + \frac{t(t+1)\dots(t+n-1)}{n!} \nabla^n f_N
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;简化形式&lt;/strong&gt;：
记 $\binom{-t}{k} = \frac{-t(-t-1)\dots(-t-k+1)}{k!} = (-1)^k \frac{t(t+1)\dots(t+k-1)}{k!}$，则：
$$
N_n(x) = \sum_{k=0}^{n} (-1)^k \binom{-t}{k} \nabla^k f_N
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插值余项&lt;/strong&gt;：
$$
R_n(x) = \frac{t(t+1)\dots(t+n)}{(n+1)!} h^{n+1} f^{(n+1)}(\xi), \quad \xi \in (x_{n-n}, x_n)
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;重节点均差与泰勒插值&lt;/h3&gt;
&lt;p&gt;设 $f \in C^n[a,b]$，则 $f[x_0, x_1, \dots, x_n]$ 是其变量的连续函数。&lt;/p&gt;
&lt;p&gt;当节点趋于重合时，利用极限可以定义&lt;strong&gt;重节点均差&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一阶重节点均差&lt;/strong&gt;：
$$
f[x_0, x_0] = \lim_{x \to x_0} f[x_0, x] = \lim_{x \to x_0} \frac{f(x) - f(x_0)}{x - x_0} = f&apos;(x_0)
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二阶重节点均差&lt;/strong&gt;：
$$
f[x_0, x_0, x_0] = \lim_{\substack{x_1 \to x_0 \ x_2 \to x_0}} f[x_0, x_1, x_2] = \frac{1}{2!} f&apos;&apos;(x_0)
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$n$ 阶重节点均差（一般项）&lt;/strong&gt;：
$$
f[\underbrace{x_0, x_0, \dots, x_0}_{n+1个}] = \frac{f^{(n)}(x_0)}{n!}
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在牛顿插值多项式 $N_n(x)$ 中，令所有节点 $x_i \to x_0 \ (i=1, 2, \dots, n)$，则公式变为：&lt;/p&gt;
&lt;p&gt;$$P_n(x) = f(x_0) + f&apos;(x_0)(x - x_0) + \frac{f&apos;&apos;(x_0)}{2!}(x - x_0)^2 + \dots + \frac{f^{(n)}(x_0)}{n!}(x - x_0)^n$$&lt;/p&gt;
&lt;p&gt;这实际上就是在点 $x_0$ 附近逼近 $f(x)$ 的一个&lt;strong&gt;带导数的插值多项式&lt;/strong&gt;（即泰勒多项式），它满足：
$$P_n^{(k)}(x_0) = f^{(k)}(x_0), \quad k=0, 1, \dots, n$$&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>数值分析-函数的多项式插值（下）</title><link>https://astro-pure.js.org/blog/numerical-analysis-notes/03</link><guid isPermaLink="true">https://astro-pure.js.org/blog/numerical-analysis-notes/03</guid><description>数值分析笔记-03</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Hermite 插值多项式&lt;/h2&gt;
&lt;h3&gt;三次 Hermite 插值&lt;/h3&gt;
&lt;p&gt;给定两个节点 $x_0, x_1$，我们需要构造一个三次多项式 $H_3(x)$，使其满足以下 4 个条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数值条件&lt;/strong&gt;：$H_3(x_0) = y_0, \quad H_3(x_1) = y_1$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导数值条件&lt;/strong&gt;：$H_3&apos;(x_0) = m_0, \quad H_3&apos;(x_1) = m_1$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了表达 $H_3(x)$，我们构造四种基函数 $\alpha_0(x), \alpha_1(x), \beta_0(x), \beta_1(x)$，它们的取值特性如下表：&lt;/p&gt;
&lt;p&gt;| 基函数 | $x_0$ 处的函数值 | $x_1$ 处的函数值 | $x_0$ 处的导数值 | $x_1$ 处的导数值 |
| :--- | :---: | :---: | :---: | :---: |
| $\alpha_0(x)$ | &lt;strong&gt;1&lt;/strong&gt; | 0 | 0 | 0 |
| $\alpha_1(x)$ | 0 | &lt;strong&gt;1&lt;/strong&gt; | 0 | 0 |
| $\beta_0(x)$ | 0 | 0 | &lt;strong&gt;1&lt;/strong&gt; | 0 |
| $\beta_1(x)$ | 0 | 0 | 0 | &lt;strong&gt;1&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终结构&lt;/strong&gt;：
$$H_3(x) = y_0 \alpha_0(x) + y_1 \alpha_1(x) + m_0 \beta_0(x) + m_1 \beta_1(x)$$&lt;/p&gt;
&lt;p&gt;构造：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数值基函数&lt;/strong&gt;：
$$
\alpha_0(x) = \left( 1 + \frac{2(x - x_0)}{x_1 - x_0} \right) \left[ \frac{x - x_1}{x_0 - x_1} \right]^2
$$
$$
\alpha_1(x) = \left( 1 + \frac{2(x - x_1)}{x_0 - x_1} \right) \left[ \frac{x - x_0}{x_1 - x_0} \right]^2
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导数值基函数&lt;/strong&gt;：
$$
\beta_0(x) = (x - x_0) \left[ \frac{x - x_1}{x_0 - x_1} \right]^2
$$
$$
\beta_1(x) = (x - x_1) \left[ \frac{x - x_0}{x_1 - x_0} \right]^2
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当 $f(x) \in C^4[a, b]$ 时，三次 Hermite 插值的阶段误差为：&lt;/p&gt;
&lt;p&gt;$$
R(x) = f(x) - H_3(x) = \frac{f^{(4)}(\xi)}{4!} (x - x_0)^2 (x - x_1)^2, \quad \xi \in (a, b)
$$&lt;/p&gt;
&lt;h3&gt;一般形式的 Hermite 插值&lt;/h3&gt;
&lt;p&gt;给定 $n+1$ 个相异节点 $x_0, x_1, \dots, x_n$，构造一个 $2n+1$ 次多项式 $H_{2n+1}(x)$，使其满足：
$$H_{2n+1}(x_i) = f(x_i), \quad H&apos;_{2n+1}(x_i) = f&apos;(x_i) \quad (i=0, 1, \dots, n)$$&lt;/p&gt;
&lt;p&gt;公式结构为：
$$H_{2n+1}(x) = \sum_{i=0}^{n} [a_i(x) f(x_i) + \beta_i(x) f&apos;(x_i)]$$&lt;/p&gt;
&lt;p&gt;利用 &lt;strong&gt;Lagrange 插值基函数 $l_i(x)$&lt;/strong&gt; 及其导数 $l&apos;_i(x_i)$ 进行构造。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;函数值基函数 $\alpha_i(x)$&lt;/strong&gt;
设 $\alpha_i(x) = (ax + b)l_i^2(x)$，通过满足条件 $\alpha_i(x_i)=1$ 和 $\alpha&apos;_i(x_i)=0$，求得系数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表达式&lt;/strong&gt;：$\alpha_i(x) = [1 - 2l&apos;_i(x_i)(x - x_i)]l_i^2(x)$&lt;/li&gt;
&lt;li&gt;其中 $l&apos;&lt;em&gt;i(x_i) = \sum&lt;/em&gt;{j=0, j \neq i}^{n} \frac{1}{x_i - x_j}$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;导数值基函数 $\beta_i(x)$&lt;/strong&gt;
设 $\beta_i(x) = C(x - x_i)l_i^2(x)$，通过满足条件 $\beta&apos;_i(x_i)=1$，求得 $C=1$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表达式&lt;/strong&gt;：$\beta_i(x) = (x - x_i)l_i^2(x)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设 $f(x) \in C^{(2n+2)}[a, b]$，则对于任意 $x \in [a, b]$，存在 $\xi \in (a, b)$ 使得插值余项为：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
R_{2n+1}(x) &amp;#x26;= f(x) - H_{2n+1}(x) \
&amp;#x26;= \frac{f^{(2n+2)}(\xi)}{(2n+2)!} (x - x_0)^2 (x - x_1)^2 \dots (x - x_n)^2 \
&amp;#x26;= \frac{f^{(2n+2)}(\xi)}{(2n+2)!} \omega_{n+1}^2(x)
\end{aligned}
$$&lt;/p&gt;
&lt;h2&gt;分段低次插值&lt;/h2&gt;
&lt;h3&gt;龙格现象&lt;/h3&gt;
&lt;p&gt;考察函数 $f(x) = \frac{1}{1+x^2}$ 在区间 $[-5, 5]$ 上的插值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;现象描述&lt;/strong&gt;：随着插值节点数 $n$ 的增大（多项式次数升高），插值多项式 $L_n(x)$ 仅在区间中心附近收敛。在&lt;strong&gt;端点附近&lt;/strong&gt;，多项式会出现剧烈的抖动（摆动），误差反而迅速增大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;本质&lt;/strong&gt;：高次多项式对局部数据的变化过于敏感，容易在边缘产生不稳定的震荡。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Frunge.DiZKoazL.png&amp;#x26;w=1230&amp;#x26;h=782&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;除了龙格现象外，高次插值还存在以下问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;计算量大&lt;/strong&gt;：插值次数越高，公式越复杂，计算工作量呈指数级增长。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误差积累&lt;/strong&gt;：高次多项式的每一项系数计算都涉及多次乘除，舍入误差容易堆积。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;分段线性插值&lt;/h3&gt;
&lt;p&gt;给定区间 $[a, b]$ 上的节点 $a = x_0 &amp;#x3C; x_1 &amp;#x3C; \dots &amp;#x3C; x_n = b$ 及其函数值 $f(x_i) = y_i$。
&lt;strong&gt;分段线性插值函数 $I_h(x)$&lt;/strong&gt; 满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$I_h(x) \in C[a, b]$（在整个区间上连续）。&lt;/li&gt;
&lt;li&gt;在每个小区间 $[x_i, x_{i+1}]$ 上，$I_h(x)$ 是一个线性多项式（一次函数）。&lt;/li&gt;
&lt;li&gt;满足插值条件：$I_h(x_i) = y_i \quad (i=0, 1, \dots, n)$。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在每个局部区间 $[x_i, x_{i+1}]$ 上，利用 Lagrange 一次插值公式：
$$
I_h(x) = \frac{x - x_{i+1}}{x_i - x_{i+1}} y_i + \frac{x - x_i}{x_{i+1} - x_i} y_{i+1}, \quad x \in [x_i, x_{i+1}]
$$&lt;/p&gt;
&lt;p&gt;设 $f \in C^2[a, b]$，$I_h(x)$ 为 $f(x)$ 的分段线性插值多项式，则对于 $x \in [x_i, x_{i+1}]$，其误差为：
$$
|f(x) - I_h(x)| \leqslant \frac{M_2}{8} (x_{i+1} - x_i)^2
$$
其中 $M_2 = \max_{a \leqslant x \leqslant b} |f&apos;&apos;(x)|$。&lt;/p&gt;
&lt;p&gt;若记最大步长 $h = \max_i (x_{i+1} - x_i)$，则全区间上的误差界为：
$$
|f - I_h|&lt;em&gt;\infty = \max&lt;/em&gt;{a \leqslant x \leqslant b} |f(x) - I_h(x)| \leqslant \frac{M_2}{8} h^2
$$&lt;/p&gt;
&lt;h3&gt;分段三次 Hermite 插值&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;添加一阶导数插值条件&lt;/strong&gt;，用来克服分段线性插值在节点处不可导（有尖角）的问题。&lt;/p&gt;
&lt;p&gt;已知节点 $x_0, x_1, \dots, x_n$ 及其对应的&lt;strong&gt;函数值&lt;/strong&gt; $y_k$ 和&lt;strong&gt;导数值&lt;/strong&gt; $m_k$。
若函数 $I_h(x)$ 满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一阶连续&lt;/strong&gt;：$I_h(x) \in C^1[a, b]$（不仅曲线连续，切线也连续）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完全匹配&lt;/strong&gt;：$I_h(x_k) = f_k, \quad I&apos;_h(x_k) = m_k$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分段三次&lt;/strong&gt;：在每个小区间 $[x_k, x_{k+1}]$ 上，$I_h(x)$ 是一个三次多项式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在单个区间 $[x_k, x_{k+1}]$ 上，利用局部基函数构造：
$$
I_h(x) = y_k \alpha_k(x) + y_{k+1} \alpha_{k+1}(x) + m_k \beta_k(x) + m_{k+1} \beta_{k+1}(x)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数值基函数&lt;/strong&gt;
$$
\alpha_k(x) = \left( 1 + 2\frac{x - x_k}{x_{k+1} - x_k} \right) \left( \frac{x - x_{k+1}}{x_k - x_{k+1}} \right)^2
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\alpha_{k+1}(x) = \left( 1 + 2\frac{x_{k+1} - x}{x_{k+1} - x_k} \right) \left( \frac{x - x_k}{x_{k+1} - x_k} \right)^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;导数值基函数&lt;/strong&gt;
$$
\beta_k(x) = (x - x_k) \left( \frac{x - x_{k+1}}{x_k - x_{k+1}} \right)^2
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\beta_{k+1}(x) = (x - x_{k+1}) \left( \frac{x - x_k}{x_{k+1} - x_k} \right)^2
$$&lt;/p&gt;
&lt;p&gt;与分段线性插值类似，全区间上的函数可以表示为：
$$
I_h(x) = \sum_{i=0}^{n} [f_i \alpha_i(x) + m_i \beta_i(x)]
$$&lt;/p&gt;
&lt;p&gt;若 $f(x) \in C^4[a, b]$，记 $M_4 = \max |f^{(4)}(x)|$，则误差界为：
$$
|f(x) - I_h(x)| \leqslant \frac{h^4}{384} M_4
$$&lt;/p&gt;
&lt;h2&gt;三次样条插值&lt;/h2&gt;
&lt;h3&gt;定义&lt;/h3&gt;
&lt;p&gt;若函数 $S(x)$ 满足以下三个条件，则称其为三次样条插值函数：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;二阶连续性&lt;/strong&gt;：$S(x) \in C^2[a, b]$，即在整个区间上具有连续的一阶和二阶导数（曲线非常光滑）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插值性&lt;/strong&gt;：$S(x_k) = f_k, \quad k=0, 1, \dots, n$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分段三次&lt;/strong&gt;：在每个小区间 $[x_k, x_{k+1}]$ 上，$S(x)$ 是一个三次多项式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;相比分段三次 Hermite 插值，样条插值&lt;strong&gt;不需要知道原函数的导数值&lt;/strong&gt;，它通过自身的平滑要求（二阶导数连续）自动计算出所需的导数。&lt;/p&gt;
&lt;h3&gt;自由度分析&lt;/h3&gt;
&lt;p&gt;在 $n$ 个小区间上，每个区间有 4 个系数 $(a_k, b_k, c_k, d_k)$，总共有 &lt;strong&gt;$4n$ 个待定系数&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;约束条件统计：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内部节点连续性&lt;/strong&gt;：在 $n-1$ 个内部节点处，函数值、一阶导、二阶导均需连续，共 $3(n-1)$ 个条件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插值条件&lt;/strong&gt;：$n+1$ 个节点处必须经过已知点，共 $n+1$ 个条件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总计条件数&lt;/strong&gt;：$3n - 3 + n + 1 = 4n - 2$ 个。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;方程数比未知数少 2 个，因此必须额外补充 &lt;strong&gt;2 个边界条件&lt;/strong&gt; 才能得到唯一解。&lt;/p&gt;
&lt;p&gt;| 类型 | 边界条件名称 | 具体描述 | 公式表达 |
| :--- | :--- | :--- | :--- |
| &lt;strong&gt;(a)&lt;/strong&gt; | &lt;strong&gt;固支边界&lt;/strong&gt; | 已知两端点的一阶导数（斜率）。 | $S&apos;(x_0) = f&apos;_0, \ S&apos;(x_n) = f&apos;_n$ |
| &lt;strong&gt;(b)&lt;/strong&gt; | &lt;strong&gt;简支边界&lt;/strong&gt; | 已知两端点的二阶导数（弯矩）。 | $S&apos;&apos;(x_0) = f&apos;&apos;_0, \ S&apos;&apos;(x_n) = f&apos;&apos;_n$ |
| &lt;strong&gt;(c)&lt;/strong&gt; | &lt;strong&gt;周期边界&lt;/strong&gt; | 首尾节点的函数值及各阶导数相等。 | $S^{(i)}(x_0) = S^{(i)}(x_n), \ i=0, 1, 2$ |&lt;/p&gt;
&lt;p&gt;给定区间 $[a, b]$ 上的函数值及上述任一种边界条件，则在全区间上&lt;strong&gt;存在唯一的&lt;/strong&gt;三次样条插值函数 $S(x)$。&lt;/p&gt;
&lt;h3&gt;三弯矩法&lt;/h3&gt;
&lt;p&gt;三次样条函数 $S(x)$ 的表达式有多种形式，但在实际计算中，使用&lt;strong&gt;二阶导数值&lt;/strong&gt; $S&apos;&apos;(x_i) = M_i \ (i=0, 1, \dots, n)$ 来表示更为方便。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;力学解释&lt;/strong&gt;：$M_i$ 在物理上可以解释为细梁在节点 $x_i$ 处的&lt;strong&gt;弯矩&lt;/strong&gt;（Bending Moment）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法名称&lt;/strong&gt;：由于推导出的方程组中，每一个点的弯矩只与相邻的两个弯矩有关（形成三对角关系），故称为&lt;strong&gt;三弯矩算法&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>几何计算前沿-曲面光顺</title><link>https://astro-pure.js.org/blog/geometric-computing-notes/02</link><guid isPermaLink="true">https://astro-pure.js.org/blog/geometric-computing-notes/02</guid><description>几何计算前沿笔记-02</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;数学基础&lt;/h2&gt;
&lt;h3&gt;散度定理&lt;/h3&gt;
&lt;p&gt;函数 $\mathbf{F} = (P, Q, V)$
$$
\oint_{\partial V} \mathbf{F} \cdot d\mathbf{S} = \int_{V} \nabla \cdot \mathbf{F} , dV
$$
$$
\oint_{\partial V} P , dydz + Q , dxdz + V , dxdy = \int_{V} \left( \frac{\partial P}{\partial x} + \frac{\partial Q}{\partial y} + \frac{\partial V}{\partial z} \right) dV
$$&lt;/p&gt;
&lt;h3&gt;梯度与拉普拉斯算子&lt;/h3&gt;
&lt;p&gt;为了描述空间中温度的变化，引入了两个重要的数学算子：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;温度差&lt;/strong&gt;（梯度 $\nabla u$）：
$$
\nabla u = \left( \frac{\partial u}{\partial x}, \frac{\partial u}{\partial y}, \frac{\partial u}{\partial z} \right)
$$
梯度代表了温度变化最剧烈的方向。热量总是沿着梯度的反方向（从高温到低温）流动的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拉普拉斯算子&lt;/strong&gt; ($\Delta u$ 或 $\nabla^2 u$)：$\Delta u = \nabla \cdot (\nabla u)$，即梯度的散度。它描述了空间某点温度的“不均匀性”或“平均差”。&lt;/p&gt;
&lt;h3&gt;热传播方程：&lt;/h3&gt;
&lt;p&gt;通过&lt;strong&gt;散度定理&lt;/strong&gt;，我们可以把曲面上的热通量转化成体积内的变化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;左侧（流出量）&lt;/strong&gt;：利用散度定理，将闭合曲面上的温度梯度积分转化为体积积分：
$$
\oint_{\partial V} \nabla u \cdot d\mathbf{S} = \int_{V} \nabla \cdot \nabla u , dV = \int_{V} \Delta u , dV
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右侧（变化量）&lt;/strong&gt;：根据物理定律，内部热量的变化与温度随时间的变化率 $\frac{\partial u}{\partial t}$ 相关：
$$
\lambda \int_{V} \frac{\partial u}{\partial t} , dV
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终方程&lt;/strong&gt;：由于上述等式对任意体积 $V$ 都成立，消去积分号得到&lt;strong&gt;热传播方程&lt;/strong&gt;：
$$
\Delta u(\mathbf{x}, t) = \lambda \frac{\partial u(\mathbf{x}, t)}{\partial t}
$$&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;图上的微分算子&lt;/h3&gt;
&lt;p&gt;我们将三维空间中的函数简化为定义在图 $G = (V, E)$ 上的函数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$V$ (Vertices)&lt;/strong&gt;：顶点，相当于空间中的采样点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$E$ (Edges)&lt;/strong&gt;：边，代表点与点之间的邻接关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$f_i$&lt;/strong&gt;：定义在顶点 $v_i$ 上的标量值（例如该点的温度、高度或颜色）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;图上的梯度&lt;/strong&gt;
在连续空间，梯度描述函数值的变化。在图上，梯度定义在&lt;strong&gt;边&lt;/strong&gt; $e_{ij}$ 上：
$$
\nabla G |&lt;em&gt;{e&lt;/em&gt;{ij}} = f_i - f_j
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;物理意义&lt;/strong&gt;：它表示两个相邻顶点之间值的“势差”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;图上的拉普拉斯算子&lt;/h3&gt;
&lt;p&gt;通过“热传播”的视角，我们可以推导出顶点 $v_i$ 处的离散拉普拉斯算子：
$$
\Delta G |&lt;em&gt;{v_i} = \frac{1}{N_i} \sum&lt;/em&gt;{j \in Neigh_i} (f_j - f_i)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$Neigh_i$&lt;/strong&gt;：顶点 $v_i$ 的所有邻居节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$N_i$&lt;/strong&gt;：邻居节点的数量（度数）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直观理解&lt;/strong&gt;：它计算的是&lt;strong&gt;该点值与周围邻居平均值的差&lt;/strong&gt;。如果 $\Delta G &gt; 0$，说明该点比周围“冷”；如果 $\Delta G &amp;#x3C; 0$，说明该点比周围“热”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;拉普拉斯平滑&lt;/h2&gt;
&lt;p&gt;平滑一个 3D 模型（网格）的过程，在数学上等同于让模型上的点坐标按照**扩散方程（Diffusion Equation）**进行演化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方程&lt;/strong&gt;：$\frac{\partial}{\partial t} f(v_i, t) = \lambda \Delta f(v_i, t)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离散近似&lt;/strong&gt;：$\frac{\partial \mathbf{f}(t)}{\partial t} \approx \frac{\mathbf{f}(t+h) - \mathbf{f}(t)}{h}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直观理解&lt;/strong&gt;：网格上的每一个点 $v_i$ 都会向其邻居的平均位置移动。随着时间 $t$ 的推移，尖锐的噪点会被“抹平”，模型变得圆润。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了在计算机上实现这个方程，我们需要将连续的时间微分 $\frac{\partial f}{\partial t}$ 离散化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方案 A：前向欧拉法&lt;/strong&gt;
这是最直接的方法，使用&lt;strong&gt;当前时刻&lt;/strong&gt;的状态来预测下一时刻。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;迭代公式&lt;/strong&gt;：$\mathbf{f}^k = \mathbf{f}^{k-1} + \tau \mathbf{L} \mathbf{f}^{k-1}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方案 B：后向欧拉法 (Implicit/Backward Euler)&lt;/strong&gt;
这是一种“隐式”方法，使用&lt;strong&gt;下一时刻&lt;/strong&gt;的状态来更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;迭代公式&lt;/strong&gt;：$(\mathbf{I} - \tau \mathbf{L}) \mathbf{f}^k = \mathbf{f}^{k-1}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;求解&lt;/strong&gt; $(I - \tau \mathbf{L})\mathbf{f}^k = \mathbf{f}^{k-1}$  (求解 $Ax = b$) 的方法：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cholesky 分解&lt;/strong&gt; ($LL^T$)&lt;/p&gt;
&lt;p&gt;当矩阵 $A$ 是&lt;strong&gt;对称正定&lt;/strong&gt;的时，$LU$ 分解可以进一步简化为 $LL^T$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：$A = LL^T$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求解步骤&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;先解 $Ly = b$（前向替换）。&lt;/li&gt;
&lt;li&gt;再解 $L^Tx = y$（后向替换）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技巧&lt;/strong&gt;：
对于这里的矩阵，他极大概率是稀疏的，直接分解对内存的开销过大。使用重排的方法把非零元集中到对角线附近，可以大大减少分解时产生的非零元。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fcholesky.BtLatD78.png&amp;#x26;w=2274&amp;#x26;h=710&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;三角形网格&lt;/h2&gt;
&lt;p&gt;在网格中，我们只知道顶点 ($v_i, v_j, v_k$) 上的值 $f_i, f_j, f_k$。为了计算三角形内部任意点 $x$ 的值，我们需要使用&lt;strong&gt;重心坐标插值 (Barycentric Interpolation)&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
f(x) = B_i(x)f_i + B_j(x)f_j + B_k(x)f_k
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;$B_i(x)$&lt;/strong&gt;：线性基函数（或者叫插值权重）。它的特点是在顶点 $i$ 处为 $1$，在其他顶点处为 $0$，且在三角形内部线性变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基函数的梯度&lt;/p&gt;
&lt;p&gt;因为 $B_i(x)$ 是一个线性函数，它的梯度 $\nabla B_i(x)$ 是一个&lt;strong&gt;常数向量&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;几何意义&lt;/strong&gt;：$\nabla B_i(x)$ 的方向垂直于对边（即边 $e_{jk}$），且大小与三角形的面积 $A_T$ 成反比。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;公式表达&lt;/strong&gt;：$\nabla B_i(x) = \frac{(x_k - x_j)^\perp}{2A_T}$。这里的 $^\perp$ 表示将向量旋转 $90^\circ$（法向方向）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;三角形梯度公式&lt;/strong&gt;
将基函数的梯度代入插值公式，我们得到整个三角形面片上的&lt;strong&gt;梯度向量&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\nabla f(x) = (f_j - f_i) \frac{(x_i - x_k)^\perp}{2A_T} + (f_k - f_i) \frac{(x_j - x_i)^\perp}{2A_T}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;三角形网格内的拉普拉斯算子&lt;/strong&gt;
根据上面的梯度公式，我们可以推导出顶点的拉普拉斯算子：&lt;/p&gt;
&lt;p&gt;根据散度定理&lt;/p&gt;
&lt;p&gt;$$
\int_{A_i} \Delta f(\mathbf{u}) , dA = \int_{A_i} \text{div} \nabla f(\mathbf{u}) , dA = \int_{\partial A_i} \nabla f(\mathbf{u}) \cdot \mathbf{n}(\mathbf{u}) , ds
$$
其中 $A_i$ 是顶点 $v_i$ 周围的对偶区域，$\mathbf{n}$ 是边界法向量。&lt;/p&gt;
&lt;p&gt;单个三角形内的通量积分&lt;/p&gt;
&lt;p&gt;针对 $\partial A_i \cap T$（即落在某个三角形 $T$ 内的那部分对偶边界）进行计算：
$$
\int_{\partial A_i \cap T} \nabla f(\mathbf{u}) \cdot \mathbf{n}(\mathbf{u}) , ds = \nabla f(\mathbf{u}) \cdot (\mathbf{a} - \mathbf{b})^\perp = \frac{1}{2} \nabla f(\mathbf{u}) \cdot (\mathbf{x}_j - \mathbf{x}_k)^\perp
$$
代入梯度公式进一步推导得到：
$$
= (f_j - f_i) \frac{(\mathbf{x}_i - \mathbf{x}_k)^\perp \cdot (\mathbf{x}_j - \mathbf{x}_k)^\perp}{4A_T} + (f_k - f_i) \frac{(\mathbf{x}_j - \mathbf{x}_i)^\perp \cdot (\mathbf{x}_j - \mathbf{x}_k)^\perp}{4A_T}
$$
利用向量点积与余切值的几何关系简化为：
$$
= \frac{1}{2} \left( \cot \gamma_k (f_j - f_i) + \cot \gamma_j (f_k - f_i) \right)
$$
离散拉普拉斯算子最终公式 (Discrete Laplacian)&lt;/p&gt;
&lt;p&gt;将周围所有邻接三角形的贡献加总，得到顶点 $v_i$ 处的余切权重公式：
$$
\Delta f(v_i) := \frac{1}{2A_i} \sum_{v_j \in \mathcal{N}&lt;em&gt;1(v_i)} (\cot \alpha&lt;/em&gt;{i,j} + \cot \beta_{i,j}) (f_j - f_i)
$$
$A_i$：顶点 $v_i$ 的对偶区域面积（混合面积）。$\mathcal{N}&lt;em&gt;1(v_i)$：顶点 $v_i$ 的一阶邻域（即所有相连的邻居点）。$\alpha&lt;/em&gt;{i,j}, \beta_{i,j}$：共享边 $(v_i, v_j)$ 的两个相邻三角形中，与该边相对的两个内角。$(f_j - f_i)$：相邻顶点间的函数值差。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2FLaplacian.BL979yrb.png&amp;#x26;w=718&amp;#x26;h=1232&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;由此求得的拉普拉斯矩阵，也可以用于&lt;a href=&quot;#%E6%8B%89%E6%99%AE%E6%8B%89%E6%96%AF%E5%B9%B3%E6%BB%91&quot;&gt;拉普拉斯平滑&lt;/a&gt;的计算。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;双边网格去噪&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心算法流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输入&lt;/strong&gt;：顶点 $\mathbf{v}$，该点法向量 $\mathbf{n}$。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高度图概念&lt;/strong&gt;：将每个顶点周围的邻居点投影到法向量方向上，转化成一个局部“高度”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键变量推导&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$t = |\mathbf{v} - \mathbf{q}_i|$：邻居点与当前点的&lt;strong&gt;欧几里得距离&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;$h = \langle \mathbf{n}, \mathbf{v} - \mathbf{q}_i \rangle$：邻居点相对于中心点的&lt;strong&gt;法向偏移量（高度差）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;双边权重组合&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$w_c = \exp(-t^2 / (2\sigma_c^2))$：对应空间距离（控制平滑范围）。&lt;/li&gt;
&lt;li&gt;$w_s = \exp(-h^2 / (2\sigma_s^2))$：对应高度差异（&lt;strong&gt;保边核心&lt;/strong&gt;：如果高度差太大，权重变极小）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新公式&lt;/strong&gt;：
$$
\mathbf{\hat{v}} = \mathbf{v} + \mathbf{n} \cdot \left( \frac{\sum w_c w_s h}{\sum w_c w_s} \right)
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fdenoise.c7eYQvwq.png&amp;#x26;w=824&amp;#x26;h=396&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;法向量双边滤波&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;第一步：法向量滤波&lt;/strong&gt;。先不管顶点坐标，只对面片的法向量进行双边滤波。&lt;/p&gt;
&lt;p&gt;处理的对象变成了&lt;strong&gt;法向量 $\mathbf{n}$&lt;/strong&gt;：
$$
\mathbf{n}&lt;em&gt;i^{k+1} = \frac{1}{K_i} \sum_j W&lt;/em&gt;{\sigma_s}(\dots) \cdot W_{\sigma_r}(|\mathbf{n}_i^k - \mathbf{n}_j^k|) \cdot \mathbf{n}_j^k
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：如果两个相邻面片分别属于两个不同的平面（如立方体的顶面和侧面），它们的法向量差别很大。值域权重 $W_{\sigma_r}$ 会识别出这种巨大差异并停止平滑，从而保持尖锐特征（Sharp Features）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第二步：更新顶点位置&lt;/strong&gt;。根据平滑后的法向量，反过来调整顶点坐标，使三角形面片重新对齐这些法向量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;几何约束&lt;/strong&gt;
一个面片的法向量 $\mathbf{n}_f$ 必须垂直于该三角形的所有边：
$$\mathbf{n}_f \cdot (\mathbf{x}_j - \mathbf{x}_i) = 0$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;能量函数最小化&lt;/strong&gt;
为了让所有顶点尽可能满足上述约束，定义能量函数（误差总和）：
$$
e_1(X) = \sum_{k \in F} \sum_{(i,j) \in \partial F_k} (\mathbf{n}_k&apos; \cdot (\mathbf{x}_i - \mathbf{x}_j))^2
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;梯度下降法求解&lt;/strong&gt;
利用梯度下降法不断迭代顶点位置，直到误差最小：
$$
\mathbf{x}&lt;em&gt;i&apos; = \mathbf{x}&lt;em&gt;i + \lambda \sum&lt;/em&gt;{j \in N_V(i)} \sum&lt;/em&gt;{(i,j) \in \partial F_k} \mathbf{n}_k&apos; (\mathbf{n}_k&apos; \cdot (\mathbf{x}_j - \mathbf{x}_i))
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;稀疏优化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：使图像或网格的&lt;strong&gt;梯度尽可能稀疏&lt;/strong&gt;。下面先看图像。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数学表达&lt;/strong&gt;：$\min_c |c - c^*|^2 + \lambda |\nabla c|_0$
&lt;ul&gt;
&lt;li&gt;$|c - c^*|^2$：&lt;strong&gt;数据项&lt;/strong&gt;，保证平滑后的结果不能偏离原图太远。&lt;/li&gt;
&lt;li&gt;$|\nabla c|_0$：&lt;strong&gt;稀疏项（$L_0$ 范数）&lt;/strong&gt;，统计梯度不为 0 的像素点个数。越小代表平面越多，边缘越锐利。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;算法实现：交替方向乘子法 (ADMM 思想)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于 $L_0$ 范数是不可导的（NP-hard 问题），我们可以通过引入&lt;strong&gt;辅助变量&lt;/strong&gt; $\delta$ 来求解：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;拆解方程&lt;/strong&gt;：将原问题转化为 $\min_{c, \delta} |c - c^*|^2 + \beta |\nabla c - \delta|^2 + \lambda |\delta|_0$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;固定 $c$，更新 $\delta$ (Local Step)&lt;/strong&gt;：这是一个硬阈值操作。如果梯度不够大，直接砍成 0；如果够大，保留原样。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;固定 $\delta$，更新 $c$ (Global Step)&lt;/strong&gt;：这是一个全局优化问题，通常转化为解线性方程组。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将此技术应用到 3D 网格时，面临一个问题：&lt;strong&gt;如何定义网格上的“梯度”或“拉普拉斯”？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接用“点的拉普拉斯”会导致模型像被抽真空一样严重收缩，且棱角依然不清晰。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;边上的拉普拉斯算子 $D(e)$&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;2013 年的研究（如 $L_0$ Mesh Smoothing）将关注点从&lt;strong&gt;点&lt;/strong&gt;移到了&lt;strong&gt;边&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;算子定义在共享边 $e$ 的两个三角形上，涉及四个顶点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$p_1, p_3$&lt;/strong&gt;：共享边 $e$ 的两个端点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$p_2, p_4$&lt;/strong&gt;：分别属于两个三角形的相对顶点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与之对应的有四个关键角度：$\theta_{2,3,1}, \theta_{1,3,4}, \theta_{3,1,2}, \theta_{4,1,3}$（即每个三角形内靠近共享边端点的内角）。&lt;/p&gt;
&lt;p&gt;边上的拉普拉斯算子 $D(e)$ 是一个线性算子，将四个顶点的坐标映射为一个标量值（代表该边的“翻折”或“非平坦”程度）：&lt;/p&gt;
&lt;p&gt;$$
D(e) = \begin{bmatrix}
-\cot(\theta_{2,3,1}) - \cot(\theta_{1,3,4}) \
\cot(\theta_{2,3,1}) + \cot(\theta_{3,1,2}) \
-\cot(\theta_{3,1,2}) - \cot(\theta_{4,1,3}) \
\cot(\theta_{1,3,4}) + \cot(\theta_{4,1,3})
\end{bmatrix}^T \begin{bmatrix} p_1 \ p_2 \ p_3 \ p_4 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;在 $2013$ 年的论文中，这个算子被放入 $L_0$ 范数中：
$$
\min_{p} |p - p^*|^2 + \lambda |D(p)|_0
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基于机器学习的网格去噪&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计并提取特征&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特征来源：多尺度法向量双边滤波&lt;/strong&gt;
之前的双边滤波需要人工指定参数 $\sigma_s$ (空间) 和 $\sigma_r$ (值域)。这里的方法是多尝试。
&lt;ul&gt;
&lt;li&gt;设置迭代次数 $k=1$（只做一次滤波）。&lt;/li&gt;
&lt;li&gt;均匀采样 10 组不同的 $(\sigma_s, \sigma_r)$ 参数对。&lt;/li&gt;
&lt;li&gt;分别用这 10 组参数对法向量进行双边滤波，得到 10 个不同的滤波结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征拼接 ($S_i$)&lt;/strong&gt;：
将这 10 个滤波后的法向量拼接成一个长向量 $S_i = (n_i^1(\sigma_{s1}, \sigma_{r1}), \dots, n_i^1(\sigma_{sk}, \sigma_{rk}))$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;旋转不变性 (Rotation Invariance)&lt;/strong&gt;：
为了让神经网络不被物体的摆放姿势干扰，需要对齐主方向，确保无论模型怎么转，提取出的特征 $S_i$ 都是一样的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回归模型建构&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有了特征 $S_i$（输入 X），我们需要训练一个网络，让它输出理想的、干净的法向量（输出 Y）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;回归函数 $F(S_i; \Theta)$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;这里使用了一个&lt;strong&gt;单隐层神经网络 (Single-hidden-layer Neural Network)&lt;/strong&gt;，$\Theta$ 代表网络的权重参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;损失函数 / 优化目标&lt;/strong&gt;：
$$
\min_\Theta \sum_i |F(S_i; \Theta) - n_i^g|_2^2
$$
&lt;ul&gt;
&lt;li&gt;$n_i^g$：代表 &lt;strong&gt;Ground Truth (理想的真实法向量)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：不断调整网络参数 $\Theta$，使得网络预测出的法向量，尽可能逼近干净无噪声的真实法向量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高阶技巧：基于聚类的回归&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;做法&lt;/strong&gt;：不训练一个万能的巨型网络，而是&lt;strong&gt;给每个类别单独训练一个小神经网络&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：降低了训练难度。处理平面的“专家”网络只管把面抹平，处理边缘的“专家”网络只管保护锐利度。类似于 &lt;strong&gt;MoE (Mixture of Experts)&lt;/strong&gt; 架构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>几何计算前沿-获取</title><link>https://astro-pure.js.org/blog/geometric-computing-notes/01</link><guid isPermaLink="true">https://astro-pure.js.org/blog/geometric-computing-notes/01</guid><description>几何计算前沿笔记-01</description><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;几何表达及其相互转换&lt;/h2&gt;
&lt;p&gt;主要介绍三种常见的三维数据表达方式，以及它们之间的部分相互转换方法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fexpression.f-DM52xA.png&amp;#x26;w=2230&amp;#x26;h=838&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;三角网格&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本表达&lt;/strong&gt;：由顶点（包含 $x, y, z$ 坐标）和三角形（包含顶点的索引 $i, j, k$）组成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法向量计算&lt;/strong&gt;：面法向量通过三角形两边的向量叉乘得到；点法向量则是由相邻面法向量按面积加权平均求得。三角形内部任意一点的法向量可以通过重心坐标插值求出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据结构&lt;/strong&gt;：为了快速查询任意顶点的邻域，通常使用以边为中介的半边数据结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;几何变换&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;刚体变换（Rigid）：包含平移和旋转，保持长度不变。&lt;/li&gt;
&lt;li&gt;相似变换（Conformal）：包含平移、旋转和等比例缩放，保持角度不变。&lt;/li&gt;
&lt;li&gt;仿射变换（Affine）：包含平移、旋转、缩放、对称和错切，保持共线关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法向量的变换&lt;/strong&gt;：经过矩阵 $M$ 变换后，新法向量的计算公式需要用到&lt;strong&gt;逆转置矩阵&lt;/strong&gt;：$N_t = M^{-T}N_o$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;点云&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本表达&lt;/strong&gt;：最基础的表达是 xyz 格式的顶点列表。这通常是三维扫描仪的直接输出格式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法向量估计&lt;/strong&gt;：可以从点云的局部利用主成分分析（PCA）进行估计。通过计算协方差矩阵，其最小特征值对应的特征向量即为法向量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;隐函数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本表达&lt;/strong&gt;：用函数的等值面（如 $f(x,y,z)=0$）来表达一个三维形状。例如符号距离场（SDF）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法向量计算&lt;/strong&gt;：隐函数 $F(x,y,z)=0$ 的法向量即为该函数的梯度方向：$n = \nabla F / ||\nabla F||$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布尔运算 (CSG)&lt;/strong&gt;：隐函数非常便于进行布尔运算，如并集 $\min(f_1, f_2)$、交集 $\max(f_1, f_2)$ 和差集 $\max(f_1, -f_2)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三维表达之间的转换&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐函数转三角形网格&lt;/strong&gt;：常用 Marching Cubes 算法，该算法对三维空间均匀采样并通过查表得到三角化结果，但它的缺点是不能重建尖锐的角点。改进方法有 Dual Contouring。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2FDualContouring.gYG57kyL.png&amp;#x26;w=2330&amp;#x26;h=1090&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;三角形网格转隐函数&lt;/strong&gt;：通过计算空间点到三角形的最短距离来获取隐函数值。可以通过射线与三角形网格交点的奇偶性来判断点是在网格内部（奇数交点）还是外部（偶数交点）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;曲面重建&lt;/h2&gt;
&lt;p&gt;以 KinectFusion 为例子，探讨了如何从深度传感器的数据重建出三维模型。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2FKinectFusion.BrAPgtCc.png&amp;#x26;w=2376&amp;#x26;h=1130&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;三维扫描技术原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kinect V1&lt;/strong&gt;：主要利用结构光（Structured Light）原理，硬件包含红外投影器、RGB 相机和红外相机。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinect V2&lt;/strong&gt;：利用飞行时间（Time Of Flight, TOF）原理，通过测量光的传播时间来计算距离，反映在信号上即为相位的变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;从深度图到三维数据&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;深度图转点云&lt;/strong&gt;：利用相机的内参数矩阵（Camera Intrinsics，包含焦距和主点坐标），通过投影变换的逆过程将深度图的像素点转换到世界坐标系下。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取法向量&lt;/strong&gt;：通过建立邻域关系先构建三角形网格，进而为每个三角形计算法向量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;点云配准与 ICP 算法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配准目标&lt;/strong&gt;：给定两组存在对应关系的点云 $P$ 和 $Q$，求解出一个旋转矩阵 $R$ 和平移向量 $t$，使得误差 $\sum_i w_i ||Rq_i + t - p_i||^2$ 最小。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;平移的求解&lt;/strong&gt;：最优的平移向量可以通过两组点云的加权质心求得，即 $t = \overline{q} - R\overline{p}$。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;旋转的求解&lt;/strong&gt;：将上述求得的 $t$ 带入，下面目标是最小化两组点云旋转后的加权欧氏距离平方和，其数学表达为：&lt;/p&gt;
&lt;p&gt;$$
R = \arg\min_R \sum_{i=1}^{n} w_i |R x_i - y_i|^2
$$
约束条件：
$$
s.t. \quad R^T R = I
$$&lt;/p&gt;
&lt;p&gt;这个优化问题在数学上被称为 &lt;a href=&quot;https://en.wikipedia.org/wiki/Orthogonal_Procrustes_problem&quot;&gt;Orthogonal Procrustes problem&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;求解方法&lt;/strong&gt;：奇异值分解 (SVD)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算协方差矩阵 $S$利用中心化后的两组点云矩阵 $X$ 和 $Y$，以及权重矩阵 $W$，计算它们之间的交叉协方差矩阵 $S$：
$$
S = XWY^T
$$
紧接着，对矩阵 $S$ 进行奇异值分解：
$$
S = U \Sigma V^T
$$&lt;/li&gt;
&lt;li&gt;构造旋转矩阵 $R$利用 SVD 分解得到的正交矩阵 $U$ 和 $V$，可以求得最优旋转矩阵 $R$：
$$
R = V \begin{pmatrix} 1 &amp;#x26; &amp;#x26; &amp;#x26; \ &amp;#x26; \ddots &amp;#x26; &amp;#x26; \ &amp;#x26; &amp;#x26; 1 &amp;#x26; \ &amp;#x26; &amp;#x26; &amp;#x26; \det(VU^T) \end{pmatrix} U^T
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;迭代最近点 (ICP) 算法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由于一开始不知道点云的对应关系，ICP 采用迭代的方法：1. 查询最近点建立对应关系；2. 根据对应关系求解当前的旋转 $R$ 和平移 $t$，不断循环直到收敛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法改进&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;改进一：考虑法向量&lt;br&gt;
&lt;strong&gt;公式&lt;/strong&gt;：
$$
\min_{R,t} \sum_i w_i |\mathbf{n}^T (Rq_i + t - C(P, q_i))|^2
$$
优化目标从“点到点的斜线距离”变成了“点到切平面的垂直距离”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fimprovement.7mBaGAzG.png&amp;#x26;w=794&amp;#x26;h=638&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;改进二：剔除错误匹配点&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;TSDF (截断符号距离场)&lt;/h3&gt;
&lt;p&gt;如果直接对三维空间每个点，都计算到曲面的距离，开销太大，难以做到实时，但我们一般只关注到曲面距离在 $0$ 附近的，下面介绍更高效的方法。&lt;/p&gt;
&lt;p&gt;TSDF 是一种隐式表达三维表面的方法。它将三维空间划分为均匀的网格（体素），每个体素存储着该点到最近表面的距离（SDF）以及置信度权重。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单帧点云 $\rightarrow$ TSDF (初始化)&lt;br&gt;
在拿到单帧深度图/点云后，需要将其转化为 TSDF 空间：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TSDF 距离值 $d_i(\mathbf{x})$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;从相机传感器发出一条穿过当前体素 $\mathbf{x}$ 的射线，打到观测到的表面（三角网格）上。&lt;/li&gt;
&lt;li&gt;计算体素到表面的距离。为了抵御远处的噪声，引入**截断（Truncation）**机制：只在表面附近的一个规定阈值范围内保留真实的距离值，超出这个范围的距离会被截断为一个常数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置信度权重 $w_i(\mathbf{x})$&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;表示该体素距离值的可靠程度。&lt;/li&gt;
&lt;li&gt;靠近表面的区域，权重通过在三角形上插值计算得出；而在被截断的部分（即远离曲面的区域），其 SDF 是不可信的，因此&lt;strong&gt;截断部分的置信度设为 0&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算优化&lt;/strong&gt;：由于每个体素的计算是相互独立的，因此三维体素可以进行&lt;strong&gt;分层并行计算&lt;/strong&gt;（适合 GPU 加速）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Ftsdf.B3SCwNw1.png&amp;#x26;w=1262&amp;#x26;h=886&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多帧 TSDF 融合 (Integration)&lt;br&gt;
在相机的连续运动中，我们会得到多帧不同的 TSDF 数据。我们需要将新的一帧 $i+1$ 融合到已有的全局模型 $i$ 中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;融合策略：加权平均&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;通过加权平均不断更新全局体素的距离值 $D(\mathbf{x})$ 和权重 $W(\mathbf{x})$。这种方式能极其有效地平滑掉单帧深度图带来的传感器噪声。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新公式&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;距离更新&lt;/strong&gt;：
$$
D_{i+1}(\mathbf{x}) = \frac{W_i(\mathbf{x})D_i(\mathbf{x}) + w_{i+1}(\mathbf{x})d_{i+1}(\mathbf{x})}{W_i(\mathbf{x}) + w_{i+1}(\mathbf{x})}
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权重累加&lt;/strong&gt;：
$$
W_{i+1}(\mathbf{x}) = W_i(\mathbf{x}) + w_{i+1}(\mathbf{x})
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零交叉点 (Zero-crossing)&lt;/strong&gt;：在加权平均的过程中，物体表面的实际位置（即 SDF 从正变负的 $D=0$ 的等值面）会被不断修正，最终逼近真实的物理表面。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TSDF 用于形状补全 (Shape Completion)&lt;br&gt;
在真实扫描中，由于视角的限制，物体总会有被遮挡的背面或死角（形成孔洞）。TSDF 的空间划分特性可以天然地辅助进行孔洞修补。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可视化&lt;br&gt;
在扫描过程中，可以实时用 Ray Casting 进行三维渲染。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;函数拟合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;局部拟合&lt;/strong&gt;&lt;br&gt;
首先使用空间划分数据结构（如四叉树/八叉树），将整体大空间切割成众多局部网格。在每一个局部网格内，点云的分布相对简单，可以使用基础的数学函数进行拟合。&lt;/p&gt;
&lt;p&gt;最小二乘局部拟合（以二维为例）
最简单的局部表面可以假设为一条直线或一个平面（一次函数）：
$$
f(x,y)=ax+by+c
$$&lt;/p&gt;
&lt;p&gt;为了找到最贴合当前局部点云的平面，使用最小二乘法求解以下目标函数：
$$
\min_{a,b,c}\sum_i(ax_i+by_i+c)^2+\lambda\sum_i|(n_i^x,n_i^y)-(a,b)|^2
$$&lt;/p&gt;
&lt;p&gt;$\lambda\sum_i|(n_i^x,n_i^y)-(a,b)|^2$ 要求拟合平面的法向量 $(a,b)$ 尽可能与已知数据点的法向量保持一致。$\lambda$ 是用于平衡这两种约束的权重参数。&lt;/p&gt;
&lt;p&gt;如果局部形状略微弯曲，一次函数可能不够精确，此时也可以使用二次函数来捕获更好的局部细节：
$$
f(x,y)=ax^2+by^2+cxy+dx+ey+f
$$&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fmpu.CuteWYcF.png&amp;#x26;w=1168&amp;#x26;h=654&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;各个局部网格独立完成拟合后，如果直接拼在一起，边界处会产生不连续的断层或棱角。为了实现无缝拼接，引入了 &lt;strong&gt;Partition of Unity (PoU)&lt;/strong&gt; 原理。&lt;/p&gt;
&lt;p&gt;算法为每个局部拟合函数 $f_k(x,y)$ 分配一个平滑的权重函数 $w_k(x,y)$。规则通常是：越靠近该局部区域的中心，权重越接近1；越靠近网格边缘，权重平滑递减至0。&lt;/p&gt;
&lt;p&gt;空间中任意一点的最终整体形状 $F(x,y)$，由覆盖该点的所有局部拟合函数“加权平均”共同决定：
$$
F(x,y)=\frac{\sum w_k(x,y)f_k(x,y)}{\sum w_k(x,y)}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;全局拟合&lt;/strong&gt;：Poisson 重建&lt;br&gt;
首先需要明确两个关键的数学函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向量场 $\vec{V}(p)$：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;映射关系：$\vec{V} : \mathbb{R}^3 \to \mathbb{R}^3$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理意义：&lt;/strong&gt; 由输入点云的法向量推导计算出来的空间梯度场。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指示函数 $\chi(p)$ (Indicator Function)：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;映射关系：$\chi : \mathbb{R}^3 \to \mathbb{R}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理意义：&lt;/strong&gt; 这是一个用来区分“模型内部”和“模型外部”的标量函数。通常定义模型&lt;strong&gt;内部为 0，外部为 1&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于输入数据只有点云和法向量，我们实际上只知道表面的“梯度”（即法向量场 $\vec{V}$）。我们需要根据这个梯度场反推出整个空间的指示函数 $\chi$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标能量函数 (Energy Function)：&lt;/strong&gt;
为了找到最符合已知法向量的表面，我们需要寻找一个指示函数 $\chi$，使得它的梯度 $\nabla \chi$ 尽可能逼近已知的向量场 $\vec{V}$。这转化为一个最小二乘极值问题：
$$
E(\chi) = \int |\nabla \chi(p) - \vec{V}(p)|^2 dp
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;转化为泊松方程 (Poisson Equation)：&lt;/strong&gt;
直接求解上述积分函数的最小值比较困难。根据变分法中的 &lt;strong&gt;Euler-Lagrange 公式&lt;/strong&gt;，能量函数 $E(\chi)$ 取得最小值时，必然满足以下偏微分方程：
$$
\Delta \chi \equiv \nabla \cdot \nabla \chi = \nabla \cdot \vec{V}
$$
&lt;em&gt;(注：$\Delta$ 是拉普拉斯算子，$\nabla \cdot$ 是散度算子。即要求未知函数 $\chi$ 的拉普拉斯值等于已知向量场 $\vec{V}$ 的散度。)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>角色动画与运动仿真-角色运动学</title><link>https://astro-pure.js.org/blog/mocca-notes/02</link><guid isPermaLink="true">https://astro-pure.js.org/blog/mocca-notes/02</guid><description>角色动画与运动仿真笔记-02</description><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;角色运动学基础&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;骨骼结构:&lt;/strong&gt; 角色模型通常由关节 (joint)、骨骼 (bone) 和链 (link) 组成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自由度 (Degrees of Freedom, DoF):&lt;/strong&gt; 用于描述一个机械系统状态的独立参数个数。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;铰链关节 (Hinge/Revolute joint):&lt;/strong&gt; 例如膝盖和手肘，拥有 1 DoF，其旋转范围通常受限 ($\theta_{min} \le \theta \le \theta_{max}$)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;万向节 (Universal joint):&lt;/strong&gt; 拥有 2 DoF。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;球窝关节 (Ball-and-socket joint):&lt;/strong&gt; 例如髋关节和肩部，拥有 3 DoF，旋转同样受限。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fjoint1.QojBB-KI.png&amp;#x26;w=2176&amp;#x26;h=580&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fjoint2.CkkLfFta.png&amp;#x26;w=2126&amp;#x26;h=644&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fjoint3.Be7JnL3X.png&amp;#x26;w=2170&amp;#x26;h=522&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;正向运动学&lt;/h2&gt;
&lt;p&gt;正向运动学是指在已知所有关节的旋转参数 $R_i$ 的情况下，计算末端执行器 (End Effector) 在全局坐标系下的位置 $x$。&lt;/p&gt;
&lt;h3&gt;公式推导&lt;/h3&gt;
&lt;p&gt;在机器人学或计算机图形学的链式结构中，通常涉及两种描述姿态的方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$R_i$ (Local Rotation / Relative Rotation):&lt;/strong&gt; 第 $i$ 个关节相对于前一个关节的&lt;strong&gt;局部旋转&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$Q_i$ (Global Orientation):&lt;/strong&gt; 第 $i$ 个关节相对于世界坐标系（全局）的&lt;strong&gt;绝对朝向&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过逐级累乘局部旋转矩阵，可以得到每一级的全局朝向。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推导过程&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$Q_0 = R_0$ （基座/起始点的朝向）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$Q_1 = R_0 R_1 = Q_0 R_1$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$Q_2 = R_0 R_1 R_2 = Q_1 R_2$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$Q_3 = R_0 R_1 R_2 R_3 = Q_2 R_3$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$Q_4 = R_0 R_1 R_2 R_3 R_4 = Q_3 R_4$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;通项公式&lt;/strong&gt;
$$
Q_i = Q_{i-1} R_i
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果我们已知各级的全局朝向，可以反求出局部旋转矩阵：&lt;/p&gt;
&lt;p&gt;利用旋转矩阵的正交性（$Q^T = Q^{-1}$），从 $Q_i = Q_{i-1} R_i$ 可以推导出：
$$
R_i = Q_{i-1}^T Q_i
$$&lt;/p&gt;
&lt;h3&gt;任意两点间的相对旋转&lt;/h3&gt;
&lt;p&gt;如果需要计算链条中任意两个非相邻节点（例如节点 1 到节点 4）之间的相对旋转 $R_4^1$：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
R_{4}^{1} &amp;#x26;= Q_{1}^{T} Q_{4} \
&amp;#x26;= (R_{0} R_{1})^{T} R_{0} R_{1} R_{2} R_{3} R_{4} \
&amp;#x26;= R_{2} R_{3} R_{4}
\end{aligned}
$$&lt;/p&gt;
&lt;h3&gt;层级计算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;计算各关节的全局旋转/朝向：
$$
Q_i = Q_{i-1} R_i
$$&lt;/li&gt;
&lt;li&gt;计算各关节的全局位置：
$$
p_{i+1} = p_i + Q_i l_i
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;末端执行器位置:&lt;/strong&gt;
$$
x = p_E + Q_E x_0
$$
（其中 $p_E$ 为末端关节位置，$Q_E$ 为其全局旋转，$x_0$ 为局部偏移量。）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Ffk.C6opnh8f.png&amp;#x26;w=1260&amp;#x26;h=1090&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;已知条件：&lt;/strong&gt; 所有关节的旋转矩阵 $R_i$ 和连杆长度 $l_i$。&lt;br&gt;
&lt;strong&gt;目标1：&lt;/strong&gt; 求解末端点 $x_0$ 在全局或局部参考系下的坐标 $x$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法 A：自底向上（从根节点到末端）&lt;/strong&gt;
依次计算每一级的全局朝向 $Q_i$ 和位置 $p_i$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;循环迭代：&lt;/strong&gt; 对 $i$ 从 $root$ 到 $end_effector$：
&lt;ul&gt;
&lt;li&gt;$Q_i = Q_{i-1} R_i$&lt;/li&gt;
&lt;li&gt;$p_{i+1} = p_i + Q_i l_i$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终坐标：&lt;/strong&gt; $x = p_E + Q_E x_0$
&lt;em&gt;(其中 $p_E$ 和 $Q_E$ 分别为末端执行器的全局位置和朝向)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法 B：自顶向下（从末端到根节点）&lt;/strong&gt;
通过递归变换直接累积坐标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始化：&lt;/strong&gt; $x = x_0$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环迭代：&lt;/strong&gt; 对 $i$ 从 $end_effector$ 到 $root$：
&lt;ul&gt;
&lt;li&gt;$x = l_{i-1} + R_i x$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;目标2：&lt;/strong&gt; 求解 $x_0$ 相对于局部坐标系 $Q_k$ (Local Frame) 的坐标&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法 A：局部增量法&lt;/strong&gt;
将 $Q_k$ 视为临时根节点（即 $Q&apos;_0 = I, p&apos;_0 = 0$）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;循环迭代：&lt;/strong&gt; 对 $i$ 从 $joint \ k+1$ 到 $end_effector$：
&lt;ul&gt;
&lt;li&gt;$Q&apos;&lt;em&gt;i = Q&apos;&lt;/em&gt;{i-1} R_i$&lt;/li&gt;
&lt;li&gt;$p&apos;_{i+1} = p&apos;_i + Q&apos;_i l_i$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相对坐标：&lt;/strong&gt; $x = p&apos;_E + Q&apos;_E x_0$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法 B：局部递归法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始化：&lt;/strong&gt; $x = x_0$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环迭代：&lt;/strong&gt; 对 $i$ 从 $end_effector$ 到 $joint \ k+1$：
&lt;ul&gt;
&lt;li&gt;$x = l_{i-1} + R_i x$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;角色姿态与参考系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Posed Character（摆好姿态的角色）：&lt;/strong&gt; 角色最终呈现的动作是由一系列局部旋转矩阵（如 $R_0, R_1, R_2, R_3$）作用于骨骼链的结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参考姿态 (Reference Poses)：&lt;/strong&gt; 制作模型和动画时的初始默认姿态。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;T-Pose：&lt;/strong&gt; 双臂平举，形似字母 &quot;T&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A-Pose：&lt;/strong&gt; 双臂自然下垂，角度通常在 45° 左右，形似字母 &quot;A&quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心矛盾：&lt;/strong&gt; 同样的动作指令（如“手臂向上旋转 90°”），在不同的参考姿态下，最终得到的全局效果完全不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fpose.CyQnjUM1.png&amp;#x26;w=2362&amp;#x26;h=1112&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;动作重定向&lt;/h2&gt;
&lt;h3&gt;单物体的重定向&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心任务：&lt;/strong&gt; 物体在姿态 A 为初始状态时的旋转为 $R_A$，求在姿态 B 下等效的旋转 $R_B$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义偏移：&lt;/strong&gt; 设从姿态 A 到姿态 B 的旋转偏移为 $R_{A \to B}$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算公式：&lt;/strong&gt;
$$
R_B = R_A R_{A \to B}^T
$$
&lt;em&gt;(这里 $R_{A \to B}^T$ 即 $R_{B \to A}$，用于抵消姿态 B 相对于 A 的初始偏角。)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fsingle.mNQIjOSy.png&amp;#x26;w=2304&amp;#x26;h=1124&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;运动链的重定向&lt;/h3&gt;
&lt;p&gt;对于多节点链路，每一级都有其对应的&lt;strong&gt;全局朝向偏移 (Global Orientation Offset)&lt;/strong&gt;，记为 $Q^{A \to B}$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;已知变量 (姿态 A)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Q_{p_i}^A = R_{p_i}^A$ （父节点的全局朝向）&lt;/li&gt;
&lt;li&gt;$Q_i^A = Q_{p_i}^A R_i^A$ （当前节点的全局朝向）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标变量 (姿态 B)：&lt;/strong&gt;
我们需要求解 $R_i^B$，使得在姿态 B 下应用该旋转后，物体在全局空间的效果与姿态 A 一致。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;最终公式&lt;/h3&gt;
&lt;p&gt;根据单物体的结论 $Q^B = Q^A (Q^{A \to B})^T$，我们可以对父节点和当前节点分别写出转换关系：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;父节点全局朝向转换：&lt;/strong&gt;
$$
Q_{p_i}^B = Q_{p_i}^A (Q_{p_i}^{A \to B})^T
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前节点全局朝向转换：&lt;/strong&gt;
$$
Q_i^B = Q_i^A (Q_i^{A \to B})^T
$$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过代入 $Q_i^B = Q_{p_i}^B R_i^B$，最终推导出重定向后的局部旋转矩阵公式：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{R_i^B = Q_{p_i}^{A \to B} R_i^A (Q_i^{A \to B})^T}
$$&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fchain.CEtxx89l.png&amp;#x26;w=2206&amp;#x26;h=1158&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;逆向运动学&lt;/h2&gt;
&lt;p&gt;与 FK 相反，IK 是在已知末端执行器目标位置 $\tilde{x}$ 的前提下，反向求出使得系统达到该位置的各关节旋转参数 $\theta$。这是一个典型的非线性问题，可能存在唯一解、多解或无解的情况。&lt;/p&gt;
&lt;h3&gt;启发式方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;循环坐标下降法 (Cyclic Coordinate Descent, CCD):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理:&lt;/strong&gt; 每次迭代中只旋转一个关节，使其末端指向目标位置，遍历所有轴循环执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点:&lt;/strong&gt; 易于实现且计算速度快。但靠近末端的关节（即首先被处理的关节）往往转动幅度过大，可能需要多次迭代才能收敛，且结果对初始解敏感。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FABRIK (Forward and Backward Reaching IK):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理:&lt;/strong&gt; 一种基于位置的快速迭代求解器，包含前向（Forward）和后向（Backward）计算过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点:&lt;/strong&gt; 简单快速，且在无约束问题中保证收敛。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Ffabrik.BNZWo8Cs.png&amp;#x26;w=2284&amp;#x26;h=1240&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优化方法&lt;/h3&gt;
&lt;p&gt;将 IK 视为一个最优化问题，目标是寻找最优的参数 $\theta$ 来最小化误差函数：
$$F(\theta) = \frac{1}{2} | f(\theta) - \tilde{x} |_2^2$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;雅可比矩阵 (Jacobian Matrix):&lt;/strong&gt;
雅可比矩阵反映了末端执行器位置对各参数的偏导数：&lt;/p&gt;
&lt;p&gt;$$
J = \frac{\partial f}{\partial \theta} = \begin{bmatrix} \frac{\partial f}{\partial \theta_0} &amp;#x26; \frac{\partial f}{\partial \theta_1} &amp;#x26; \cdots &amp;#x26; \frac{\partial f}{\partial \theta_n} \end{bmatrix}
$$
（对于铰链关节，可以使用几何法直接计算：$\frac{\partial f}{\partial \theta_i} = \mathbf{a}_i \times \mathbf{r}_i$。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;梯度下降 / 雅可比转置法 (Jacobian Transpose):&lt;/strong&gt;
$$
\theta^{i+1} = \theta^i - \alpha J^T \Delta
$$
其中 $\Delta = f(\boldsymbol{\theta}^i) - \widetilde{\boldsymbol{x}}$ 为误差向量&lt;br&gt;
这是一阶方法，不需要计算矩阵的逆，但收敛速度可能较慢。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;假设所有关节均为 &lt;strong&gt;铰链关节 (Hinge joint / Revolute joint)&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$a_i$：&lt;/strong&gt; 第 $i$ 个关节的旋转轴向量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$r_i$：&lt;/strong&gt; 从第 $i$ 个关节指向末端执行器 $x$ 的位移向量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当第 $i$ 个关节旋转一个微小角度 $\delta \theta_i$ 时，末端点从 $x$ 移动到 $x&apos;$，其位移向量由罗德里格斯公式给出：
$$
\boldsymbol{x}&apos; - \boldsymbol{x} = (\sin \delta \theta_i) \boldsymbol{a}_i \times \boldsymbol{r}_i + (1 - \cos \delta \theta_i) \boldsymbol{a}_i \times (\boldsymbol{a}_i \times \boldsymbol{r}_i)
$$&lt;/p&gt;
&lt;p&gt;为了得到雅可比矩阵中的第 $i$ 列，对角度取极限：
$$
\frac{\partial f}{\partial \theta_i} = \lim_{\delta \theta_i \to 0} \frac{\boldsymbol{x}&apos; - \boldsymbol{x}}{\delta \theta_i}
$$&lt;/p&gt;
&lt;p&gt;利用泰勒级数展开（当 $\delta \theta_i \to 0$ 时，$\sin \delta \theta_i \approx \delta \theta_i$ 且 $1 - \cos \delta \theta_i \approx 0$）：
$$
\mathbf{\frac{\partial f}{\partial \theta_i} = a_i \times r_i}
$$
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fhinge.BA-gs_oq.png&amp;#x26;w=810&amp;#x26;h=774&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于球关节，个球关节会在雅可比矩阵中占用连续的三列。&lt;br&gt;
设 $f$ 为末端执行器的位置函数，$\boldsymbol{\theta}&lt;em&gt;i = (\theta&lt;/em&gt;{ix}, \theta_{iy}, \theta_{iz})^T$ 为球关节的三个旋转角。该关节对雅可比矩阵的贡献为：
$$
\frac{\partial f}{\partial \boldsymbol{\theta}&lt;em&gt;i} = \begin{bmatrix} \frac{\partial f}{\partial \theta&lt;/em&gt;{ix}} &amp;#x26; \frac{\partial f}{\partial \theta_{iy}} &amp;#x26; \frac{\partial f}{\partial \theta_{iz}} \end{bmatrix}
$$
根据铰链关节的导数公式 $\frac{\partial f}{\partial \theta} = a \times r$，球关节的三列具体为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一列： $a_{ix} \times r_i$ （绕 X 轴旋转产生的瞬时位移）&lt;/li&gt;
&lt;li&gt;第二列： $a_{iy} \times r_i$ （绕 Y 轴旋转产生的瞬时位移）&lt;/li&gt;
&lt;li&gt;第三列： $a_{iz} \times r_i$ （绕 Z 轴旋转产生的瞬时位移）&lt;br&gt;
其中：&lt;br&gt;
$a_{ix}, a_{iy}, a_{iz}$：分别为当前坐标系下三个正交的旋转轴向量。&lt;br&gt;
$r_i$：从球关节中心指向末端执行器 $x$ 的位移矢量。&lt;br&gt;
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fball.Dy48-Ch5.png&amp;#x26;w=1092&amp;#x26;h=470&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
在将球关节拆解为三个铰链关节（绕 $x, y, z$ 轴）时，由于旋转是相继发生的，后面的旋转轴会受到前面旋转的影响。&lt;br&gt;
为了计算雅可比矩阵，我们需要在全局坐标系下确定这三个轴向量：&lt;/li&gt;
&lt;li&gt;第一轴（X轴）
$$
\boldsymbol{a}&lt;em&gt;{ix} = Q&lt;/em&gt;{i-1}\boldsymbol{e}&lt;em&gt;x
$$
直接取前一级关节的全局朝向 $Q&lt;/em&gt;{i-1}$ 作用于标准 $X$ 轴单位向量 $\boldsymbol{e}_x$。&lt;/li&gt;
&lt;li&gt;第二轴（Y轴）：
$$
\boldsymbol{a}&lt;em&gt;{iy} = Q&lt;/em&gt;{i-1}R_{ix}\boldsymbol{e}&lt;em&gt;y
$$
该轴不仅受前一级朝向影响，还受本关节已经发生的 $X$ 轴旋转 $R&lt;/em&gt;{ix}$ 的带动。&lt;/li&gt;
&lt;li&gt;第三轴（Z轴）：
$$
\boldsymbol{a}&lt;em&gt;{iz} = Q&lt;/em&gt;{i-1}R_{ix}R_{iy}\boldsymbol{e}_z
$$
该轴受前一级朝向以及本关节已发生的 $X$ 轴和 $Y$ 轴旋转的双重带动。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高斯-牛顿法 / 雅可比求逆法 (Gauss-Newton / Jacobian Inverse):&lt;/strong&gt;&lt;br&gt;
逆运动学的本质是寻找一组关节角 $\theta$，使得末端位置 $f(\theta)$ 与目标位置 $\widetilde{x}$ 的误差最小。通常定义最小二乘代价函数：
$$
F(\theta) = \frac{1}{2} |f(\theta) - \widetilde{x}|_2^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;高斯-牛顿法 (Gauss-Newton Method)&lt;br&gt;
通过对非线性函数 $f(\theta)$ 进行一阶泰勒展开，将非线性优化转化为线性子问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一阶近似： $f(\theta) \approx f(\theta^0) + J(\theta - \theta^0)$&lt;/li&gt;
&lt;li&gt;代价函数近似： $F(\theta) \approx \frac{1}{2} |f(\theta^0) + J(\theta - \theta^0) - \widetilde{x}|_2^2$&lt;/li&gt;
&lt;li&gt;一阶最优条件 (KKT/正规方程)：
$$
J^T J (\theta - \theta^0) = -J^T \Delta
$$
其中 $\Delta = f(\theta^0) - \widetilde{x}$ 是当前的误差向量。&lt;br&gt;
&lt;strong&gt;局限性&lt;/strong&gt;：如果 $J^T J$ 是不可逆的（通常发生在雅可比矩阵 $J$ 为宽矩阵时，即自由度大于目标空间维度），则无法直接解出 $\theta$。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;雅可比逆方法 (Jacobian Inverse Method)在机器人学中，我们通常面临冗余自由度问题，此时 $J$ 是扁平的。虽然 $J^T J$ 不可逆，但 $JJ^T$ 往往是可逆的。&lt;br&gt;
上式两边同乘 $J$ ，并消去 $JJ^T$ ：
$$
J(\theta - \theta^0) = -\Delta
$$
最终更新公式：
$$
\theta = \theta^0 - J^+ \Delta
$$
其中 $J^+$ 称为 Moore-Penrose 伪逆 (Pseudoinverse)：
$$
\mathbf{J^+ = J^T(JJ^T)^{-1}}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当我们要最小化误差函数 $F(\theta) = \frac{1}{2} |f(\theta) - \widetilde{x}|_2^2$ 时，最常用的迭代更新步长公式为：
$$
\theta = \theta^0 - \alpha J^+ \Delta
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$\alpha$&lt;/strong&gt;：步长（Learning Rate）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\Delta$&lt;/strong&gt;：当前误差向量 $(f(\theta^0) - \widetilde{x})$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$J^+$&lt;/strong&gt;：雅可比矩阵的伪逆。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$J^+$ 的分类讨论：矩阵形态决定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;情况 A：冗余系统 (Underdetermined System)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特征：&lt;/strong&gt; $J$ 是“宽矩阵”（行数 &amp;#x3C; 列数），即机器人的自由度非常多，可以从无数种姿态中达到目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式：&lt;/strong&gt;
$$
J^+ = J^T (JJ^T)^{-1}
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性质：&lt;/strong&gt; 此时 $JJ^T$ 是可逆的。这种解在所有可行解中，能使关节角度的变化量 $|\theta - \theta^0|$ 最小。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;情况 B：超定系统 (Overdetermined System)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特征：&lt;/strong&gt; $J$ 是“长矩阵”（行数 &gt; 列数），通常出现在需要末端同时满足过多约束，而机器人自由度不足时。例如对多个关节的位置都有约束。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式：&lt;/strong&gt;
$$
J^+ = (J^T J)^{-1} J^T
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性质：&lt;/strong&gt; 此时 $J^T J$ 是可逆的。这实际上就是经典最小二乘法的解。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题:&lt;/strong&gt; 当矩阵接近奇异时（例如手臂完全伸直的奇异位形），会导致计算不稳定。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阻尼雅可比求逆法 (Damped Jacobian Inverse):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在标准的伪逆法中，当机器人接近&lt;strong&gt;奇异位姿&lt;/strong&gt;时，雅可比矩阵的逆（或伪逆）会变得趋于无穷大，导致关节跳变。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阻尼法&lt;/strong&gt;通过在目标函数中引入一个“惩罚项”，限制关节旋转幅度，从而确保数值计算的稳定性。&lt;/p&gt;
&lt;p&gt;修改后的目标函数不再仅仅追求末端误差最小，同时要求&lt;strong&gt;关节的变化量也要小&lt;/strong&gt;：
$$
F(\theta) = \frac{1}{2} |f(\theta) - \widetilde{x}|_2^2 + \frac{\lambda}{2} (\theta - \theta^i)^T W (\theta - \theta^i)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一项：&lt;/strong&gt; 末端位置误差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二项 (阻尼项/正则项)：&lt;/strong&gt; 限制 $\theta$ 偏离当前值 $\theta^i$ 的程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\lambda$ (Damping parameter)：&lt;/strong&gt; 阻尼系数。$\lambda$ 越大，动作越平稳但收敛慢；$\lambda$ 越小，越接近标准伪逆法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$W$ (Weight matrix)：&lt;/strong&gt; 权重矩阵（通常是对角阵），用于为不同关节分配不同的重要性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根据矩阵形状的不同，计算公式中加入了阻尼项 $\lambda I$（或 $\lambda W$）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当 $J$ 为宽矩阵 (冗余系统)：&lt;/strong&gt;
$$
J^* = J^T (JJ^T + \lambda I)^{-1}
$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当 $J$ 为长矩阵 (超定系统)：&lt;/strong&gt;
$$
J^* = (J^T J + \lambda I)^{-1} J^T
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 通过加上 $\lambda I$，原本可能由于奇异而导致行列式为 0 的矩阵 $(JJ^T)$ 变得&lt;strong&gt;强制可逆&lt;/strong&gt;，从而避免了数值爆炸。&lt;/p&gt;
&lt;p&gt;在接近极限位置时，机器人会表现得更加“保守”，宁愿保留一点点位置误差，也不愿让关节发生疯狂的瞬间甩动。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>角色动画与运动仿真-数学</title><link>https://astro-pure.js.org/blog/mocca-notes/01</link><guid isPermaLink="true">https://astro-pure.js.org/blog/mocca-notes/01</guid><description>角色动画与运动仿真笔记-01</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;三维向量&lt;/h2&gt;
&lt;h3&gt;叉乘&lt;/h3&gt;
&lt;p&gt;$$\mathbf{c} = \mathbf{a} \times \mathbf{b} = \begin{bmatrix} a_y b_z - a_z b_y \ a_z b_x - a_x b_z \ a_x b_y - a_y b_x \end{bmatrix} \implies \mathbf{c} = \mathbf{a} \times \mathbf{b} = |\mathbf{a}| |\mathbf{b}| \sin(\theta) \mathbf{n}$$&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E5%8F%89%E4%B9%98.ZTvU866u.png&amp;#x26;w=1870&amp;#x26;h=744&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;最小（角度）旋转&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;旋转轴 (Rotation axis):&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\mathbf{u} = \frac{\mathbf{a} \times \mathbf{b}}{|\mathbf{a} \times \mathbf{b}|}
$$&lt;/p&gt;
&lt;p&gt;通过向量 $\mathbf{a}$ 和 $\mathbf{b}$ 的叉乘并归一化，得到垂直于两者所在平面的单位向量作为旋转轴。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;旋转角度 (Rotation angle):&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\theta = \arg \cos \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| |\mathbf{b}|}
$$&lt;/p&gt;
&lt;p&gt;通过向量的点积公式计算出 $\mathbf{a}$ 和 $\mathbf{b}$ 之间的夹角。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E6%9C%80%E5%B0%8F%E6%97%8B%E8%BD%AC.DdnxHO1k.png&amp;#x26;w=888&amp;#x26;h=708&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;罗德里格旋转公式&lt;/h3&gt;
&lt;p&gt;已知单位旋转轴 $\mathbf{u}$ ($|\mathbf{u}| = 1$)，向量 $\mathbf{a}$ 绕该轴旋转角度 $\theta$ 得到向量 $\mathbf{b}$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分量定义：&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$\mathbf{v} = (\sin \theta) \mathbf{u} \times \mathbf{a}$&lt;/li&gt;
&lt;li&gt;$\mathbf{t} = (1 - \cos \theta) \mathbf{u} \times (\mathbf{u} \times \mathbf{a})$&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向量合成：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\mathbf{b} = \mathbf{a} + \mathbf{v} + \mathbf{t}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完整公式：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\mathbf{b} = \mathbf{a} + (\sin \theta) \mathbf{u} \times \mathbf{a} + (1 - \cos \theta) \mathbf{u} \times (\mathbf{u} \times \mathbf{a})
$$
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E7%BD%97%E5%BE%B7%E9%87%8C%E6%A0%BC.B08YYb2J.png&amp;#x26;w=1162&amp;#x26;h=1074&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;叉乘的矩阵形式&lt;/h3&gt;
&lt;p&gt;将向量 $\mathbf{a}$ 与 $\mathbf{b}$ 的叉乘表示为矩阵与向量的乘积：
$$
\mathbf{c} = \mathbf{a} \times \mathbf{b} = \begin{bmatrix} a_y b_z - a_z b_y \ a_z b_x - a_x b_z \ a_x b_y - a_y b_x \end{bmatrix} = \begin{bmatrix} 0 &amp;#x26; -a_z &amp;#x26; a_y \ a_z &amp;#x26; 0 &amp;#x26; -a_x \ -a_y &amp;#x26; a_x &amp;#x26; 0 \end{bmatrix} \begin{bmatrix} b_x \ b_y \ b_z \end{bmatrix} = [\mathbf{a}]_{\times} \mathbf{b}
$$&lt;/p&gt;
&lt;p&gt;由此，我们也可以把罗德里格公式写成如下形式：
$$
\begin{aligned}
\mathbf{b} &amp;#x26;= \left( I + (\sin \theta) [\mathbf{u}]&lt;em&gt;{\times} + (1 - \cos \theta) [\mathbf{u}]&lt;/em&gt;{\times}^2 \right) \mathbf{a} \
&amp;#x26;= R \mathbf{a}
\end{aligned}
$$&lt;/p&gt;
&lt;h3&gt;叉乘的行列式表示法&lt;/h3&gt;
&lt;p&gt;利用标准正交基向量 $\mathbf{i}, \mathbf{j}, \mathbf{k}$，可以将两个 3D 向量的叉乘写成行列式的形式：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\mathbf{c} = \mathbf{a} \times \mathbf{b} &amp;#x26;= \begin{bmatrix} a_y b_z - a_z b_y \ a_z b_x - a_x b_z \ a_x b_y - a_y b_x \end{bmatrix} \
&amp;#x26;= \det \begin{bmatrix} \mathbf{i} &amp;#x26; \mathbf{j} &amp;#x26; \mathbf{k} \ a_x &amp;#x26; a_y &amp;#x26; a_z \ b_x &amp;#x26; b_y &amp;#x26; b_z \end{bmatrix}
\end{aligned}
$$&lt;/p&gt;
&lt;h2&gt;刚体变换&lt;/h2&gt;
&lt;p&gt;指不改变物体形状和大小，只改变其位置和取向的变换。它由以下两种基本变换组合而成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平移:&lt;/strong&gt; 物体沿特定方向移动，所有点的位移矢量相同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;旋转:&lt;/strong&gt; 物体绕空间中某一点或轴线转动。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以用矩阵表示，注意旋转矩阵是正交矩阵，旋转矩阵的行列式始终为 $+1$。如果行列式为 $-1$，则表示包含了一个“镜像反射”，那就不再是纯粹的旋转了。&lt;/p&gt;
&lt;h2&gt;旋转矩阵的特征值与旋转轴&lt;/h2&gt;
&lt;p&gt;旋转矩阵 $R$ 拥有一个实特征值 $+1$。这意味着存在一个向量 $\mathbf{u}$，满足：&lt;/p&gt;
&lt;p&gt;$$
R\mathbf{u} = \mathbf{u}
$$&lt;/p&gt;
&lt;p&gt;换言之，$R$ 可以被看作是绕着轴 $\mathbf{u}$ 旋转了某个角度 $\theta$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;寻找旋转轴 $\mathbf{u}$：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由 $R\mathbf{u} = \mathbf{u}$ 可推导出 $\mathbf{u} = R^T \mathbf{u}$，进而得出：&lt;/p&gt;
&lt;p&gt;$$
(R - R^T)\mathbf{u} = 0
$$&lt;/p&gt;
&lt;p&gt;其中 $(R - R^T)$ 是一个&lt;strong&gt;反对称矩阵 (Skew-symmetric)&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
\begin{bmatrix} 0 &amp;#x26; -(r_{21} - r_{12}) &amp;#x26; r_{13} - r_{31} \ r_{21} - r_{12} &amp;#x26; 0 &amp;#x26; -(r_{32} - r_{23}) \ -(r_{13} - r_{31}) &amp;#x26; r_{32} - r_{23} &amp;#x26; 0 \end{bmatrix} \mathbf{u} = 0
$$&lt;/p&gt;
&lt;p&gt;在 $R \neq R^T$（即 $\sin \theta \neq 0$，角度 $\theta \neq 0^\circ$ 或 $180^\circ$）的情况下，旋转轴 $\mathbf{u}$ 可以通过下式提取：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{u} \leftarrow \mathbf{u}&apos; = \begin{bmatrix} r_{32} - r_{23} \ r_{13} - r_{31} \ r_{21} - r_{12} \end{bmatrix}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;寻找旋转角度 $\theta$：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;结合罗德里格旋转公式：&lt;/p&gt;
&lt;p&gt;$$
R = I + (\sin \theta) [\mathbf{u}]&lt;em&gt;{\times} + (1 - \cos \theta) [\mathbf{u}]&lt;/em&gt;{\times}^2
$$&lt;/p&gt;
&lt;p&gt;$$
R - R^T = 2 \sin \theta [\mathbf{u}]_\times
$$&lt;/p&gt;
&lt;p&gt;当从矩阵中提取出向量 $\mathbf{u}&apos;$ 时，其模长满足：&lt;/p&gt;
&lt;p&gt;$$
|\mathbf{u}&apos;| = 2 \sin \theta
$$&lt;/p&gt;
&lt;p&gt;这为从已知的旋转矩阵 $R$ 中恢复旋转轴和旋转角提供了直接计算方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;利用矩阵的迹 (Trace) 计算旋转角：&lt;/strong&gt;
通过旋转矩阵 $R$ 的迹（主对角线元素之和）可以更直接地计算旋转角度 $\theta$：
$$
\operatorname{tr}(R) = 1 + 2 \cos \theta
$$
$$
\theta = \arccos \frac{\operatorname{tr}(R) - 1}{2}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;旋转的表示方法&lt;/h2&gt;
&lt;h3&gt;朴素矩阵表示&lt;/h3&gt;
&lt;p&gt;一个旋转矩阵 $R$ 包含 9 个参数 $a_{ij}$：&lt;/p&gt;
&lt;p&gt;$$
R = \begin{bmatrix} a_{11} &amp;#x26; a_{12} &amp;#x26; a_{13} \ a_{21} &amp;#x26; a_{22} &amp;#x26; a_{23} \ a_{31} &amp;#x26; a_{32} &amp;#x26; a_{33} \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;约束条件：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于旋转矩阵必须满足正交性 $R^T R = I$ 且行列式 $\det R = 1$，这引入了 6 个独立的约束方程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;列向量为单位向量 (归一化约束):&lt;/strong&gt;
$$
\begin{cases} a_{11}^2 + a_{21}^2 + a_{31}^2 = 1 \ a_{12}^2 + a_{22}^2 + a_{32}^2 = 1 \ a_{13}^2 + a_{23}^2 + a_{33}^2 = 1 \end{cases}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;列向量两两正交 (正交约束):&lt;/strong&gt;
$$
\begin{cases} a_{11}a_{12} + a_{21}a_{22} + a_{31}a_{32} = 0 \ a_{11}a_{13} + a_{21}a_{23} + a_{31}a_{33} = 0 \ a_{12}a_{13} + a_{22}a_{23} + a_{32}a_{33} = 0 \end{cases}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;自由度 (DoF):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$$
9 \text{ (参数)} - 6 \text{ (约束)} = 3
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;朴素矩阵表示的缺点：无法差值，多个旋转组合时可能丢失正交性&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;欧拉角表示&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;基础旋转矩阵 (Basic Rotations):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;绕各轴旋转特定角度的矩阵表示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绕 x 轴旋转 $\alpha$:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
R_x(\alpha) = \begin{pmatrix} 1 &amp;#x26; 0 &amp;#x26; 0 \ 0 &amp;#x26; \cos \alpha &amp;#x26; -\sin \alpha \ 0 &amp;#x26; \sin \alpha &amp;#x26; \cos \alpha \end{pmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绕 y 轴旋转 $\beta$:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
R_y(\beta) = \begin{pmatrix} \cos \beta &amp;#x26; 0 &amp;#x26; \sin \beta \ 0 &amp;#x26; 1 &amp;#x26; 0 \ -\sin \beta &amp;#x26; 0 &amp;#x26; \cos \beta \end{pmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绕 z 轴旋转 $\gamma$:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
R_z(\gamma) = \begin{pmatrix} \cos \gamma &amp;#x26; -\sin \gamma &amp;#x26; 0 \ \sin \gamma &amp;#x26; \cos \gamma &amp;#x26; 0 \ 0 &amp;#x26; 0 &amp;#x26; 1 \end{pmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;旋转组合：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;允许将三个基础旋转以任何顺序组合，但&lt;strong&gt;排除连续两次绕同一轴旋转&lt;/strong&gt;的情况。常见的顺序包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XYZ, XZY, YZX, YXZ, ZYX, ZXY&lt;/li&gt;
&lt;li&gt;XYX, XZX, YXY, YZY, ZXZ, ZYZ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;万向锁:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在欧拉角模型中，物体绕轴转动时，另外两个轴也会随着物体转动，可以理解为轴和物体之间并没有发生任何相对运动。&lt;/li&gt;
&lt;li&gt;首先假设我们按照 x-y-z 的顺序旋转物体，那么如果沿 y 轴旋转时，转动的角度恰好为 90°，此时发生万向锁现象，接下来你再如何转动 z 轴，所产生的效果和一开始转动 x 轴是一样的。&lt;/li&gt;
&lt;li&gt;这是由于你转 y 轴的时候，物体的 z 轴也跟着旋转了 90°，正好把 z 轴转到了初始时 x 轴上，也就是此时 z 轴的方向与初始 x 轴的方向重合，所以接下来沿 z 轴的转动等价于初始时沿 x 轴的转动。&lt;/li&gt;
&lt;li&gt;为什么强调“初始时”，显然是因为此时 x 轴也被 y 轴带着转了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;干着讲太抽象了，建议配合视频理解这玩意，或者可以在这个&lt;a href=&quot;https://quaternions.online/&quot;&gt;欧拉角可视化网站&lt;/a&gt;上自己模拟一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;欧拉角表示的缺点：无法解决万向锁的问题&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;轴角表示&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;轴角 $(\mathbf{u}, \theta)$:&lt;/strong&gt; 使用以下两个分量表示旋转：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向量 $\mathbf{u}$:&lt;/strong&gt; 旋转轴。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标量 $\theta$:&lt;/strong&gt; 旋转角度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;旋转向量 (Rotation vector):&lt;/strong&gt; 将旋转表示为一个单一向量 $\boldsymbol{\theta}$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\boldsymbol{\theta} = \theta \mathbf{u}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;显而易见的关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旋转角度等于向量的模长：$\theta = |\boldsymbol{\theta}|$&lt;/li&gt;
&lt;li&gt;旋转轴等于向量的单位化：$\mathbf{u} = \frac{\boldsymbol{\theta}}{|\boldsymbol{\theta}|}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;插值（角速度恒定）：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;计算两个旋转向量之间的相对旋转矩阵：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
R(\delta \boldsymbol{\theta}) = R^T(\boldsymbol{\theta}_0)R(\boldsymbol{\theta}_1)
$$&lt;/p&gt;
&lt;p&gt;其中 $\boldsymbol{\theta}_0 = \theta_0 \mathbf{u}_0$，$\boldsymbol{\theta}_1 = \theta_1 \mathbf{u}_1$ 分别为起始和目标旋转向量。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;对旋转向量的变化量进行线性插值：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
\delta \boldsymbol{\theta}_t = (1 - t)\mathbf{0} + t\delta \boldsymbol{\theta}
$$&lt;/p&gt;
&lt;p&gt;这里通过对相对旋转向量 $\delta \boldsymbol{\theta}$ 进行缩放来实现平滑过渡。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;合成插值后的旋转矩阵：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
R(\boldsymbol{\theta}_t) = R(\boldsymbol{\theta}_0)R(\delta \boldsymbol{\theta}_t)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;轴角表示的缺点：需要转换成矩阵形式再应用&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;四元数表示&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;四元数:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;四元数是复数的扩展，定义在集合 $\mathbb{H}$ 上：&lt;/p&gt;
&lt;p&gt;$$
q = a + b\mathbf{i} + c\mathbf{j} + d\mathbf{k} \in \mathbb{H}, \quad a, b, c, d \in \mathbb{R}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本运算规则：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本恒等式:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
i^2 = j^2 = k^2 = -1
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单位向量的乘法（类似于叉乘）:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$ij = k, \quad ji = -k$&lt;/li&gt;
&lt;li&gt;$jk = i, \quad kj = -i$&lt;/li&gt;
&lt;li&gt;$ki = j, \quad ik = -j$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;四元数的向量表示：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;四元数 $q$ 可以表示为标量部分 $w$ 和向量部分 $\mathbf{v}$ 的组合：&lt;/p&gt;
&lt;p&gt;$$
q = w + x\mathbf{i} + y\mathbf{j} + z\mathbf{k} \Rightarrow q = \begin{bmatrix} w \ x \ y \ z \end{bmatrix} = \begin{bmatrix} w \ \mathbf{v} \end{bmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$q = [w, \mathbf{v}]^T \in \mathbb{H}, \quad w \in \mathbb{R}, \mathbf{v} \in \mathbb{R}^3$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标量四元数:&lt;/strong&gt; $w = [w, \mathbf{0}]^T$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纯四元数:&lt;/strong&gt; $\mathbf{v} = [0, \mathbf{v}]^T$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;基本运算：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共轭:&lt;/strong&gt; $q^* = [w, -\mathbf{v}]^T$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数乘:&lt;/strong&gt; $tq = [tw, t\mathbf{v}]^T$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加法:&lt;/strong&gt; $q_1 + q_2 = [w_1 + w_2, \mathbf{v}_1 + \mathbf{v}_2]^T$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点积:&lt;/strong&gt; $q_1 \cdot q_2 = w_1 w_2 + \mathbf{v}_1 \cdot \mathbf{v}_2$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范数:&lt;/strong&gt; $|q| = \sqrt{w^2 + \mathbf{v} \cdot \mathbf{v}} = \sqrt{q \cdot q}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;四元数乘法:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$$
q_1 q_2 = \begin{bmatrix} w_1 \ \mathbf{v}_1 \end{bmatrix} \begin{bmatrix} w_2 \ \mathbf{v}_2 \end{bmatrix} = \begin{bmatrix} w_1 w_2 - \mathbf{v}_1 \cdot \mathbf{v}_2 \ w_1 \mathbf{v}_2 + w_2 \mathbf{v}_1 + \mathbf{v}_1 \times \mathbf{v}_2 \end{bmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非交换性:&lt;/strong&gt; $q_1 q_2 \neq q_2 q_1$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结合律:&lt;/strong&gt; $q_1 q_2 q_3 = (q_1 q_2) q_3 = q_1 (q_2 q_3)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;乘积的共轭:&lt;/strong&gt; $(q_1 q_2)^* = q_2^* q_1^*$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范数与乘法:&lt;/strong&gt; $|q|^2 = q^* q = q q^*$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;逆与单位四元数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;倒数/逆:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
q q^{-1} = 1 \Rightarrow q^{-1} = \frac{q^*}{|q|^2}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单位四元数:&lt;/strong&gt;
对于任何非零四元数 $\tilde{q}$，其归一化形式为 $q = \frac{\tilde{q}}{|\tilde{q}|}$，满足 $|q| = 1$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单位四元数的逆:&lt;/strong&gt;
对于单位四元数，$q^{-1} = q^* = \begin{bmatrix} w \ -\mathbf{v} \end{bmatrix}$。这类似于旋转矩阵的正交性 $R^{-1} = R^T$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;四元数表示旋转：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;任何三维旋转 $(\mathbf{u}, \theta)$ 都可以用一个&lt;strong&gt;单位四元数&lt;/strong&gt; 来表示：&lt;/p&gt;
&lt;p&gt;$$
q = \begin{bmatrix} w \ \mathbf{v} \end{bmatrix} = \begin{bmatrix} \cos \frac{\theta}{2} \ \mathbf{u} \sin \frac{\theta}{2} \end{bmatrix}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;角度:&lt;/strong&gt; $\theta = 2 \arg \cos w$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轴:&lt;/strong&gt; $\mathbf{u} = \frac{\mathbf{v}}{|\mathbf{v}|}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;应用旋转:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于三维向量 $\mathbf{p}$，其旋转结果 $\mathbf{p}&apos;$ 可以通过&lt;strong&gt;四元数乘法&lt;/strong&gt;计算：&lt;/p&gt;
&lt;p&gt;$$
\begin{bmatrix} 0 \ \mathbf{p}&apos; \end{bmatrix} = q \begin{bmatrix} 0 \ \mathbf{p} \end{bmatrix} q^* = (-q) \begin{bmatrix} 0 \ \mathbf{p} \end{bmatrix} (-q)^*
$$&lt;/p&gt;
&lt;p&gt;注意 $q$ 和 $-q$ 表示相同的旋转。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;复合旋转：&lt;/strong&gt;
已知两个单位四元数 $q_1, q_2$，它们的复合旋转可以表示为：
$$
q = q_2 q_1
$$&lt;/p&gt;
&lt;h3&gt;球面线性插值&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;基本定义：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;球面线性插值用于在两个单位四元数 $q_0$ 和 $q_1$ 之间进行平滑过渡，插值结果 $q_t$ 依然保持在单位球面上。其基本形式为：&lt;/p&gt;
&lt;p&gt;$$
q_t = a(t)q_0 + b(t)q_1
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公式推导：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设 $p$ 和 $q$ 为两个单位四元数，它们之间的夹角为 $\theta$，满足 $\cos \theta = p \cdot q$。插值向量 $r$ 位于它们构成的平面内：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;投影关系：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;$p \cdot r = a(t)p \cdot p + b(t)q \cdot p \Rightarrow \cos t\theta = a(t) + b(t) \cos \theta$&lt;/li&gt;
&lt;li&gt;$q \cdot r = a(t)q \cdot p + b(t)q \cdot q \Rightarrow \cos(1 - t)\theta = a(t) \cos \theta + b(t)$&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;系数解得：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$$
a(t) = \frac{\sin[(1 - t)\theta]}{\sin \theta}, \quad b(t) = \frac{\sin t\theta}{\sin \theta}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终公式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$$
q_t = \frac{\sin[(1 - t)\theta]}{\sin \theta} q_0 + \frac{\sin t\theta}{\sin \theta} q_1
$$&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>数值分析-误差</title><link>https://astro-pure.js.org/blog/numerical-analysis-notes/01</link><guid isPermaLink="true">https://astro-pure.js.org/blog/numerical-analysis-notes/01</guid><description>数值分析笔记-01</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;误差&lt;/h2&gt;
&lt;h3&gt;误差的来源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模型误差：数学模型与实际问题之间的误差&lt;/li&gt;
&lt;li&gt;观测误差：观察模型参数值产生的误差&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截断误差：也称方法误差，数值方法计算的误差&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;舍入误差：计算过程中取有限位数字引起的误差&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;绝对误差、相对误差&lt;/h3&gt;
&lt;p&gt;设 $x$ 是某实数的精确值，$\tilde{x}$ 是它的一个近似值。那么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;绝对误差：$e(x) = |x - \tilde{x}|$&lt;/li&gt;
&lt;li&gt;相对误差：$e_r = \frac{e(x)}{|x|}$ ($x \neq 0$)&lt;/li&gt;
&lt;li&gt;绝对误差限：若 $|x - \tilde{x}| \leq \varepsilon$，则称 $\varepsilon$ 是 $\tilde{x}$ 的绝对误差限&lt;/li&gt;
&lt;li&gt;相对误差限：称 $\varepsilon_r = \frac{\varepsilon}{|x|}$ ($x \neq 0$) 为近似值 $\tilde{x}$ 的相对误差限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于 $x$ 一般未知，常用 $e_r = \frac{e(x)}{|\tilde{x}|}$ 来表示相对误差，用 $\varepsilon_r = \frac{\varepsilon}{|\tilde{x}|}$ 表示相对误差界。&lt;/p&gt;
&lt;h3&gt;有效数字&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;若近似值 $\tilde{x}$ 的误差限小于其某一位的半个单位，该位到 $\tilde{x}$ 的第一位非零数字共有 $n$ 位，则 $\tilde{x}$ 有 $n$ 位有效数字。&lt;/li&gt;
&lt;li&gt;设 $\tilde{x}$ 是 $x$ 的一个近似值，将 $\tilde{x}$ 写成规范形式：
$$
\tilde{x} = \pm 0.a_1 a_2 \dots a_i \dots \times 10^m
$$
其中：$m$ 为整数。$a_i \in {0, 1, 2, \dots, 9}$，且 $a_1 \neq 0$。如果有：
$$
|x - \tilde{x}| \leq 0.5 \times 10^{m-n}
$$
则称 $\tilde{x}$ 为 $x$ 的具有 $n$ 位有效数字的近似值。&lt;/li&gt;
&lt;li&gt;$\tilde{x}$ 的误差限小于其某一位的半个单位，该位到 $\tilde{x}$ 的第一位非零数字共有 $n$ 位，则 $\tilde{x}$ 有 $n$ 位有效数字。&lt;/li&gt;
&lt;li&gt;有效数字与相对误差的关系。&lt;br&gt;
已知有效数字为 $n$，估计相对误差的公式为：
$$
\frac{|\tilde{x} - x|}{|\tilde{x}|} \le \frac{1}{2a_1} \times 10^{-(n-1)}
$$
反之，若满足以下条件：
$$
\frac{|\tilde{x} - x|}{|\tilde{x}|} \le \frac{1}{2(a_1 + 1)} \times 10^{-(n-1)}
$$
则至少具有 $n$ 位有效数字。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;运算误差分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;问题：设 $\tilde{x}$ 是自变量 $x$ 的一个近似值，误差界为 $\varepsilon(\tilde{x})$。利用 $f(\tilde{x})$ 近似 $f(x)$ 的误差界为 $\varepsilon(f(\tilde{x}))$，试估计 $\varepsilon(f(\tilde{x}))$&lt;/li&gt;
&lt;li&gt;由 Taylor 展开可知：
$$
f(x) - f(\tilde{x}) = f&apos;(\tilde{x})(x - \tilde{x}) + \frac{f&apos;&apos;(\xi)}{2!}(x - \tilde{x})^2
$$
由此可得绝对误差的估计：
$$
|f(x) - f(\tilde{x})| \leq |f&apos;(\tilde{x})\varepsilon(\tilde{x})| + \frac{|f&apos;&apos;(\xi)|}{2!}\varepsilon(\tilde{x})^2
$$
忽略 $\varepsilon(\tilde{x})$ 的高阶项可得函数的误差为：
$$
\varepsilon(f(\tilde{x})) \approx |f&apos;(\tilde{x})| \varepsilon(\tilde{x})
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;推论：&lt;/strong&gt;
$n$ 元函数的误差估计对于 $n$ 元函数 $f(x_1, x_2, \dots, x_n)$，$\tilde{x}_1, \tilde{x}_2, \dots, \tilde{x}_n$ 分别是自变量 $x_1, x_2, \dots, x_n$ 的近似值，则有：
$$
\begin{aligned}
\varepsilon(f(\tilde{x}_1, \tilde{x}_2, \dots, \tilde{x}_n)) &amp;#x26;= |f(\tilde{x}&lt;em&gt;1, \tilde{x}&lt;em&gt;2, \dots, \tilde{x}&lt;em&gt;n) - f(x_1, x_2, \dots, x_n)| \
&amp;#x26;\approx \sum&lt;/em&gt;{k=1}^n \left| \left( \frac{\partial f}{\partial x_k} \right)&lt;/em&gt;{\tilde{x}} \right| \varepsilon(\tilde{x}&lt;em&gt;k)
\end{aligned}
$$
其中：
$$
\left( \frac{\partial f}{\partial x_k} \right)&lt;/em&gt;{\tilde{x}} = \left. \frac{\partial}{\partial x_k} f(x_1, x_2, \dots, x_n) \right|&lt;/em&gt;{x_1, x_2, \dots, x_n = \tilde{x}_1, \tilde{x}_2, \dots, \tilde{x}_n}
$$&lt;/p&gt;
&lt;p&gt;特别地：&lt;/p&gt;
&lt;p&gt;$$
\varepsilon(\tilde{x}_1 \pm \tilde{x}_2) \approx \varepsilon(\tilde{x}_1) + \varepsilon(\tilde{x}_2)
$$
$$
\varepsilon(\tilde{x}_1 \cdot \tilde{x}_2) \approx |\tilde{x}_1| \varepsilon(\tilde{x}_2) + |\tilde{x}_2| \varepsilon(\tilde{x}_1)
$$&lt;/p&gt;
&lt;h3&gt;病态问题&lt;/h3&gt;
&lt;p&gt;对于数学问题本身，如果输入数据有微小扰动，引起问题的解有很大扰动，则称该问题是&lt;strong&gt;病态问题&lt;/strong&gt;。非病态的问题称为&lt;strong&gt;良态问题&lt;/strong&gt;。
病态和良态是&lt;strong&gt;相对的&lt;/strong&gt;，没有严格的界线。&lt;br&gt;
当数学问题的解的相对误差与输入数据的相对误差之比的绝对值&lt;strong&gt;远远大于1&lt;/strong&gt;时，常常就
认为该问题是病态的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相对误差的比值：&lt;/strong&gt;
$$
\frac{\varepsilon_r(f(\tilde{x}))}{\varepsilon_r(\tilde{x})} = \frac{\varepsilon(f(\tilde{x}))}{|f(\tilde{x})| \varepsilon_r(\tilde{x})} \approx \frac{|f&apos;(\tilde{x})| \varepsilon(\tilde{x})}{|f(\tilde{x})| \varepsilon_r(\tilde{x})} = \left| \frac{f&apos;(\tilde{x})\tilde{x}}{f(\tilde{x})} \right| = C_p
$$
其中，$C_p$ 称为条件数。判定标准：通常认为当 条件数 $C_p \ge 10$ 时，该计算问题是病态的。&lt;/p&gt;
&lt;h3&gt;数值稳定性&lt;/h3&gt;
&lt;p&gt;对于某个数值计算方法，如果输入数据的误差在计算过程中迅速增长而得不到控制，则称该算法是&lt;strong&gt;数值不稳定&lt;/strong&gt;的，否则是&lt;strong&gt;数值稳定&lt;/strong&gt;的。&lt;/p&gt;
&lt;p&gt;更准确地说，假设一个算法有初始误差 $\varepsilon_0 &gt; 0$，它引起此后运算 $n$ 步的误差是 $\varepsilon_n$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;线性型增长&lt;/strong&gt;：如果 $\varepsilon_n \approx C n \varepsilon_0$（其中 $C$ 是与 $n$ 无关的常数），则称误差的增长是&lt;strong&gt;线性型&lt;/strong&gt;的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指数型增长&lt;/strong&gt;：如果 $\varepsilon_n \approx C^n \varepsilon_0$，则称误差的增长是&lt;strong&gt;指数型&lt;/strong&gt;的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数值计算的基本原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;防止大数吃小数。&lt;br&gt;
用三位十进制数字计算：
$$
x = 101 + \delta_1 + \delta_2 + \dots + \delta_{100}
$$
其中 $0.1 \le \delta_i \le 0.4$，$i = 1, 2, \dots, 100$。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;避免两个相近的数字相减。&lt;br&gt;
常用公式：
$$
\frac{1 - \cos x}{\sin x} = \frac{\sin x}{1 + \cos x}
$$
$$
\sqrt{x+1} - \sqrt{x} = \frac{1}{\sqrt{x+1} + \sqrt{x}}
$$
$$
\log x_1 - \log x_2 = \log \frac{x_1}{x_2}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;简化计算步骤，减少运算次数。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;快速幂运算：求 $x^{255}$。
$$
x^{255} = x \cdot x^2 \cdot x^4 \cdot x^8 \cdot x^{16} \cdot x^{32} \cdot x^{64} \cdot x^{128}
$$&lt;/li&gt;
&lt;li&gt;秦九韶算法：给定 $x$，计算多项式 $P(x) = a_n x^n + a_{n-1} x^{n-1} + \dots + a_1 x + a_0$。将多项式改写为嵌套形式：
$$
P(x) = (\dots((a_n x + a_{n-1})x + a_{n-2})x + \dots + a_1)x + a_0
$$&lt;/li&gt;
&lt;li&gt;级数展开的选择：计算 $\ln 2$。利用级数
$$
\ln \frac{1+x}{1-x} = 2 \left( x + \frac{x^3}{3} + \frac{x^5}{5} + \dots \right)
$$
取 $x = \frac{1}{3}$：只需计算 前 5 项，即可精确到 $10^{-5}$。计算前 10 项，截断误差小于 $10^{-10}$。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;控制误差的传播。
计算积分 $I_n = \int_0^1 \frac{x^n}{x+5} dx, \quad n = 0, 1, \dots, 6$&lt;br&gt;
递推公式：
$$
I_n + 5I_{n-1} = \int_0^1 \frac{x^n + 5x^{n-1}}{x+5} dx = \int_0^1 x^{n-1} dx = \frac{1}{n}
$$&lt;/p&gt;
&lt;p&gt;| 计算方法 | 递推公式 | 误差传播特性 |
| --- | --- | --- |
| &lt;strong&gt;方法 A&lt;/strong&gt; (正向) | $I_n = \frac{1}{n} - 5I_{n-1}$ | 误差被放大 5 倍，迅速爆炸 |
| &lt;strong&gt;方法 B&lt;/strong&gt; (反向) | $I_{n-1} = \frac{1}{5} \left( \frac{1}{n} - I_n \right)$ | 误差被缩小为 1/5，趋于稳定 |&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>从零开始的校园网串流指南</title><link>https://astro-pure.js.org/blog/pku-streaming</link><guid isPermaLink="true">https://astro-pure.js.org/blog/pku-streaming</guid><description>平板最有用的一集</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;主播实在忍受不了游戏本的超级重量与超级垃圾续航，正巧25年暑假购入了一台平板，机缘巧合下刷到了局域网串流的介绍视频，发现校园网环境下可以进行串流，配置好后可以把笔记本放宿舍当台式吃灰，每天只用带着平板出门就可以享受电脑操作系统的使用体验，近乎无限的续航。
本指南写于26年1月，主播重装系统后从零开始进行串流配置，结合第一次配置的种种踩坑经历，整理出了一套最简单的方案，希望能帮后来者节省一些时间🥰。&lt;/p&gt;
&lt;p&gt;本指南的配置方案基于视频&lt;a href=&quot;https://www.bilibili.com/video/BV13i421r7Ff&quot;&gt;【串流教程】全网最好的串流教程，没有之一&lt;/a&gt;，并结合了p大校园网环境进行改进。推荐各位先看一眼视频。当然如果你懒得看视频，也可以直接看下面正文当省流。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;工具介绍&lt;/h2&gt;
&lt;p&gt;选择&lt;code&gt;sunshine&lt;/code&gt; + &lt;code&gt;moonlight&lt;/code&gt;经典日月组合，这里主播以&lt;code&gt;基地版 sunshine&lt;/code&gt;和&lt;code&gt;威力加强版 moonlight&lt;/code&gt;为例介绍。它们都属于第三方魔改版，有一些原版没有的功能。基地版自带虚拟显示屏，安装后电脑会有一个虚拟显示屏，实际通过这块“屏幕”进行串流，这样可以关闭物理显示屏的输出，再也不用担心室友窥屏啦😛。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/qiin2333/foundation-sunshine&quot;&gt;基地版 sunshine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/qiin2333/moonlight-vplus&quot;&gt;威力加强版 moonlight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;校园网相关&lt;/h2&gt;
&lt;p&gt;p大校园网存在子网隔离。如果服务端和客户端同时连接PKU Secure，那么两台设备在不同子网段是不能连接的。体现为 PC 和平板同时在宿舍里可以成功串流，但是把平板拿到教学楼就不行了。这也是大部分人（包括一开始的主播）串流失败的原因。~~本文完结。~~ 而我们的 PC 可以通过插网线或通过宿舍的路由器联网，来解决这个问题。主播采用的是路由器方案，具体方案请往下看。&lt;/p&gt;
&lt;h2&gt;服务端配置（你的PC）&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/qiin2333/foundation-sunshine/releases&quot;&gt;基地版 sunshine 下载&lt;/a&gt;。注意勾选安装虚拟显示器，有个虚拟麦克风看个人，可装可不装。&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;在网络一栏，这两个选项如图设置：
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fsunshine%E7%BD%91%E7%BB%9C.DEnURx9U.png&amp;#x26;w=1280&amp;#x26;h=800&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
虚拟显示器里面，把你客户端的显示器分辨率和刷新率加进来，主播的 MatePad 分辨率是 2800 * 1840。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fsunshine%E8%99%9A%E6%8B%9F%E5%B1%8F.CnyVlmdc.png&amp;#x26;w=1280&amp;#x26;h=800&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;客户端配置（你的移动设备）&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/qiin2333/moonlight-vplus/releases&quot;&gt;威力加强版 moonlight 下载&lt;/a&gt;。下载 apk 并无视风险继续安装。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fmoonlight%E5%AE%89%E8%A3%85.C2KaQ62W.jpg&amp;#x26;w=2800&amp;#x26;h=1840&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;客户端这块不需要太多设置，等着配对就行。先往下看：&lt;/p&gt;
&lt;h2&gt;路由器设置&lt;/h2&gt;
&lt;p&gt;以小米路由器为例，进入路由器设置页面，找到 UPnP 设置并开启。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E8%B7%AF%E7%94%B1%E5%99%A8.BkP1XnOJ.png&amp;#x26;w=2560&amp;#x26;h=1279&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
连网线的话，可以跳过这一步。&lt;/p&gt;
&lt;h2&gt;配对&lt;/h2&gt;
&lt;p&gt;最关键的一步，决定你的串流能否成功！&lt;/p&gt;
&lt;p&gt;核心在于使用学校提供给电脑的 ip 地址。&lt;/p&gt;
&lt;p&gt;在电脑上打开&lt;a href=&quot;https://its.pku.edu.cn/&quot;&gt;北京大学网络服务&lt;/a&gt;，查看 ip 地址：
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fits.D0f5Nip6.jpg&amp;#x26;w=2800&amp;#x26;h=1840&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
然后在 moonlight 上输入这个 ip 进行查找。查找到后就可以进行配对啦：
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fmoonlight%E9%85%8D%E5%AF%B9.0svJzr_S.jpg&amp;#x26;w=2800&amp;#x26;h=1840&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
输入 PIN 码即可。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2Fsunshine%E9%85%8D%E5%AF%B9.LVKAkHwE.png&amp;#x26;w=1280&amp;#x26;h=800&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;
至此，你已经成功完成了串流，并且人在教学楼也可以连上在宿舍的电脑了🎉。&lt;/p&gt;
&lt;h2&gt;个性化&lt;/h2&gt;
&lt;p&gt;最后列一下个人觉得比较有用的小设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;平板用的键盘上面不一定支持 win 键，启用这个设置可以让你在平板也可以输入 win 键。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E4%B8%AA%E6%80%A7%E5%8C%961.CyexGRvG.png&amp;#x26;w=1280&amp;#x26;h=800&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启用鼠标侧键，极大提高刷网页的体验。主播表示离开侧键已经完全不会用电脑或打游戏了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适合远程桌面的的鼠标模式。开启这个后鼠标好像会更跟手一点，暂时不知道啥原理，但还是开着吧。
&lt;img src=&quot;https://astro-pure.js.org/_image?href=%2F_astro%2F%E4%B8%AA%E6%80%A7%E5%8C%962.G5aDKJ_w.jpg&amp;#x26;w=2800&amp;#x26;h=1840&amp;#x26;f=webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>