X=A\b
C=null(A,'r')
elseX='Equationhasnosolves'
end
运行后结果显示为:
R_A=
2
R_B=
2
Warning:
Rankdeficient,rank=2tol=8.8373e-015.
>InD:
\Matlab\pujun\lx0723.matline11
X=
0
0
-8/15
3/5
C=
3/2-3/4
3/27/4
10
01
所以原方程组的通解为X=k1
+k2
+
解法二:
用rref求解
A=[11-3-1;3-1-34;15-9-8];
b=[140]';
B=[Ab];
C=rref(B)%求增广矩阵的行最简形,可得最简同解方程组。
运行后结果显示为:
C=
10-3/23/45/4
01-3/2-7/4-1/4
00000
对应齐次方程组的基础解系为:
,
非齐次方程组的特解为:
所以,原方程组的通解为:
X=k1
+k2
+
。
1.4.4线性方程组的LQ解法
函数symmlq
格式x=symmlq(A,b)%求线性方程组AX=b的解X。
A必须为n阶对称方阵,b为n元列向量。
A可以是由afun定义并返回A*X的函数。
如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。
symmlq(A,b,tol)%指定误差tol,默认值是1e-6。
symmlq(A,b,tol,maxit)%maxit指定最大迭代次数
symmlq(A,b,tol,maxit,M)%M为用于对称正定矩阵的预处理因子
symmlq(A,b,tol,maxit,M1,M2)%M=M1×M2
symmlq(A,b,tol,maxit,M1,M2,x0)%x0为初始估计值,默认值为0。
[x,flag]=symmlq(A,b,…)%flag的取值为:
0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大;5表示预处理因子不是对称正定的。
[x,flag,relres]=symmlq(A,b,…)%relres表示相对误差norm(b-A*x)/norm(b)
[x,flag,relres,iter]=symmlq(A,b,…)%iter表示计算x的迭代次数
[x,flag,relres,iter,resvec]=symmlq(A,b,…)%resvec表示每次迭代的残差:
norm(b-A*x0)
[x,flag,relres,iter,resvec,resveccg]=symmlq(A,b,…)%resveccg表示每次迭代共轭梯度残差的范数
1.4.5双共轭梯度法解方程组
函数bicg
格式x=bicg(A,b)%求线性方程组AX=b的解X。
A必须为n阶方阵,b为n元列向量。
A可以是由afun定义并返回A*X的函数。
如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。
bicg(A,b,tol)%指定误差tol,默认值是1e-6。
bicg(A,b,tol,maxit)%maxit指定最大迭代次数
bicg(A,b,tol,maxit,M)%M为用于对称正定矩阵的预处理因子
bicg(A,b,tol,maxit,M1,M2)%M=M1×M2
bicg(A,b,tol,maxit,M1,M2,x0)%x0为初始估计值,默认值为0。
[x,flag]=bicg(A,b,…)%flag的取值为:
0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大。
[x,flag,relres]=bicg(A,b,…)%relres表示相对误差norm(b-A*x)/norm(b)
[x,flag,relres,iter]=bicg(A,b,…)%iter表示计算x的迭代次数
[x,flag,relres,iter,resvec]=bicg(A,b,…)%resvec表示每次迭代的残差:
norm(b-A*x0)
例1-83调用MATLAB6.0数据文件west0479。
>>loadwest0479
>>A=west0479;%将数据取为系数矩阵A。
>>b=sum(A,2);%将A的各行求和,构成一列向量。
>>X=A\b;%用“\”求AX=b的解。
>>norm(b-A*X)/norm(b)%计算解的相对误差。
ans=
1.2454e-017
>>[x,flag,relres,iter,resvec]=bicg(A,b)%用bicg函数求解。
x=(全为0,由于太长,不显示出来)
flag=
1%表示在默认迭代次数(20次)内不收敛。
relres=%相对残差relres=norm(b-A*x)/norm(b)=norm(b)/norm(b)=1。
1
iter=%表明解法不当,使得初始估计值0向量比后来所有迭代值都好。
0
resvec=(略)%每次迭代的残差。
>>semilogy(0:
20,resvec/norm(b),'-o')%作每次迭代的相对残差图形,结果如下图。
>>xlabel('iterationnumber')%x轴为迭代次数。
>>ylabel('relativeresidual')%y轴为相对残差。
图1-1双共轭梯度法相对误差图
1.4.6稳定双共轭梯度方法解方程组
函数bicgstab
格式x=bicgstab(A,b)
bicgstab(A,b,tol)
bicgstab(A,b,tol,maxit)
bicgstab(A,b,tol,maxit,M)
bicgstab(A,b,tol,maxit,M1,M2)
bicgstab(A,b,tol,maxit,M1,M2,x0)
[x,flag]=bicgstab(A,b,…)
[x,flag,relres]=bicgstab(A,b,…)
[x,flag,relres,iter]=bicgstab(A,b,…)
[x,flag,relres,iter,resvec]=bicgstab(A,b,…)
稳定双共轭梯度法解方程组,调用方式和返回的结果形式和命令bicg一样。
例1-84
>>loadwest0479;
>>A=west0479;
>>b=sum(A,2);
>>[x,flag]=bicgstab(A,b)
显示结果是x的值全为0,flag=1。
表示在默认误差和默认迭代次数(20次)下不收敛。
若改为:
>>[L1,U1]=luinc(A,1e-5);
>>[x1,flag1]=bicgstab(A,b,1e-6,20,L1,U1)
即指定误差,并用A的不完全LU分解因子L和U作为预处理因子M=L*U,其结果是x1的值全为0,flag=2表示预处理因子为坏条件的预处理因子。
若改为
>>[L2,U2]=luinc(A,1e-6);%稀疏矩阵的不完全LU分解。
>>[x2,flag2,relres2,iter2,resvec2]=bicgstab(A,b,1e-15,10,L2,U2)
%指定最大迭代次数为10次,预处理因子M=L*U。
>>semilogy(0:
0.5:
iter2,resvec2/norm(b),'-o')%每次迭代的相对残差图形,见图1-2。
>>xlabel('iterationnumber')
>>ylabel('relativeresidual')
结果为
x2=(其值全为1,略)
flag2=
0%表示收敛
relres2=
2.8534e-016%收敛时的相对误差
iter2=
6%计算终止时的迭代次数
resvec2=%每次迭代的残差
1.4.7复共轭梯度平方法解方程组
函数cgs
格式x=cgs(A,b)
cgs(A,b,tol)
cgs(A,b,tol,maxit)
cgs(A,b,tol,maxit,M)
cgs(A,b,tol,maxit,M1,M2)
cgs(A,b,tol,maxit,M1,M2,x0)
[x,flag]=cgs(A,b,…)
[x,flag,relres]=cgs(A,b,…)
[x,flag,relres,iter]=cgs(A,b,…)
[x,flag,relres,iter,resvec]=cgs(A,b,…)
调用方式和返回的结果形式与命令bicg一样。
1.4.8共轭梯度的LSQR方法
函数lsqr
格式x=lsqr(A,b)
lsqr(A,b,tol)
lsqr(A,b,tol,maxit)
lsqr(A,b,tol,maxit,M)
lsqr(A,b,tol,maxit,M1,M2)
lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag]=lsqr(A,b,…)
[x,flag,relres]=lsqr(A,b,…)
[x,flag,relres,iter]=lsqr(A,b,…)
[x,flag,relres,iter,resvec]=lsqr(A,b,…)
调用方式和返回的结果形式与命令bicg一样。
例1-85
>>n=100;
>>on=ones(n,1);
>>A=spdiags([-2*on4*on-on],-1:
1,n,n);%产生一个对角矩阵
>>b=sum(A,2);
>>tol=1e-8;%指定精度
>>maxit=15;%指定最大迭代次数
>>M1=spdiags([on/(-2)on],-1:
0,n,n);
>>M2=spdiags([4*on-on],0:
1,n,n);%M1*M2=M,即产生预处理因子
>>[x,flag,relres,iter,resvec]=lsqr(A,b,tol,maxit,M1,M2,[])
结果显示
x的值全为1
flag=
0%表示收敛
relres=
3.5241e-009%表示相对残差
iter=
12%计算终止时的迭代次数
1.4.9广义最小残差法
函数qmres
格式x=gmres(A,b)
gmres(A,b,restart)
gmres(A,b,restart,tol)
gm