『壹』 matlab 解大型稀疏線性方程組怎麼解,對於對稱正定的稀疏矩陣又應該如何解
對稱正定的用pcg解,一般的可以用gmres解
『貳』 熟悉Matlab內部函數cgs,gmres,並結合其用法,給出用cgs,gmres解線性方程組的數值實驗
這個問題不好直接回答,因為N=30000和稀疏性其實基本上不攜帶任何有價值的信息。
根據需求應該先搞清楚幾件事,然後才能選擇演算法
1.是否具有對稱性,如果有的話是否還有正定性
2.需要解一次還是解很多次(相同的A不同的b),或是矩陣還會變(不同的A)
3.對A的條件數或是部分特徵值是否有已知信息或廉價的近似估計
4.A的非零元的分布特徵
第1條通常決定了是否有相對廉價且高效的演算法,2,3也是比較重要的參考信息,4則決定了稀疏直接法或者預條件的難度。
A\b採用的是稀疏直接法,是否可接受取決於第2條。
gmres和bicgstab都是針對非對稱矩陣的Krylov子空間方法,默認參數可能不足以收斂,要用復雜的調用方式,自己指定參數,並且還要檢查輸出信息。這個你自己help一下用法。
一般來講Krylov子空間迭代法需要預條件作為輔助,如果沒有太多信息可以考慮用luinc來產生預條件。
樓上列的那篇paper不用看,基本沒用。
如果只解一次的話半分鍾也算不了什麼。已知條件只能用於估計A的非零元分布,沒有過多信息。
GMRES的help看不懂說明你不知道GMRES的原理,如果經常要用的話最好先去學一下。
給你一個比較簡單的例子
[L,U] = luinc(A,1e-3); %luinc(A,'0')也可以試一下,是一種完全不同的ILU
tol=1e-10; %殘量的精度要求
restart=30; % 30-50之間吧,不要過小
maxit=100; %看情況,如果不收斂就適當調大
[x,flag]=gmres(A,b,restart,tol,maxit,L,U);
最後檢查一下flag。
『叄』 gmres演算法 restart怎麼設置
看你願意用多少內存了,內存多就設得大一點,內存緊張就小一點(諸如30或50之類的)
『肆』 求簡要介紹一下gmres演算法。謝謝。
視圖求解線性方程組A*x=b的解x。nXn的稀疏矩陣A必須是方程且應是大型稀疏矩陣。列向量b的長度必須為n。參數A可以是一個函數afun以使得afun(x)返回A*x,對於這一語法格式,gmres並不重新啟動,迭代的最大次數為min(n,10)。
如果gmres收斂,則顯示這一結果的信息。如果gmres在最大迭代步後沒有收斂或者由於某種原因而停止,則列印警告信息,顯示相對殘差范數norm(b-A*x)/norm(b)並且顯示該方法停止或者失效時的迭代步數。
Gmres(A,b,restart)
在每一次重新開始內部迭代時才重新開始方法。外部迭代的最大數目為min(n/restart,10),總迭代的最大步數為restart*min(n/restart,10).如果restart為n或者[],則gmres並不重新開始,則總迭代的最大數目為min(n,10)
Gmres(A,b,restart,tol)
指定方法的誤差。如果tol為[],則函數gmres將使用默認值1e-6.
Gmres(A,b,restart,tol,maxit)
指定外部迭代的最大次數,也就是說,迭代的總次數不超過restart*matrix。如果參數maxit為[],則矩陣gmres使用默認值min(n/restart,10);如果參數restart為n或者[],則總迭代的最大次數為maxit(而非restart*matxit)。
Gmres(A,b,restart,tol,maxit,M)和 Gmres(A,b,restart,tol,maxit,M1,M2)
使用預處理矩陣M或者M=M1*M2有效地求解方程組inv(M)*A*x=inv(M)*b.如果M為[],則函數gmres不適應預處理矩陣,M可以是一個函數,它返回M\x
Gmres(A,b,restart,tol,maxit,M1,M2,x0)
指定初始的猜測值。如果x0為[],則函數gmres將使用默認值,一個全為零的向量。
Gmres(afun,b,restart,tol,maxit,m1fun,m2fun,x0,p1,p2,…)
將參數傳遞到函數afun(x,p1,p2,…),m1fun(x,p1,p2,…)和m2fun(x,p1,p2,…)中。
[x,flag]=gmres(A,b,…)
返回一個收斂標志符:
Flag=0
函數gmres在maxit外部迭代步數之內收斂到期望的誤差
Flag=1
函數gmres迭代maxit次但沒有收斂
Flag=2
預處理矩陣M為病態條件陣
Flag=3
函數gmres停滯(兩個連續迭代步的結果相同)
當flag的值不為0時,返回的解x是在所有迭代過程中得到的具有最小范數殘差的結果。如果指定輸出flag,則不顯示任何消息。
[x,flag,relres]=gmres(A,b,…)
返回相當殘差范數norm(b-A*x)/norm(b),如果flag的值為0,則relres<=tol,
[x,flag,relres,iter]=gmres(A,b,…)
返回計算x時外部和內部迭代次數,其中0<=iter(1)<=maxit且0<=iter(2)<=restart.
[x,flag,relres,iter,resvec]=gmres(A,b,…)
返回每一個內部迭代時的殘差范數向量,包含norm(b-A*x0).
『伍』 matlab 解大型稀疏線性方程組
這個問題不好直接回答,因為N=30000和稀疏性其實基本上不攜帶任何有價值的信息。
根據需求應該先搞清楚幾件事,然後才能選擇演算法
1.是否具有對稱性,如果有的話是否還有正定性
2.需要解一次還是解很多次(相同的A不同的b),或是矩陣還會變(不同的A)
3.對A的條件數或是部分特徵值是否有已知信息或廉價的近似估計
4.A的非零元的分布特徵
第1條通常決定了是否有相對廉價且高效的演算法,2,3也是比較重要的參考信息,4則決定了稀疏直接法或者預條件的難度。
A\b採用的是稀疏直接法,是否可接受取決於第2條。
gmres和bicgstab都是針對非對稱矩陣的Krylov子空間方法,默認參數可能不足以收斂,要用復雜的調用方式,自己指定參數,並且還要檢查輸出信息。這個你自己help一下用法。
一般來講Krylov子空間迭代法需要預條件作為輔助,如果沒有太多信息可以考慮用luinc來產生預條件。
樓上列的那篇paper不用看,基本沒用。
『陸』 比如解稀疏矩陣AX=B.以前MATLAB中有的,現在也沒有了.不知道如何求
求逆就是用解方程AX=I來求?
【 在 pcj (天道酬勤) 的大作中提到: 】
help GMRES
BICG
BICGSTAB
CGS
QMR
.......
高斯消去算個10來階的小矩陣還成,算大了一定出問題!
【 在 ptking (love) 的大作中提到: 】
: 難道還是高斯消去法?那大型的不是要求死啊
『柒』 如何用matlab解方程組
我知道的Matlab解矩陣方法有:
A=[1 6 9;6 5 2;8 3 4]
b=[2;4;7]
1)x=inv(A)*b 【就是你用的方法】
2)x=A\b
3)x=A^(-1)*b
4)C=[A,b]
rref(C)
試試吧,也許好使。
還有一個網址,下載一些經典程序,如:
gmres_m.rar-gmres演算法的一個特殊形式,用來求解大型稀疏矩陣方程,matlab
GMres.rar-數值演算法中另一個經典演算法gmres演算法,用來求解大型矩陣方程問題。,matlab
arnoldi.rar-數值分析中經典的arnoldi演算法,用來求解大型矩陣方程組的求解,matlab
http://www.programsalon.com/sitemap/sitemap153_1450.htm
補充:
2.利用矩陣的LU、QR和cholesky分解求方程組的解
(1)LU分解:
LU分解又稱Gauss消去分解,可把任意方陣分解為下三角矩陣的基本變換形式(行交換)和上三角矩陣的乘積。即A=LU,L為下三角陣,U為上三角陣。
則:A*X=b 變成L*U*X=b
所以X=U\(L\b) 這樣可以大大提高運算速度。
命令 [L,U]=lu (A)
例1-78 求方程組 的一個特解。
解:
>>A=[4 2 -1;3 -1 2;11 3 0];
>>B=[2 10 8]';
>>D=det(A)
>>[L,U]=lu(A)
>>X=U\(L\B)
顯示結果如下:
D =
0
L =
0.3636 -0.5000 1.0000
0.2727 1.0000 0
1.0000 0 0
U =
11.0000 3.0000 0
0 -1.8182 2.0000
0 0 0.0000
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.018587e-017.
> In D:\Matlab\pujun\lx0720.m at line 4
X =
1.0e+016 *
-0.4053
1.4862
1.3511
說明 結果中的警告是由於系數行列式為零產生的。可以通過A*X驗證其正確性。
(2)Cholesky分解
若A為對稱正定矩陣,則Cholesky分解可將矩陣A分解成上三角矩陣和其轉置的乘積,即: 其中R為上三角陣。
方程 A*X=b 變成
所以
(3)QR分解
對於任何長方矩陣A,都可以進行QR分解,其中Q為正交矩陣,R為上三角矩陣的初等變換形式,即:A=QR
方程 A*X=b 變形成 QRX=b
所以 X=R\(Q\b)
上例中 [Q, R]=qr(A)
X=R\(Q\B)
說明 這三種分解,在求解大型方程組時很有用。其優點是運算速度快、可以節省磁碟空間、節省內存。
也許這個能幫你點兒忙。
『捌』 其中A是萬階稀疏矩陣,怎麼求x,A用什麼方法存儲能
"但稀疏存儲 在進行運算時也要還原滿矩陣啊",That's not the truth.如果打算深入研究的話你可以看看
Direct methods for sparse linear systems,by Tim Davis
Iterative Methods for Sparse Linear Systems
這兩本書.
當使用 Matlab x = A\b 反斜杠操作時,如果 A 是稀疏陣,使用的針對稀疏陣的類似高斯消去法的直接求解演算法.使用這種演算法會插入一些非零元,使得存儲量增加,但不會使之成為 full matrix.
對於大型稀疏線性方程組求解,如果MATLAB提示內存不足,有兩種解決方案,1 是使用更大內存的計算機或者使用 out of core 的模式(我不清楚 matlab 是否有 out of core 的模式).2.你可以嘗試稀疏矩陣的迭代法求解,比如帶有各種預處理的 gmres,cg 等方法.matlab 自帶有 gmres 這個函數,你也可以嘗試一下.
當然,無論是直接法還是迭代法,in core 還是 out of core,32bit 的機器總有一個極限.在這個時候,你就只能採取使用 64bit 平台,然後加大內存,使用並行這些策略了.By the way,對於真正的上百萬階,千萬階的大型稀疏線性方程組來說,matlab 並不是最好的選擇,你還是應該尋求 Fortran,C 這些更高效的語言.
『玖』 matlab 解方程組特別慢 有什麼方法
把方程組的形式改寫成了Ax=b的形式。
A矩陣是個很大的矩陣,由別的程序得出,比如用matlab里的某些函數。
A=[1 6 9;6 5 2;8 3 4]
b=[2;4;7]
1)x=inv(A)*b 【就是你用的方法】
2)x=A\b
3)x=A^(-1)*b
4)C=[A,b]
rref(C)
試試吧,也許好使。
還有一個網址,下載一些經典程序,如:
gmres_m.rar-gmres演算法的一個特殊形式,用來求解大型稀疏矩陣方程,matlab
GMres.rar-數值演算法中另一個經典演算法gmres演算法,用來求解大型矩陣方程問題。,matlab
arnoldi.rar-數值分析中經典的arnoldi演算法,用來求解大型矩陣方程組的求解,matlab
http://www.programsalon.com/sitemap/sitemap153_1450.htm
『拾』 請問如何用MATLAB解"久期方程"
我知道的Matlab解矩陣方法有:
A=[1 6 9;6 5 2;8 3 4]
b=[2;4;7]
1)x=inv(A)*b 【就是你用的方法】
2)x=A\b
3)x=A^(-1)*b
4)C=[A,b]
rref(C)
試試吧,也許好使。
還有一個網址,下載一些經典程序,如:
gmres_m.rar-gmres演算法的一個特殊形式,用來求解大型稀疏矩陣方程,matlab
GMres.rar-數值演算法中另一個經典演算法gmres演算法,用來求解大型矩陣方程問題。,matlab
arnoldi.rar-數值分析中經典的arnoldi演算法,用來求解大型矩陣方程組的求解,matlab
http://www.programsalon.com/sitemap/sitemap153_1450.htm
補充:
2.利用矩陣的LU、QR和cholesky分解求方程組的解
(1)LU分解:
LU分解又稱Gauss消去分解,可把任意方陣分解為下三角矩陣的基本變換形式(行交換)和上三角矩陣的乘積。即A=LU,L為下三角陣,U為上三角陣。
則:A*X=b 變成L*U*X=b
所以X=U\(L\b) 這樣可以大大提高運算速度。
命令 [L,U]=lu (A)
例1-78 求方程組 的一個特解。
解:
>>A=[4 2 -1;3 -1 2;11 3 0];
>>B=[2 10 8]';
>>D=det(A)
>>[L,U]=lu(A)
>>X=U\(L\B)
顯示結果如下:
D =
0
L =
0.3636 -0.5000 1.0000
0.2727 1.0000 0
1.0000 0 0
U =
11.0000 3.0000 0
0 -1.8182 2.0000
0 0 0.0000
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.018587e-017.
> In D:\Matlab\pujun\lx0720.m at line 4
X =
1.0e+016 *
-0.4053
1.4862
1.3511
說明 結果中的警告是由於系數行列式為零產生的。可以通過A*X驗證其正確性。
(2)Cholesky分解
若A為對稱正定矩陣,則Cholesky分解可將矩陣A分解成上三角矩陣和其轉置的乘積,即: 其中R為上三角陣。
方程 A*X=b 變成
所以
(3)QR分解
對於任何長方矩陣A,都可以進行QR分解,其中Q為正交矩陣,R為上三角矩陣的初等變換形式,即:A=QR
方程 A*X=b 變形成 QRX=b
所以 X=R\(Q\b)
上例中 [Q, R]=qr(A)
X=R\(Q\B)
說明 這三種分解,在求解大型方程組時很有用。其優點是運算速度快、可以節省磁碟空間、節省內存。
也許這個能幫你點兒忙。
參考資料:《matlab6.0數學手冊》