精华内容
下载资源
问答
  • //实验八 高斯消去法和LU三角分解法 #include<iostream> #include<cmath> #define Length 10 using namespace std; class DirectMethod { public: void gaussinput(); void luinput(); void ...
    //高斯消去法和LU三角分解法
    #include<iostream>
    #include<cmath>
    #define Length 10
    using namespace std;
    class DirectMethod {
    public:
    	void gaussinput();
    	void luinput();
    	void gausselimination();
    	void lutriangulationmethod();
    	void gaussdisplay();
    	void inint();
    	void ludisplay();
    private:
    	double A[Length][Length];
    	double B[Length];
    	double C[Length];
    	double X[Length];
    	double L[Length][Length];
    	double U[Length][Length];
    	int n;
    	double a;
    	double b;
    }dm;
    void DirectMethod::gaussinput() {
    	cout << "*****************第一题*****************\n" << endl;
    	cout << "请输入系数矩阵A的维数:n=";
    	cin >> n;
    	cout << "请输入您要求解的方程组的系数矩阵A" << endl;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> A[i][j];
    		}
    	}
    	cout << "请输入您要求解的方程组的常数矩阵B:" << endl;
    	for (int k = 0; k < n; k++) {
    		cin >> B[k];
    	}
    }
    void DirectMethod::luinput() {
    	cout << "\n*****************第二题*****************\n" << endl;
    	cout << "请输入系数矩阵A的维数:n=";
    	cin >> n;
    	cout << "请输入您要求解的系数矩阵A:" << endl;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> A[i][j];
    		}
    	}
    }
    //高斯消去法
    void DirectMethod::gausselimination() {
    	int i, j, k;
    	double AB[Length][Length];
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			AB[i][j] = A[i][j];
    		}
    		AB[i][n] = B[i];
    	}
    	double l;
    	for (i = 0; i < n-1; i++) {
    		for (j = i; j < n-1; j++) {
    			l = -AB[j+1][i] / AB[i][i];
    			for (k = i; k <= n; k++) {
    				AB[j + 1][k] += AB[i][k] * l;
    			}
    		}
    	}
    	X[n-1] = AB[n-1][n] / AB[n-1][n-1];
    	for (i = n - 2; i >= 0; i--) {
    		double sum = 0.0;
    		for (j = i+1; j <= n; j++) {
    			sum += AB[i][j] * X[j];
    		}
    		X[i] = (AB[i][n] - sum) / AB[i][i];
    	}
    }
    void DirectMethod::inint() {
    	int i, j;
    	L[n - 1][n - 1] = { 0 };
    	U[n - 1][n - 1] = { 0 };
    	for (i = 0; i < n; i++) {
    		for (j = 0; j <= i; j++) {
    			L[i][j] = 1;
    		}
    		for (j = i; j < n; j++) {
    			U[i][j] = 1;
    		}
    	}
    }
    //LU三角分解法
    void DirectMethod::lutriangulationmethod() {
    	int i, j, k, m;
    	for (j = 0; j < n; j++) {
    		U[0][j] = A[0][j];
    	}
    	for (i = 1; i < n; i++) {
    		L[i][0] = A[i][0] / U[0][0];
    	}
    	for (k = 1; k < n; k++) {
    		for (j = k; j < n; j++) {
    			double sum = 0;
    			for (m = 0; m <= k - 1; m++) {
    				sum += L[k][m] * U[m][j];
    			}
    			U[k][j] = A[k][j] - sum;
    		}
    		for (i = k + 1; i < n; i++) {
    			double sum = 0.0;
    			for (m = 0; m <= k - 1; m++) {
    				sum += L[i][m] * U[m][k];
    			}
    			L[i][k] = (A[i][k] - sum) / U[k][k];
    		}
    	}
    }
    void DirectMethod::ludisplay() {
    	cout << "矩阵L为:" << endl;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cout << L[i][j] << "\t";
    		}
    		cout << endl;
    	}
    	cout << "矩阵U为:" << endl;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cout << U[i][j] << "\t";
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    void DirectMethod::gaussdisplay() {
    	cout << "用高斯消去法解得方程组的根为:" << endl;
    	for (int i = 0; i < n; i++) {
    		cout << "X" << i + 1 << "=" << X[i] << "  ";
    	}
    	cout << endl;
    }
    int main() {
    	dm.gaussinput();
    	dm.gausselimination();
    	dm.gaussdisplay();
    	dm.luinput();
    	dm.inint();
    	dm.lutriangulationmethod();
    	dm.ludisplay();
    	system("pause");
    	return 0;
    }
    

    展开全文
  • 矩阵求逆 LU三角分解

    千次阅读 2018-09-02 19:18:42
    LU分解源自LUP分解 问题来源:已知Ax=b① 求x L是下三角矩阵,U是上三角矩阵,P是一个置换矩阵(P将在下一篇博客中写出) LUP分解:PA=LU②  由①②可得1.正向替换(设y=Ux):Ly=Pb 2.反向替换:Ux=y 所以 ...

    LU分解源自LUP分解

    问题来源:已知Ax=b① 求x

    L是下三角矩阵,U是上三角矩阵,P是一个置换矩阵(P将在下一篇博客中写出)

    LUP分解:PA=LU

                      由①②可得1.正向替换(设y=Ux):Ly=Pb      2.反向替换:Ux=y

    所以Ax=P^{-1}LUx=P^{-1}Pb=b

    忽略P,下面说明LU的求法:

    1.参数矩阵A做如下划分

    2.对划分好的做分解(这个分解证明简单,问题是怎么想到的(我不知道))

    这个A'-vw(T)/a11是舒尔补(Schur complement)

    3.设A'-vw(T)/a11=L'U'

    然后就递归的求这个舒尔补的LU分解

    图示:

    (a)->(b)的计算:

    这样就能求出LU分解,P是用来防止A是奇异矩阵的。

    参考:《算法导论》第28章,这上面讲的比较啰嗦

    展开全文
  • LU三角分解(matlab程序)

    万次阅读 2017-10-22 14:06:09
    A=[1,2,3;1,3,5;1,3,6]; b=[2,3,4]; x=grout(A,b); function x=grout(B,c) n=size(B,1); L=eye(n); U=zeros(n); for i=1:n  s=0;  t=0;  for j=1:i-1  s=s+L(i,j)*U(j,i:n);... 
    A=[1,2,3;1,3,5;1,3,6];
    
    b=[2,3,4];
    x=grout(A,b);




    function x=grout(B,c)
    n=size(B,1);
    L=eye(n);
    U=zeros(n);
    for i=1:n
        s=0;
        t=0;
        for j=1:i-1
            s=s+L(i,j)*U(j,i:n);
            t=t+L(i+1:n,j)*U(j,i);
        end
       U(i,i:n)= B(i,i:n)-s;
       L(i+1:n,i)=(B(i+1:n,i)-t)/U(i,i);
    end
    y=grout1(L,c);
    x=grout2(U,y);
     


    function y=grout1(B,c)
    n=size(B,1);
    y=zeros(n,1);
    for i=1:n
        s=0;
        for j=1:i-1
            s=s+B(i,j)*y(j);
        end
        y(i)=c(i)-s;
    end
    end




    function x=grout2(U,y)
    n=size(U,1);
    x=zeros(n,1);
    for i=n:-1:1
        s=0;
        for j=n:-1:i+1
            s=s+U(i,j)*y(j);
        end
        x(i)=(y(i)-s)/U(i,i);
    end
    end
    展开全文
  • #include <stdio.h> #include <stdlib.h> #include<stdbool.h> #define MAX 10 double A[MAX][MAX]; double b[MAX]; double X[MAX]; double Y[MAX]; double U[MAX][MAX];...in...
    #include <stdio.h>
    #include <stdlib.h>
    #include<stdbool.h>
    #define MAX 10
    
    double A[MAX][MAX];
    double b[MAX];
    double X[MAX];
    double Y[MAX];
    double U[MAX][MAX];
    double L[MAX][MAX];
    int NUM;
    
    void Input_Matrix()//输入矩阵
    {
        int i,j;
        printf("系数矩阵A的阶数:\n");
        scanf("%d",&NUM);
        for(i=1; i<=NUM; i++)
        {
            printf("系数矩阵A的第%d行元素:\n",i);
            for(j=1; j<=NUM; j++)
                scanf("%lf",&A[i-1][j-1]);
        }
        printf("右端项b:\n");
        for(i=1; i<=NUM; i++)
        {
            scanf("%lf",&b[i-1]);
        }
        printf("\n");
        printf("输入的系数矩阵A:\n");
        for(i=0; i<NUM; i++)
        {
            for(j=0; j<NUM; j++)
                printf("%.4lf\t",A[i][j]);
            printf("\n");
        }
        printf("\n");
        printf("输入的右端项b:\n");
        for(i=0; i<NUM; i++)
            printf("%.4lf\n",b[i]);
    }
    
    bool Direct()
    {
        bool flag = true;
        int r,i,k;
        double sum_u, sum_l;
        for(r=0; r<NUM; r++)
            U[0][r]=A[0][r];
        for(r=1; r<NUM; r++)
            L[r][0] = A[r][0]/A[0][0];
        for(r=1; r<NUM; r++)
        {
            for(i=r; i<NUM; i++)
            {
                sum_u = 0;
                for(k=0; k<r; k++)
                    sum_u += L[r][k]*U[k][i];
                U[r][i] = A[r][i]-sum_u;
            }
            for(i=r+1; i<NUM&&r!=NUM-1; i++)
            {
                sum_l = 0;
                for(k=0; k<r; k++)
                    sum_l += L[i][k]*U[k][r];
                L[i][r] = (A[i][r]-sum_l)/U[r][r];
            }
        }
        for(i=0; i<NUM; i++)
            L[i][i]=1.0;
        for(r=0; r<NUM; r++)
        {
            if(U[r][r]==0) //等价于判断矩阵的顺序主子式是否为0
            {
                flag = false;
                return flag;
            }
        }
        //回代求解
        Y[0] = b[0];
        double sum;
        for(i=1; i<NUM; i++)
        {
            sum = 0;
            for(k=0; k<i; k++)
                sum += L[i][k]*Y[k];
            Y[i] = b[i]-sum;
        }
        X[NUM-1] = Y[NUM-1]/U[NUM-1][NUM-1];
        for(i=NUM-2; i>=0; i--)
        {
            sum = 0;
            for(k=i+1; k<NUM; k++)
                sum += U[i][k]*X[k];
            X[i] = (Y[i]-sum)/U[i][i];
        }
        return flag;
    }
    
    int main()
    {
        int i,r;
        Input_Matrix();
        if (Direct())
        {
            printf("\n");
            printf("Result:\n");
            for (i=0; i<NUM; i++)
                printf("%.4lf\n",X[i]);
            printf("\n");
            printf("L:\n");
            for(i=0; i<NUM; i++)
            {
                for(r=0; r<NUM; r++)
                    printf("%.4lf\t",L[i][r]);
                printf("\n");
            }
            printf("\n");
            printf("U:\n");
            for(i=0; i<NUM; i++)
            {
                for(r=0; r<NUM; r++)
                    printf("%.4lf\t",U[i][r]);
                printf("\n");
            }
        }
        else
            printf("Failed.n");
        return 0;
    }
    
    
    展开全文
  • 对于高斯消元法我实现了通用的算法实现,但是对于LU三角分解法,由于算法实现难度太高,因此我并未能完成LU三角分解法的通用实现,而只实现了3元的解法,有些可惜。 不是程序没有bug,而是没有发现好的测试用例。...
  • 实现了矩阵的LU分解,也称三角分解,输入为n阶方阵A,输出为L和U,同时会自动进行矩阵是否可以进行LU分解的判断,注释翔实,有一定基础的一定可以轻松看懂。
  • LU三角矩阵分解代码

    2019-04-24 19:48:55
    该代码包包括对一个矩阵进行LU形势的分解的代码,具体详情请看代码!
  • 矩阵分解 三角分解(LU分解)

    万次阅读 多人点赞 2017-11-17 11:32:17
    三角分解(LU分解) 在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,...
  • 三角分解LU分解)

    2021-01-12 23:03:42
    三角分解LU分解) 作者:HDU-STEA_banjiu 时间:2021/1/11 1.LU分解的意义 在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是...
  • LU三角分解

    2013-05-11 15:34:07
    gauss分解法的下三角分解求矩阵的解,经典的doolittle算法
  • 矩阵三角分解法(LU分解)

    万次阅读 2018-01-13 16:52:42
    矩阵分解法是高斯消元法的变形,它的复杂度和高斯消元法一样都是O(n^3),但是矩阵分解法在处理线性方程组系(具有相同的系数矩阵,但是右端项不同的方程组)时,运算比较方便。  下面是矩阵分解原理的原理:   ...
  • LU分解法,列主元三角分解法MATLAB代码,有详细注释,易于理解
  • LU分解法且是列主元三角分解法MATLAB代码,有详细注释,顺着思路看容易理解
  • function [L,U]=Doolittle(A)% 矩阵的三角分解法之LU分解之Doolittle分解 A=LU% Doolittle分解:LU分解中L为单位下三角阵,U为上三角阵% 说明:n阶(n>=2)矩阵A有惟一杜里特尔分解的充要条件是:A的前n-1个顺序...
  • function [L,U]=Crout(A)% 矩阵的三角分解法之LU分解之Crout分解 A=LU% Crout分解:LU分解中L为下三角阵,U为单位上三角阵% 说明:n阶(n>=2)矩阵A有惟一Crout分解的充要条件是:A的前n-1个顺序主子式不为0% ...
  • 该程序允许您从方阵的 LU 分解中获得 L 和 U 矩阵。
  • 例如,我们知道上三角矩阵和下三角矩阵是容易求解的,或者对角矩阵是最理想的求解形式,我们通过矩阵的分解去将原本的复杂问题,转化为若干个易于求解的矩阵来运算。一、高斯消去法与LU分解大学本科期间学校讲授的...
  • 矩阵的三角分解是求解线性方程组常用的方法,包括LU分解,LDU分解,杜利特(Doolittle)分解,克劳特(Crout)分解,LLT(乔累斯基Cholesky)分解,LDLT(不带平方根乔累斯基)分解等,以及为了满足分解条件又加入行列变换的...
  • 矩阵的三角分解是求解线性方程组常用的方法,包括LU分解,LDU分解,杜利特(Doolittle)分解,克劳特(Crout)分解,LLT(乔累斯基Cholesky)分解,LDLT(不带平方根乔累斯基)分解等,以及为了满足分解条件又加入行列变换的...
  • LU分解

    千次阅读 2019-01-02 15:40:23
    在高等工程数学一书中, LU分解(LU Decomposition)是矩阵分解中最普通的一种,也是最经典的一种,它可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积,有时是它们和一个置换矩阵的乘积。LU分解主要...
  • (1)计算LU (2)计算XY 复杂度依然为n^3级别,但运算量比高斯小 int n; double a[222][222],b[222]; double u[222][222],l[222][222]; double y[222],x[222]; int get_lu() { rpp(k,n) //求u的第k行,l的第 k列 ...
  • LU矩阵分解

    2012-05-29 18:11:45
    进行Doolittle分解,得到A=LU,其中L为单位下三角矩阵,U为上三角矩阵;这里的Doolittle分解实际就是Gauss变换;
  • 一、矩阵的三角分解法 定义:矩阵 A 分解为一个单位下三角阵(L)和一个上三角阵(U)的乘积的形式,称为对 A 三角分解。即: 其中,, 现考虑方程组:,设,则 ,通过 2 式求得Y 的解,然后带入 1 式,求得...
  • vb LU分解_lu分解_源码

    2021-10-02 09:49:58
    将系数矩阵A转变成等价两个矩阵L和U的乘积 ,其中L和U分别是单位下三角矩阵和上三角矩阵
  • 从高斯消元到矩阵的三角分解LU

    千次阅读 2016-02-02 10:40:47
    本文主要介绍以 Gauss 消去法为根据导出的矩阵的三角(或 LU分解
  • 文章目录1.LU分解2. LDLT分解法3. Cholesky分解4. QR分解5.SVD分解6. Jordan 分解 矩阵分解是将矩阵拆解为数个矩阵的乘积,可分为三角分解、满秩分解、QR分解、Jordan分解和SVD(奇异值...三角分解(LU分解):是矩阵分解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,316
精华内容 926
关键字:

lu三角分解