用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b

具体的方法和代码以如下方程(3x3矩阵)为例进行说明:

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现:

(1)

1、 实现该方程的解的MATLAB代码可以分为两种,一种是入门级别的,只是简单地计算出这道题即可,第二种是一种通用的代码,可以实现很多3x3矩阵的方程解,写好以后只需要改不同矩阵里的元素即可算出相应的解,需要建立在对MATLAB比较熟悉的基础上,具体如下:

第一种代码实现—入门级:

A=[3.01,6.03,1.99,;1.27,4.16,-1.23,;0.987,-4.81,9.34]

A1=[3.01,6.03,1.99,1;1.27,4.16,-1.23,1;0.987,-4.81,9.34,1]

B1=A1(1,1:4)

C1=A1(2,1:4)

D1=A1(3,1:4)

E1=-1.27/3.01*B1+C1

F1=-0.987/3.01*B1+D1

p1=E1(1,2)

q1=F1(1,2)

if (abs(p1)>=abs(q1))

    a1=p1

    a2=q1

    FF1=E1

    EE1=F1

else

    a1=q1

    a2=p1

    FF1=F1

    EE1=E1

end

G1=-a2/a1*FF1+EE1

H1=[E11;FF1;G1]

J1=H1(1:3,1:3)

b1=H1(1:3,4)

x1=J1\b1

第二种代码实现如下—熟练通用级:

A=[3.01,6.03,1.99,;1.27,4.16,-1.23,;0.987,-4.81,9.34]

A1=[3.01,6.03,1.99,1;1.27,4.16,-1.23,1;0.987,-4.81,9.34,1]

B1=A1(1,1:4)

C1=A1(2,1:4)

D1=A1(3,1:4)

f1=A1(1,1)

f2=A1(2,1)

f3=A1(3,1)

if (abs(f1)>=abs(f2))

    if(abs(f1)>=abs(f3))

        f11=f1

        E11=B1

        f22=f2

        E12=C1

        f33=f3

        E13=D1

    else

        f11=f3

        E11=D1

        f22=f1

        E12=B1

        f33=f2

        E13=C1

    end

end

    if(abs(e2)>=abs(e3))

        f11=f2

        E11=C1

        f22=f1

        E12=B1

        f33=f3

        E13=D1

    else

        f11=f3

        E11=D1

        f22=f1

        E12=B1

        f33=f2

        E13=C1

    end   

E1=-f22/f11*E11+E12

F1=-f33/f11*E11+E13

p1=E1(1,2)

q1=F1(1,2)

if (abs(p1)>=abs(q1))

    a1=p1

    a2=q1

    FF1=E1

    EE1=F1

else

    a1=q1

    a2=p1

    FF1=F1

    EE1=E1

end

G1=-a2/a1*FF1+EE1

H1=[E11;FF1;G1]

J1=H1(1:3,1:3)

b1=H1(1:3,4)

x1=J1\b1

输出结果如下:

A =

3.0100    6.0300    1.9900

1.2700    4.1600   -1.2300

0.9870   -4.8100    9.3400

A1 =

3.0100    6.0300    1.9900    1.0000

1.2700    4.1600   -1.2300    1.0000

0.9870   -4.8100    9.3400    1.0000

B1 =

3.0100    6.0300    1.9900    1.0000

C1 =

1.2700    4.1600   -1.2300    1.0000

D1 =

0.9870   -4.8100    9.3400    1.0000

f1 =

3.0100

f2 =

1.2700

f3 =

0.9870

f11 =

3.0100

E11 =

3.0100    6.0300    1.9900    1.0000

f22 =

1.2700

E12 =

1.2700    4.1600   -1.2300    1.0000

e33 =

0.9870

E13 =

0.9870   -4.8100    9.3400    1.0000

e11 =

1.2700

E11 =

1.2700    4.1600   -1.2300    1.0000

e22 =

3.0100

E12 =

3.0100    6.0300    1.9900    1.0000

e33 =

0.9870

E13 =

0.9870   -4.8100    9.3400    1.0000

E1 =

0   -3.8295    4.9052   -1.3701

F1 =

0   -8.0430   10.2959    0.2228

p1 =

-3.8295

q1 =

-8.0430

a1 =

-8.0430

a2 =

-3.8295

FF1 =

0   -8.0430   10.2959    0.2228

EE1 =

0   -3.8295    4.9052   -1.3701

G1 =

0         0    0.0030   -1.4762

H1 =

1.2700    4.1600   -1.2300    1.0000

0   -8.0430   10.2959    0.2228

0         0    0.0030   -1.4762

J1 =

1.2700    4.1600   -1.2300

0   -8.0430   10.2959

0         0    0.0030

b1 =

1.0000

0.2228

-1.4762

x1 =

   1592.6

   -631.9

   -493.6

可以看出:两种代码的区别在于列主元方法中每一步对每一列最大主元的判断上面,第一种直接看出来,所以就用具体的数字代替了,而第二种对变量进行了一般性的定义和赋值,通过if语句进行大小判断,这样的方法会比较通用,建立在对于MATLAB熟练的基础上。

