MATLAB求解线性方程组的八种方法

简介: 求解线性方程分为两种方法--直接法和迭代法常见的方法一共有8种直接法Gauss消去法Cholesky分解法迭代法Jacobi迭代法Gauss-Seidel迭代法超松弛迭代法共轭梯度法Bicg迭代法Bicgstab迭代法

这里我就从计算代码的角度来讲解,在下面也会按照上面这个顺序给出代码,遇到方程组直接带入已知条件就可以得到答案。

适用条件
Gauss消去法 :求解中小规模线性方程(阶数不过1000),一般用于求系数矩阵稠密而且没有任何特殊结构的线性方程组

Cholesky分解法:对称正定方程优先使用,系数矩阵A是n阶对称正定矩阵

Jacobi迭代法非奇异线性方程组,分量的计算顺序没有关系

Gauss-Seidel迭代法与Jacobi迭代法相似,但计算的分量不能改变

超松弛迭代法Jacobi迭代法和Gauss-Seidel迭代法的加速版,由Gauss-Seidel迭代法改进而来,速度较快

共轭梯度法需要确定松弛参数w,只有系数矩阵具有较好的性质时才可以找到最佳松弛因子。但好处是不用确定任何参数,他是对称正定线性方程组的方法也是求解大型稀疏线性方程组最热门的方法

Bicg迭代法本质是用双共轭梯度求解线性方程组的方法,对求解的方程没有正定性要求

Bicgstab迭代法本质是用稳定双共轭梯度求解线性方程组的方法,对求解的方程没有正定性要求

Gauss消去法
第一、二个函数ltri、utri是一定要掌握的,后面的几乎每个函数都要用到
ltri
简单来说,当Ly=b
b,L(非奇异下三角矩阵)已知求y

function y = ltri(L,b)
n=size(b,1);
y=zeros(n,1);
for j = 1:n-1
    y(j) = b(j)/L(j,j);
    b(j+1:n) = b(j+1:n) - y(j) * L(j+1:n,j);
end
y(n) = b(n)/L(n,n);

utri
简单来说,当Ux=y
y,U(非奇异上三角矩阵)已知求x

function x = utri(U,y)
n=size(y,1);
x=zeros(n,1);
for j = n:-1:2
    x(j) = y(j)/U(j,j);
    y(1:j-1) = y(1:j-1) - x(j) * U(1:j-1,j);
end
x(1) = y(1)/U(1,1);

gauss算法,计算时粘贴过去就好

function [L,U] = gauss(A)
n=size(A,1);
for k = 1:n-1
    A(k+1:n,k) = A(k+1:n,k) / A(k,k);
    A(k+1:n,k+1:n) = A(k+1:n,k+1:n) - A(k+1:n,k)* A(k,k+1:n);
end
L = tril(A,-1) + eye(n);
U = triu(A);

使用例子
已经知道一个线性方程组,这里我就不写出数学形式了,A是系数矩阵,直接把上面写好的函数复制过来在运算就可以。主要是把这两个矩阵写进去。
A = [1 -1 1 -3;0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];
b = [1;0;-1;-1];

A = [1 -1 1 -3;0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];
b = [1;0;-1;-1];
[L,U] = gauss(A);
y = ltri(L,b);
x = utri(U,y)

Cholesky分解法
这里是要用到ltri和utri,直接把上面的粘贴过来就好
这里的算法比较简单,用L = chol(A,'lower');这里A是系数矩阵

使用例子
用Cholesky分解法求接对称正定方程Ax=b,b随机选取,系数矩阵A是100阶的矩阵
n = 100;
A = 10 * eye(n) + diag(ones(n-1,1),-1) + diag(ones(n-1,1),1);

