工具箱、符號計算與可信的二維/三維圖形
先修內容為 L05–L07、初等微積分,以及 L02 和 L04。配套文件為 labs/lab08_fitting_grid.m、labs/lab08_symbolic.m、labs/inspect_capabilities.m 和 labs/render_math2221_figures.m。
1. 工具箱是一項能力依賴,不是數學依據
基礎 MATLAB 提供許多數值和繪圖操作。工具箱增加專門的函數與數據類型。名稱相似的第三方包或 Octave 包未必具有相同接口、算法、許可證或輸出。“採用 MATLAB 語法編寫”和“在所需 MATLAB 環境中成功執行”是不同的結論。
實驗前可使用能力表:
| 任務 | 接口示例 | 依賴邊界 |
|---|---|---|
| 算術、陣列、邏輯、循環 | .*、size、if、for | 基礎語言/數值環境 |
| 線性最小二乘 | X\y | 基礎數值環境;仍需秩假設 |
| 多項式擬合/求值 | polyfit、polyval | 基礎 MATLAB;不因此要求擁有 Curve Fitting Toolbox |
| 網格和曲線圖形 | meshgrid、surf、contour、plot3 | 基礎 MATLAB 加可正常工作的圖形後端以渲染圖形 |
| 精確符號表達式 | 對符號輸入使用 sym、syms、diff、int、solve | MATLAB 中需要 Symbolic Math Toolbox;Octave 可能需要不同配置/接口 |
| 專門統計/優化例程 | 取決於所選任務 | 查閱該例程官方產品文檔 |
“工具箱”這一寬泛術語本身不指定必須安裝的產品清單,也不授權安裝。應確定依賴、檢查已有能力、在獲得授權且可用時運行小型已知答案測試,並保留可靠的替代方案或受阻狀態。
2. 已安裝、可解析、獲許可和可工作是不同狀態
version 標識當前運行環境;ver 提供已安裝產品/版本信息;which name -all 有助於發現遮蔽目標函數的同名本地函數。避免將學生文件命名為 sum.m、polyfit.m 或 sym.m;遮蔽可能在不改變其他腳本文本的情況下改變其行為。參見官方 ver 和 which 參考。
路徑上找到函數,並不能證明其許可證可檢出或其引擎能初始化。在 MATLAB 中,license('test',feature) 檢查某功能許可證是否存在,但它不是完整的功能測試;後續操作仍可能失敗。不要公開原始許可證報告:它可能暴露與數學可複現性無關的標識。只記錄需要的運行環境/產品版本和通過/失敗狀態。參見 license。
配套能力函數記錄安全的產品名稱/版本以及相關函數是否可解析;它不激活產品、不安裝包,也不更改許可證。可選符號實驗針對 MATLAB;若檢測到 Octave,則返回 skipped。在 MATLAB 中僅當 sym 可解析時才嘗試已知答案計算;結果狀態分別為 skipped、passed 或 failed。不可用的可選示例絕不能計作通過的計算。
3. 曲線擬合接口例題:系數有順序
與 L02 和 L07 相同的三個觀測給出最小二乘直線 。多項式擬合接口通常按冪次遞減存儲系數,而不是截距在前:
t = [0;1;2]; y = [1;2;2];
p = polyfit(t,y,1);
yhat = polyval(p,t);
assert(norm(p-[1/2 7/6],inf) < 1e-12);
assert(norm(yhat-(7/6+t/2),inf) < 1e-12);
這裏 p(1) 是斜率,p(2) 是截距。矩陣解 X\y 搭配 X=[ones(size(t)),t] 時則先返回截距,因為矩陣欄按這個次序排列。系數順序不同,並不意味著擬合曲線有分歧。
官方 polyfit 參考說明了降冪系數和最小二乘擬合。這裏使用簡單的單輸出接口;中心化/縮放選項和輸出約定應按實際版本檢查,而不能假設永不改變。提高多項式次數可能降低訓練殘差,卻未必改善預測。重複或過於密集的橫坐標也可能使系數恢復病態。應檢查秩、殘差、尺度和有意義的獨立測試;平滑曲線不足以證明結果可靠。
診斷例題。 直線的殘差平方和為 。二次多項式 精確插過三個觀測,因此訓練殘差為零。在 處,它預測負一,而直線預測 。僅憑這些數據不能確定哪種外推合適。精確插值並不能證明底層過程的模型。
4. 求值前符號輸入必須精確
符號計算表示表達式,而不只是浮點近似。要構造有理數十分之一,應使用 sym(1)/10 或精確的文本有理數,而不是先作近似數值計算,再要求轉換器重建原本意圖。對於超出雙精度連續整數範圍的大整數,應在轉換前使用精確文本表示。參見官方 sym 參考。
一個 MATLAB Symbolic Math Toolbox 例子:
syms x real
f = x^3 - 2*x + sym(1)/3;
df = diff(f,x);
assert(isequal(simplify(df-(3*x^2-2)),sym(0)));
I = int(x^2,x,0,1);
assert(isequal(I,sym(1)/3));
roots_exact = solve(x^2-2==0,x);
assert(numel(roots_exact)==2);
assert(all(isAlways(roots_exact.^2==2)));
assert(isAlways(roots_exact(1)~=roots_exact(2)));
導數為 ,積分為 ,方程的實數解為 。根的順序沒有規定;應檢驗數學性質和個數,而不是顯示順序。官方接口:diff、int、solve。
這些操作不能免除定義域推理。syms x real 聲明實數性,而不是正性。對實數 ,;替換為 需要 。將 約去後得到 ,只在原定義域 上成立。應在化簡表達式旁保留排除值列表。L04 深入討論這些邏輯邊界。
將精確結果轉換為浮點近似時,應標明該階段。 的小數近似可用於數值比較,但不再是其精確代數表示。顯示更多數字不能修復不準確的輸入假設。
5. 二維曲線與三維曲線是採樣映射
對圖像 ,折線圖採樣 。對空間參數曲線,必須在同一組參數值處採樣三個坐標。考慮螺旋線
其高度從零上升到二,在 平面上的投影是單位圓。繪制方法如下:
theta = linspace(0,4*pi,401);
hx = cos(theta); hy = sin(theta); hz = theta/(2*pi);
plot3(hx,hy,hz,'k-');
xlabel('x'); ylabel('y'); zlabel('z');
title('Two-turn unit-radius helix'); grid on; axis equal;
plot3 連接樣本點,並不推斷精確曲線。徑向不變量 、端點高度和高度遞增性都提供非視覺檢查。axis equal 使相等的坐標距離具有相等的顯示長度;透視投影仍可能隱藏深度,因此應檢查多個視角或包含坐標平面投影。plot3 參考說明了坐標接口。
配套渲染函數與不涉及圖形的核心運行器分離,因此不能將缺失圖形後端誤認為數值計算失敗。
6. 曲面需要二維坐標網格
對 在 上構造網格:
x = linspace(-1,1,5);
y = linspace(-2,2,9);
[X,Y] = meshgrid(x,y);
Z = X.^2-Y.^2;
assert(isequal(size(Z),[9 5]));
assert(abs(Z(5,3)) < 1e-12);
行對應九個 值,欄對應五個 值:、。因此 是該坐標對處的高度。非方形網格比方形網格更容易發現交換軸的錯誤。官方 meshgrid 參考說明了這一約定。
原點高度為零。沿 ,高度 ;沿 ,高度 。因此原點是鞍點,不是局部極大或極小點:任意接近它的地方都有正、負高度。這是與繪圖分辨率無關的精確證明。在該矩形上,最小值為負四,在 取得;最大值為一,在 取得,因為 和 獨立變化。
要繪制互補視圖:
surf(X,Y,Z);
xlabel('x'); ylabel('y'); zlabel('x^2-y^2');
title('Saddle surface on a declared rectangle'); colorbar;
% In a separate figure:
contour(X,Y,Z,[-3 -1 0 1]);
xlabel('x'); ylabel('y'); axis equal; grid on;
曲面強調高度;等高線顯示水平集,不受透視遮擋。顏色尺度可能重複高度已表示的信息,但仍需要數值圖例。網格表示採樣單元,不能證明不存在奇點或狹窄特徵。參見 surf。
7. 設計可信的可視化報告
圖形應標識數學對象、定義域、採樣點數、單位、排除部分和視覺編碼。用純文本說明讀者應學到甚麼。例如對該曲面:“原點是鞍點; 軸截面上升, 軸截面下降。”對螺旋線:“單位半徑的兩圈螺旋使高度從零升至二。”即使沒有顏色或渲染圖像,這些說明仍可訪問。
對於擬合直線,用標記顯示原始觀測,用線顯示擬合;不要僅靠兩種近乎相同的顏色區分。說明外推區域。對 ,像 L04 那樣將定義域的兩個連通部分分開。對具有孔洞或排除集的三維曲面,應明確編碼排除部分,而不是跨越它連線。
保持定義域和數學函數不變,細化採樣網格。兩個網格一致是有用證據,但不是沒有遺漏特徵的普遍證明。導出圖形需要另外檢查清晰度、裁切和圖注。
8. 分層練習
P01 — 基礎。 區分已安裝產品、路徑可解析的函數、許可證檢查和成功的已知答案操作。
P02 — 核心。 某腳本說“因為調用 polyfit,必須使用 Curve Fitting Toolbox”。糾正依賴聲明,並說明一種更有用的檢查。
P03 — 核心。 解釋為甚麼 polyfit(t,y,1) 給出 [1/2,7/6],而 L07 的設計矩陣給出 [7/6;1/2]。
P04 — 核心。 在三個數據點驗證 §3 的二次插值多項式,並計算它在四處的外推值,與直線比較。
P05 — 核心。 對 求導,計算 從零到一的積分,並精確求解 。給出不依賴順序的軟件檢查。
P06 — 診斷。 某符號例程在正性假設下將 化簡為 。為甚麼這個結果不是 上無條件成立的恆等式?
P07 — 核心。 若有五個 節點和九個 節點,說明 meshgrid 陣列尺寸以及 、 和 的公式。
P08 — 證明。 證明原點是 的鞍點,並求其在 §6 矩形上的極值。
P09 — 核心。 給出螺旋線的三個精確不變量或端點檢查。解釋為甚麼看似平坦的投影不能證明曲線位於平面內。
P10 — 結果判斷。 假設可選符號實驗被跳過、Python 參考檢查通過且沒有可用圖形後端。寫一段誠實的三句驗收說明。
9. 完整解答
P01. 安裝表示文件/產品存在;解析表示路徑選擇了哪個實現;許可證測試涉及許可是否可用;已知答案計算測試所選功能在該測試情形下是否實際工作。任何一種狀態本身都不蘊含後續全部階段或所有輸入都能工作。應保留不同狀態,不要壓成一個“可用”標誌。
P02. polyfit 是基礎 MATLAB 擬合接口,其本身不要求 Curve Fitting Toolbox。應檢查選用的實現、版本、輸入形狀、次數和已知答案擬合;實際使用的專門例程要單獨調查其產品依賴。不能僅根據英文“fit”猜測目錄或產品名。
P03. polyfit 按冪次遞減排列,所以直線系數先斜率後截距。X=[ones,t] 的常數欄在前,所以其解先截距後斜率。兩者都得到 。比較向量前,應比較預測值或重排系數。
P04. 二次式在零處為一;在一處為 ;在二處為 。在四處為 。直線給出 。不同外推與相同觀測樣本並不矛盾。
P05. 導數為 ,積分為 ,解為 。將計算結果與預期導數/積分的差化簡到精確零。對根,檢查有兩個不同結果且每個的平方都等於二;不要假設返回順序。多項式為二次,所以兩個已驗證的不同根構成全部解。
P06. 正性給出 。若無此條件,負值如負一給出 。軟件假設限定定理的定義域;不能刪去假設而保留相同結論。
P07. 每個陣列都是 。公式為 、、。這個網格中原點位於第五行、第三欄。矩形尺寸有助於發現轉置錯誤。
P08. 沿 且 充分小非零時,值為 ;沿 時為 ,而原點值為零。因此不可能是局部極小值或極大值。由於 且 ,所有值在負四和一之間。兩個界均在 §6 所述位置取得,因此是全局極值。
P09. 徑向恆等式為 ;端點高度為零和二;高度的導數為 ,故高度遞增。投影移除一個坐標,可能將不同空間點壓到同一點。事實上,若某平麵包含整條螺旋線,就對所有 有 ;比較 和 迫使 ,再改變 迫使 ,這不是平面方程。
P10. 對題設情景,可以寫:“選定的 Python 參考算術與不變量檢查已通過。MATLAB/Octave 源碼、可選 Symbolic Math Toolbox 計算和圖形渲染尚未執行,因此其運行/視覺驗收仍待進行。跳過的能力不計為通過的實驗。”每句話都標明瞭題設中的證據邊界。
10. 學習檢查
工具箱演示需要聲明產品邊界並作功能測試,不能假定其可用。符號結果保留定義域與精確性標籤。圖形保留坐標、採樣信息和非視覺不變量。只有這些條件可見時,軟件輸出才能支持數學推理。