MATLAB运用(5)——线性代数方程组的解法

简介: MATLAB运用(5)——线性代数方程组的解法

线性代数方程组的解法

一、实验要求

分别采取Guass消元法(不选主元、手动选主元、自动选主元)、Jacobi迭代法、Guass-Seidel迭代法、超松弛迭代法计算下列矩阵的线性方程组。


(1)矩阵


image.png

(2)希尔伯特矩阵

image.png

(3)其他矩阵


二、实验过程

实验成果



主程序

1、Guass消去法主元选择函数(不选主元、手动选主元、自动选主元)和Jacobi迭代法、Guass-Seidel迭代法、超松弛迭代法的函数

   methods (Access = private)
        %主元选择所需要的函数
        function [m,l] = mymax(app,x)
            %获取数列x中绝对值最大的值及其下标
            m=x(1);
            l=1;
            n=length(x);
            for i =2:n
                if abs(x(i))>abs(m)
                    m=x(i);
                    l=i;
                end
            end
        end
        function B=zhuxuanxq(app,A,value)
            %主元选取(自动,手动,不选)
            [row,col ]=size(A);
            if value=='自动选主元'
                [m,L]=mymax(app,A(1:row));
            elseif value=='不选主元'
                m=A(1);
                L=1;
            elseif value=='手动选主元'
                A1=A(1:row);
                L=str2num(char(inputdlg('请输入最大主元所在的行:')));
                m=A1(L);
            end
            if m==0
                return
            end
            B=A;
            B(1,:)=A(L,:);
            B(L,:)=A(1,:);
            for x =2:row
                B(x,:)=B(x,:)-B(1,:)*B(x,1)/m;
            end
        end
        function B=zhuxuanbh(app,A,value)
            %主元选取变换
            [row,col]=size(A);
            B=zeros(row,col);
            for i = 1:row-1
                B(i:row,i:col)=zhuxuanxq(app,A,value);
                A=B(i+1:row,i+1:col);
            end
        end
        %计算方法选择
        function y=jacobi(app,A,b,x0,tol)
            % Jacobi迭代法
            D=diag(diag(A));
            L=tril(A,-1);
            U=triu(A,1);
            B=-D\(L+U);
            F=D\b';
            x0=x0';
            y=B*x0+F;
            n=1;
            while norm(y-x0)>=tol
                x0=y;
                y=B*x0+F;
                n=n+1;
            end
        end
        function y=guass_seidel(app,A,b,x0,tol)
            % guass_seidel迭代
            D=diag(diag(A));
            L=tril(A,-1);
            U=triu(A,1);
            G=-(D+L)\U;
            F=(D+L)\b';
            x0=x0';
            y=G*x0+F;
            n=1;
            while norm(y-x0)>=tol
                x0=y;
                y=G*x0+F;
                n=n+1;
            end
        end
        function y=sor(app,A,b,w,x0,tol)
            %超松弛迭代
            D=diag(diag(A));
            L=tril(A,-1);
            U=triu(A,1);
            lw=(D+w*L)\((1-w)*D-w*U);
            F=(D+w*L)\b'*w;
            x0=x0';
            y=lw*x0+F;
            n=1;
            while norm(y-x0)>=tol
                x0=y;
                y=lw*x0+F;
                n=n+1;
            end
        end
    end

2、【矩阵】下拉框

            global A;
            Nb = string(app.DropDown.Value);
            n=str2num(char(app.TextArea.Value));
            if Nb=='矩阵 A'
                a1=sparse(1:n,1:n,6);
                a2=sparse(1:n-1,2:n,1,n,n);
                A=a1+a2+8*a2';
                app.bEditField.Value = '7 15 15 15 15 15 15 15  15 14';
            elseif Nb=='矩阵 H'
                A=hilb(n);
            elseif Nb=='其他'
                Ans=inputdlg('请输入矩阵A:','text_6',3);
                A=str2num(Ans{1});
                app.TextArea.Enable='off';   
            end