n = 100;
A = 10 * eye(n) + diag(ones(n-1,1),-1) + diag(ones(n-1,1),1);
b = rand(n,1);
L = chol(A,'lower');
y = ltri(L,b);
x = utri(L',y)

Jacobi迭代法
这个就是Jacobi迭代法的算法,用时复制。这里一共要输入四个条件,系数矩阵A,矩阵b,x0=zeros(列数,1),tol=1.0e-6

function x = jacobi(A,b,x0,tol)
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
B = D \ (L + U);
g = D \ b;
x = B * x0 + g;
n = 1;
while norm(x - x0) > tol
    x0 = x;
    x= B * x0 + g;
    n = n + 1;
end
x,n

使用例子
用Jacobi迭代法求解下列方程
A = [10 -1 0;-1 10 -2;0 -2 10];
b = [9;7;6];

A = [10 -1 0;-1 10 -2;0 -2 10];
b = [9;7;6];
x = zeros(3,1);
tol = 1.0e-6;
x = jacobi(A,b,x,tol);

Gauss-Seidel迭代法
算法函数,输入四个条件,和上面相同

function x = seidel(A,b,x0,tol)
D=diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
B = (D - L) \ U;
g = (D - L) \ b;
x = B * x0 +g;
n=1;
while norm(x - x0) > tol
    x0 = x;
    x= B * x0 + g;
    n = n + 1;
end
x,n

用这个方法解上面Jacobi迭代法的例子

A = [10 -1 0;-1 10 -2;0 -2 10];
b = [9;7;6];
x = zeros(3,1);
tol = 1.0e-6;
x = seidel(A,b,x,tol);

超松弛迭代法
算法函数,这里需要输入五个条件:系数矩阵A,矩阵b,x0=zeros(列数,1),w(松弛因子一到二之间)=1.025,tol=1.0e-6

function x = sor(A,b,x0,w,tol)
D=diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
B = (D - w * L) \ ((1 - w) * D + w * U);
g = (D - w * L) \ b * w;
x = B * x0 +g;
n=1;
while norm(x - x0) >= tol
    x0 = x;
    x= B * x0 + g;
    n = n + 1;
end
x,n

使用例子
求这个方程组
A = [10 -1 0;-1 10 -2;0 -2 10];
b = [9;7;6];

A = [10 -1 0;-1 10 -2;0 -2 10];
b = [9;7;6];
x = zeros(3,1);
tol = 1.0e-6;
w = 1.025;
x = sor(A,b,x,w,tol);

共轭梯度法

A = [16 4 8 4;4 10 8 4;8 8 12 10;4 4 10 12];
b = [32;26;38;30];
tol = 1.0e-6;
maxit = 1000;
x = pcg(A,b,tol,maxit)

Bicg迭代法
这个比较简单,不需要额外写函数,直接用x = bicg(A,b,tol,maxit)maxit取1000

使用例子

n = 100;
A = 10 * eye(n) + diag(ones(n-1,1),-1) + diag(ones(n-1,1),1);
b = rand(n,1);
tol = 1.0e-6;
x = bicg(A,b,tol,1000)

Bicgstab迭代法
和上面一样的输入条件
x = bicgstab(A,b,tol,1000)

n = 100;
A = 10 * eye(n) + diag(ones(n-1,1),-1) + diag(ones(n-1,1),1);
b = rand(n,1);
tol = 1.0e-6;
x = bicgstab(A,b,tol,1000)
相关文章
|
6月前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
6月前
|
算法 5G PHP
基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真
基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真
|
3月前
|
存储 算法 Serverless
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
|
3月前
|
计算机视觉
【图像处理】基于灰度矩的亚像素边缘检测方法理论及MATLAB实现
基于灰度矩的亚像素边缘检测方法,包括理论基础和MATLAB实现,通过计算图像的灰度矩来精确定位边缘位置,并提供了详细的MATLAB代码和实验结果图。
96 6
|
3月前
|
算法 数据安全/隐私保护
基于星座图整形方法的QAM调制解调系统MATLAB误码率仿真,对比16,32,64,256四种QAM调制方式
本MATLAB 2022a仿真展示了不同QAM阶数下的星座图及误码率性能,通过星座图整形技术优化了系统性能。该技术利用非均匀分布的星座点提高功率效率,并通过合理布局增强抗干扰能力。随着QAM阶数增加,数据传输速率提升,但对信道质量要求也更高。核心程序实现了从比特生成到QAM映射、功率归一化、加噪及解调的全过程,并评估了系统误码率。
63 0
|
4月前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```
|
6月前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
4月前
|
算法 安全 数据挖掘
随机数生成方法及其在Matlab中的应用
随机数生成方法及其在Matlab中的应用
|
6月前
|
算法
考虑泄流效应的光伏并网点电压系统侧增援调控方法matlab
考虑泄流效应的光伏并网点电压系统侧增援调控方法matlab
|
6月前
|
调度
互动环境下分布式电源与电动汽车充电站的优化配置方法研究-全文复现matlab
互动环境下分布式电源与电动汽车充电站的优化配置方法研究-全文复现matlab