---
name: linear-algebra
description: >
  Solve linear-algebra problems with very detailed, exam-style step-by-step
  derivations, verify every computation exactly with SymPy, and render the answer
  as a single self-contained offline HTML file with typeset math (MathJax) and
  visualizations (interactive Canvas linear-transform animations, Plotly 3D, and
  static matplotlib figures). Use whenever the user asks a linear-algebra
  question — matrices, RREF/Gaussian elimination, rank, determinants, inverses,
  systems Ax=b, vector spaces / subspaces / basis / null & column space,
  linear independence, eigenvalues & eigenvectors, characteristic polynomial,
  diagonalization, Gram-Schmidt / orthogonalization, projections, change of
  basis, quadratic forms — or asks to "render it as HTML" / wants visualizations.
---

# Linear Algebra — 详细解答 + 精确验证 + 离线 HTML

服务于线代题的**非常详细、理论/考试向**解答：每一步推导都写清楚，所有数字经
**SymPy 精确（分数）验证**，最后产出**单文件、离线自包含**的 HTML（MathJax 排版 +
交互/静态可视化）。本机 GitHub 与多数 CDN 被墙，所以一切库都已 vendored 并在生成时
inline 进文件——无需联网、无需 Node。

**Python 解释器固定用**：`/intern9/huhongkai/miniconda3/bin/python`
（裸 `python` 不一定指向装了 sympy/matplotlib 的环境）。脚本都在本 skill 的
`scripts/` 下。

## 答题铁律

1. **绝不手算糊弄数字。** 任何 RREF、行列式、逆、特征值、对角化、Gram–Schmidt、
   解方程组的结果，都先用 `la_solve.py` 跑出来，把它返回的 `steps` 用进最终解答。
   手写的只能是「思路、定义、定理、直觉」，**数值与符号结果以 SymPy 为准**。
2. **讲透，不跳步。** 面向考试/理论：先点明用到的定义与定理（写进 `callout`），
   再给逐行变换/逐步推导，最后给结论并做一次自检（如 $A=PDP^{-1}$ 回代、
   秩-零化度定理、$\det$ 与特征值之积一致）。
3. **可视化按需上**（交互 + 静态结合）：能让读者「看见」的概念就配图。
4. **输出中文**，公式用 LaTeX（`$...$` 行内，`$$...$$` 独立）。
5. 生成 HTML 后，**报告文件绝对路径**给用户，并一句话说它自包含可离线打开。

## 工具链

### 1) `la_solve.py` — 精确分步引擎（验证backbone）
每个函数返回 `{"result", "latex", "steps":[{"text","latex"}, ...]}`，
`steps` 可**原样**塞进 build_html 的 `steps` 块。库用法：

```python
import sys; sys.path.insert(0, "<skill>/scripts")
import la_solve as la
r = la.eigen_steps([[2,1],[0,3]])      # r["steps"] -> 直接进 HTML
```

可用：`rref_steps · rank_nullspace · det_steps · inverse_steps · charpoly_steps ·
eigen_steps · diagonalize_steps · gram_schmidt_steps · solve_system_steps`。
CLI 速查：`python la_solve.py eig "[[2,1],[0,3]]"`（命令同函数名去掉 `_steps`）。

### 2) `la_plot.py` — 静态 matplotlib 图（返回 base64 data-uri）
`plot_vectors · plot_projection · plot_transform · plot_eigen`。
用于「冻住更清楚」的图：投影与垂直分量、单位正方形→平行四边形（$\det$=面积）、
特征方向不变直线。返回值直接做 `figure` 块的 `src`。

### 3) `build_html.py` — 单文件 HTML 生成器
吃一个 doc spec（dict / JSON），inline 该用的库后写出 `.html`：

```python
import build_html
build_html.render(doc, "/abs/path/answer.html")
```

**doc spec**：
```json
{"title":"...", "subtitle":"可选(常放题目矩阵)", "blocks":[ ...块... ]}
```
**块类型**：
- 纯字符串 或 `{"type":"md","content":"markdown+$公式$"}` — 正文（支持 **粗体**、列表、表格、引用）
- `{"type":"callout","style":"definition|theorem|lemma|note|warning|example|proof","title":"可选","content":"..."}`
- `{"type":"steps","title":"...","steps":[{"text","latex"}]}` — **直接放 la_solve 的 steps**
- `{"type":"figure","src":"<data-uri>","caption":"..."}` — 静态图
- `{"type":"transform2d","matrix":[[a,b],[c,d]],"eigenvectors":[[..],[..]],"labels":{"i":"Ae_1","j":"Ae_2"},"caption":"..."}`
  — 交互 Canvas：滑块从 $I$ 插值到 $A$，看网格形变、基向量、特征不变直线、实时 $\det$。**最适合 2×2 变换 / 特征值 / 基变换**。
- `{"type":"plot3d","data":[<plotly traces>],"layout":{...},"caption":"..."}`
  — 交互 Plotly 3D（仅此块出现时才 inline 那 4.5MB），用于 3D 向量/平面/特征基。

### 可视化选型
- 2×2 变换、特征值几何意义、剪切/旋转/缩放、基变换 → **transform2d**（交互）
- 3D 向量组、平面/超平面、3×3 特征基 → **plot3d**（交互）
- 正交投影、$\det$=面积/体积、固定示意 → **plot_*** 静态图
- 二者结合：核心概念给交互，辅助示意给静态。

## 标准流程（每道题）

1. 读题 → 判定类型，想清要点明哪些**定义/定理**。
2. 跑 `la_solve` 得精确 `steps` 与结果；必要时跑 `la_plot` / 构造 plotly data。
3. 组 doc：开头 `callout` 摆定义定理 → `steps` 给推导 → 可视化 → 结尾自检与小结
   （`callout note/example`）。可加「易错点」`callout warning`。
4. `build_html.render(doc, out)` → 把绝对路径回给用户。

## 最小可运行示例
见 `scripts/example.py`（求 `[[2,1],[0,3]]` 的特征值+对角化，含交互变换图与静态特征图，
端到端生成 HTML）。新题照它改 `doc` 即可。