3、【解法】下拉框

            if string(app.DropDown_2.Value)=='Gauss消去法'
                app.EditField.Enable='off';
                app.wEditField.Enable='off';
            else
                app.EditField.Enable='on';
                app.wEditField.Enable='on';
            end

4、【OK】按钮

            value=string(app.DropDown_3.Value);
            b=str2num(char(app.bEditField.Value));
            global A;
            if string(app.DropDown_2.Value)=='Gauss消去法'
                B=zhuxuanbh(app,[A b'],value);
                [row ,col]=size(B);
                X=zeros(row,1);
                X(row)=B(row,col)/B(row,row);
                for k = row-1:-1:1
                    X(k)=(B(k,col)-B(k,k+1:row)*X(k+1:row))/B(k,k);
                end
            else
                tol=str2num(char(app.EditField.Value));
                x0=str2num(char(app.EditField_3.Value));
                w=str2num(char(app.wEditField.Value));
                if isempty(x0)
                    errordlg('请输入初值x0')
                    return
                end
                if string(app.DropDown_2.Value)=='Jacobi迭代法'
                    X=jacobi(app,A,b,x0,tol);
                elseif string(app.DropDown_2.Value)=='G-S迭代法'
                    X=guass_seidel(app, A,b,x0,tol);
                elseif string(app.DropDown_2.Value)=='SOR迭代法'
                    X=sor(app,A,b,w,x0,tol);
                end
            end
            app.EditField_2.Value=num2str(X');

5、【close】按钮

            app.DropDown.Value='矩阵 A';
            app.DropDown_2.Value = 'Gauss消去法';
            app.bEditField.Value = '7 15 15 15 15 15 15 15  15 14';
            app.EditField.Enable='off';
            app.wEditField.Enable='off';
            app.EditField_3.Value='';
            app.EditField_2.Value='';


目录
相关文章
|
6月前
|
算法
MATLAB求解线性方程组的八种方法
求解线性方程分为两种方法--直接法和迭代法 常见的方法一共有8种 直接法 Gauss消去法 Cholesky分解法 迭代法 Jacobi迭代法 Gauss-Seidel迭代法 超松弛迭代法 共轭梯度法 Bicg迭代法 Bicgstab迭代法
297 0
|
算法
MATlAB运用——数值积分
MATlAB运用——数值积分
169 0
|
存储
matlab求解方程和多元函数方程组
matlab求解方程和多元函数方程组
516 0
|
29天前
|
机器学习/深度学习 人工智能
MATLAB代数求解
【10月更文挑战第10天】MATLAB是一款强大的数学计算软件,支持数值计算和符号计算。本文介绍了MATLAB中符号计算与代数求解的基本使用方法,包括符号变量定义、表达式简化、求导和积分等操作,并通过代码实例进行说明。此外,还展示了符号计算在物理与工程中的应用,如动力学模型分析和电路分析。
51 1
|
6月前
|
算法
MATLAB求解非线性方程组的五种方法
求解线性方程分为两种方法--二分法和迭代法 常见的方法一共有5种 二分法 迭代法 牛顿法 割线法 拟牛顿法 Halley法
147 0
|
算法
MATLAB运用(4)-常微分方程的性态和初值问题
MATLAB运用(4)-常微分方程的性态和初值问题
112 1
|
机器学习/深度学习 算法 数据挖掘
使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)
使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)
|
算法
数值分析算法 MATLAB 实践 线性方程组 SOR迭代法
数值分析算法 MATLAB 实践 线性方程组 SOR迭代法
159 0
|
算法
数值分析算法 MATLAB 实践 线性方程组迭代法
数值分析算法 MATLAB 实践 线性方程组迭代法
95 0
|
算法
数值分析算法 MATLAB 实践 线性方程组迭代法
数值分析算法 MATLAB 实践 线性方程组迭代法
92 0