导航:首页 > 源码编译 > gmres算法matlab

gmres算法matlab

发布时间:2022-11-16 21:04:18

‘壹’ 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数学手册》

阅读全文

与gmres算法matlab相关的资料

热点内容
医疗不良事件上报系统源码 浏览:752
手机云视频加密怎么关 浏览:74
北京文件夹加密多少钱 浏览:671
什么是车鉴定app 浏览:66
战地一私人服务器怎么买 浏览:497
陈天程序员 浏览:833
编译原理如何运用到编程中 浏览:17
linux选择数据库 浏览:376
php两个数组差集 浏览:978
迷你pdf阅读器下载 浏览:433
做一个python小程序 浏览:655
pythonossystem和 浏览:645
win2008如何搭建ftp服务器 浏览:53
安卓手机为什么不翻牌 浏览:546
删除pkpm及相关文件夹 浏览:481
房贷解压银行内部流程 浏览:734
安卓手机如何更改语音 浏览:601
android红包实现 浏览:734
苹果的nvme为什么安卓不用 浏览:32
python输入单词统计个数 浏览:998