原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/9775800.html

时间: 2024-10-13 02:32:59

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)的相关文章

Gauss列主元消去法函数

%列主元消去法解方程组Ax=b,实现PA=LU function [x,detA] =gauss(A,b) n=length(b);[p,q]=size(A); if p~=q||p~=n      fprintf('方阵的维数不同,请重新输!'); %检错 end %为提高运行速度,给L,U,x,c,d1赋初值 L=zeros(n,n); U=zeros(n,n); x=zeros(n,1); c=zeros(1,n); d1=0; %按列选主元,并进行行交换,记录行信息 for i=1:n-

杜立特尔法解方程组

试编出下列子程序: (1)实现矩阵三角分解A=LU: (2)利用分解因子L,U解方程组AX=b(即先求解LY=b 再求解UX=Y)的子程序. 利用上述子程序解线性方程组AX=bk(k=1,2,-,10),其中 A=1  2 4  7  11  16 2 3  5  8 12  17 4 5  6  9 13  18 7 8  9  10 14 19 11 12 13 14 15  20 16 17 18 19 20  21 b1为任一非零的六元向量:若记Xk为AX= bk的解向量,则取bk+1=

数学-线性代数-#1 表示及解方程组的新视角

线性代数-#1 表示及解方程组的新视角 学习线性代数之前,我们解n元一次方程组的方法(消元法)着眼于行,把每一行当成一个独立的整体进行处理,最后将各行联系起来求解. 而线性代数为我们提供了一个新视角:着眼于列. 以二元一次方程组为例,即把方程组表示为系数x乘以未知数x的系数组成的列向量v1与系数y乘以未知数y的系数组成的列向量v2通过平行四边形/三角形法则相加后得到方程组每一行的常数项所组成的列向量v3. 在这个视角下,我们可以发现: 1.代数学中的方程组可以通过向量的画法表示为几何学中的列图像

线性方程组的分解法——列主元消去法

1.代码 %%列主元消去法 function ECPE = Elimination_of_column_pivot_entries(M,b) global n; [n,n] = size(M); B =[M,b]; R_A = rank(M);R_B = rank(B); if R_A ~= R_B disp('方程无解'); elseif (R_A == R_B)&&(R_A == n) disp('此方程有唯一解'); for k = 1:n-1 B = Column_pivot_tr

解同余式ax ≡ c(mod m)

将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c: 利用扩展欧几里得算法解出 au + mv =g 一个特解(u0, v0) 所以可用整数c/g乘上上式 au0*(c/g) + mv0*(c/g) = c 得到原式的解x0 = u0*(c/g) 解的个数: 假设x1是ax ≡ c(mod m)的其他解 ax1 ≡ ax2(mod m),所以m整除

【转】小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)

转:https://blog.csdn.net/cqfdcw/article/details/84995904 小波与小波包.小波包分解与信号重构.小波包能量特征提取   (Matlab 程序详解) -----暨 小波包分解后解决频率大小分布重新排列问题 本人当前对小波理解不是很深入,通过翻阅网络他人博客,进行汇总总结,重新调试Matlab代码,实现对小波与小波包.小波包分解与信号重构.小波包能量特征提取,供大家参考,后续将继续更新! 本人在分析信号的过程中发现,按照网上所述的小波包分解方法理解

三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)

分析用下列迭代法解线性方程组 4 -1 0 -1 0 0       0 -1 4 -1 0 -1 0        5 0 -1 4 -1 0 -1        -2 -1 0 -1 4 -1 0        5 0 -1 0 -1 4 -1        -2 0 0 -1 0 -1 4         6 的收敛性,并求出使||Xk+1-Xk||2<=0.0001的近似解及相应的迭代次数. (1)     雅可比迭代法: (2)     高斯-赛德尔迭代法: (3)     SOR迭代

解不定方程ax+by=m的最小解

给出方程a*x+b*y=c,其中所有数均是整数,且a,b,c是已知数,求满足那个等式的x,y值?这个方程可能有解也可能没解也可能有无穷多个解(注意:这里说的解都是整数解)? 既然如此,那我们就得找出有解和无解的条件! 先给出定理:方程a*x+b*y=c有解,当且仅当 c%gcd(a,b)=0. 定理的证明很容易,如下: 证明: 若c%gcd(a,b)=0,则一定存在一个整数K,有c=K*gcd(a,b), 而我们知道a*x+b*y=gcd(a,b)一定存在解(x1, y1),所以就有K*(a*x

由解方程组说起

一组自变量X(x1,x2,x3...,xn),存在某个关系,使得 Y=H(X)=w1*x1+w2*x2+....+w3*x3=W*X    (1) 问题: 求出这组W. 分析:类似求解线性方程组. 1   当r(w)<n,即有多组W满足,经过一个点的,有无数条直线 2   当r(w)=n,即仅一组W满足,经过两个点的,有且仅有条直线. 3   当r(w)>n,即没有一组W满足,经过多个点的直线. 对于1,齐次方程组,非零解问题 y=x\cdot w 对于2,齐次方程组,唯一解问题 克莱姆法则: