FGMRES(Flexible Generalized Minimal Residual)方法是GMRES的變種,主要用于處理變預處理子(即每次迭代的預處理子可能不同)的情況。與標準GMRES相比,FGMRES通過存儲預處理后的向量而非預處理子本身,避免了因預處理子變化導致的子空間不一致問題。
FGMRES與GMRES的核心區別
-
預處理子的靈活性
- GMRES:要求預處理子固定(即每次迭代的預處理子 ( M ) 必須相同)。若預處理子變化,Krylov子空間的正交性會被破壞,導致收斂失敗。
- FGMRES:允許預處理子 ( M_i ) 在每次迭代中動態變化(例如依賴當前迭代的解或殘差),更適合非線性預處理或自適應預處理場景。
-
存儲的向量不同
- GMRES存儲的是預處理前的向量 ( v_j = M^{-1} A q_j )。
- FGMRES存儲的是預處理后的向量 ( z_j = M_j^{-1} v_j ),從而適應預處理子的變化。
-
計算開銷
FGMRES需要額外存儲預處理后的向量 ( z_j ),但避免了重新構造整個Krylov子空間。
FGMRES的優勢場景
當預處理子需要動態調整時,FGMRES是唯一選擇。例如:
- 非線性預處理:預處理子依賴當前解(如基于物理的近似)。
- 內迭代法作為預處理子:例如用不完全LU分解(ILU)或少量迭代的GMRES作為預處理子,但內層迭代的精度可能隨外層變化。
- 自適應策略:預處理子的參數(如閾值、填充級別)根據殘差動態調整。
具體例子
問題:求解線性系統 ( Ax = b ),其中 ( A ) 是病態矩陣,預處理子通過內層GMRES迭代實現(每次內層迭代次數可能不同)。
GMRES的局限
若用內層GMRES(如5次迭代)作為固定預處理子,外層GMRES可能因預處理子不精確而收斂緩慢甚至失敗。
FGMRES的解決方案
允許內層GMRES的迭代次數動態調整(例如基于殘差閾值)。FGMRES的偽代碼如下:
for k = 1, 2, ...:# 動態生成預處理子 M_k(例如內層GMRES迭代次數由殘差決定)z_k = M_k^{-1} v_k # 內層迭代求解# 將z_k加入FGMRES的子空間并正交化# 更新解和殘差
此時,即使每次 ( M_k^{-1} ) 不同(如內層迭代次數從5次變為10次),FGMRES仍能保證子空間的正交性。
數學形式對比
- GMRES:構建Krylov子空間 ( \mathcal{K}_m(A M^{-1}, r_0) ),要求 ( M ) 固定。
- FGMRES:構建子空間 ( \text{span}{z_1, z_2, \dots, z_m} ),其中 ( z_j = M_j^{-1} v_j ),允許 ( M_j ) 變化。
總結
- 使用FGMRES當:預處理子需要動態調整(如非線性、內層迭代不精確或自適應策略)。
- 使用GMRES當:預處理子固定且易于求逆(如靜態ILU、SSOR)。
典型應用:
- 多物理場耦合問題(預處理子依賴其他場的解)。
- 嵌套迭代法(外層FGMRES + 內層GMRES預處理)。
通過靈活處理變預處理子,FGMRES擴展了GMRES的適用性,但代價是更高的存儲需求和潛在穩定性風險(需監控殘差)。
使用FGMRES方法迭代求解的指南與實例
FGMRES (Flexible Generalized Minimal Residual) 方法是GMRES的一種變體,特別適用于預處理子可能隨迭代變化的情況。下面我將詳細介紹FGMRES方法及其應用實例。
FGMRES方法概述
FGMRES是GMRES的靈活變體,主要特點:
- 允許預處理子在每次迭代中變化
- 適用于非線性預處理或迭代依賴的預處理
- 保持GMRES的最小殘差特性
- 需要存儲所有基向量,內存需求與GMRES相同
算法基本步驟:
- 初始化殘差和第一個基向量
- 構建Krylov子空間
- 應用靈活預處理
- 正交化過程
- 最小化殘差
實際應用實例:計算流體力學中的Navier-Stokes方程求解
問題描述
考慮二維不可壓縮Navier-Stokes方程:
?u/?t + u·?u = -?p + (1/Re)?2u
?·u = 0
其中u是速度場,p是壓力場,Re是雷諾數。
離散化后的線性系統
經過半離散化和線性化后,我們得到如下塊線性系統:
[ A G ][u] = [f]
[ D 0 ][p] [g]
其中A是速度矩陣,G是梯度算子,D是散度算子。
使用FGMRES求解
由于這是一個 saddle-point 問題,我們采用分塊預處理策略,預處理子可能隨物理參數或迭代變化,因此FGMRES是合適選擇。
MATLAB代碼示例
% 假設已定義:A, G, D, f, g 和預處理子函數 apply_preconditioner% 構建塊系統矩陣
n = size(A,1);
m = size(D,1);
bigA = [A, G; D, sparse(m,m)];% 右側向量
rhs = [f; g];% FGMRES參數設置
maxit = 100; % 最大迭代次數
tol = 1e-6; % 容差
restart = 30; % 重啟次數% 定義預處理函數 (可能隨迭代變化)
precond_func = @(x) apply_preconditioner(x, A, G, D);% 調用FGMRES
[x, flag, relres, iter, resvec] = fgmres(@(x)bigA*x, rhs, [], tol, maxit, precond_func);% 提取解
u_sol = x(1:n);
p_sol = x(n+1:end);
預處理子函數示例
function y = apply_preconditioner(x, A, G, D)% 分塊預處理示例n = size(A,1);m = size(D,1);% 分解x為速度和壓力部分x_u = x(1:n);x_p = x(n+1:n+m);% 近似求解速度塊 (可能使用不完全LU分解)[L,U] = ilu(A); % 可能每次迭代不同u_sol = U\(L\x_u);% 壓力Schur補近似 (使用質量矩陣或對角線近似)S_approx = diag(diag(D*(diag(diag(A))\G)); % 簡單對角近似p_sol = S_approx\x_p;% 組合結果y = [u_sol; p_sol];
end
實際應用中的考慮因素
-
預處理子選擇:在CFD中常用:
- 分塊三角預處理
- 近似Schur補預處理
- 多重網格作為預處理
-
可變預處理:當非線性較強時,預處理可能需要在迭代間更新
-
重啟策略:由于內存限制,需要定期重啟FGMRES
-
收斂性:對于對流主導問題,可能需要特殊的預處理技術
其他應用領域
FGMRES還常用于:
- 電磁場計算(Maxwell方程)
- 結構力學中的耦合問題
- 多物理場模擬
- 大規模優化問題
優勢與局限
優勢:
- 處理變預處理子的靈活性
- 保持最小殘差性質
- 適用于復雜物理問題
局限:
- 與GMRES相同的存儲需求(隨迭代次數線性增長)
- 重啟可能影響收斂
- 預處理質量對性能影響大
結論
FGMRES是處理需要靈活預處理的大型稀疏線性系統的強大工具,特別適用于多物理場耦合問題和非線性預處理情況。在實際應用中,預處理子的設計和實現通常是獲得良好性能的關鍵。