zoukankan      html  css  js  c++  java
  • 矩阵LU的分解

    #include<iostream>
    #include<iomanip>
    #include<fstream>
    #include<string>
    #include<stdlib.h>
    using namespace std;
    void main()
    {
        //ifstream inf("input.dat");
    	int A_N;       //矩阵A的阶数
    	cout<<"请输入矩阵的阶数"<<endl;
    	cin>>A_N;
    	double **A_Matrix;    //矩阵A
    	double **L_Matrix;    //矩阵L
    	double **U_Matrix;    //矩阵U
    	//cout<<"请输入矩阵A的行数和列数"<<endl;
        //cout<<"阶数:"<<'	';    
    	//A_N=4;         //输入行数
    	A_Matrix=(double **)new double *[A_N];// 为矩阵A的行数动态分配空间
    	L_Matrix=(double **)new double *[A_N]; //为矩阵L的行数动态分配空间
    	U_Matrix=(double **)new double *[A_N]; //为矩阵U的行数动态分配空间
    	for(int i=0;i<A_N;i++)
    	{
    		A_Matrix[i]=new double[A_N];   //为矩阵A的每一列动态分配空间
    		L_Matrix[i]=new double[A_N];   //为矩阵L的每一列动态分配空间
    		U_Matrix[i]=new double[A_N];   //为矩阵U的每一列动态分配空间
    	}
    	cout<<"请按行优先的顺序输入矩阵A"<<endl;
    	for(int i=0;i<A_N;i++)
    	{
    		for(int j=0;j<A_N;j++)
    		{
    			cin>>A_Matrix[i][j];   //矩阵输入
    		}
    	}
    	//cout<<"请以行优先的顺序输入"<<endl;
    //	for( i=0;i<A_N;i++)
    //	{
            //cout<<"请输入第"<<i<<"行"<<endl;
    		//for(int j=0;j<A_N;j++)
    	/* int i=0;	//{
    	while(!inf.eof())
    	{
    		char *s1,*s2,*s3,*s4;//声明字符
    		s1=new char[4];    //动态分配内存
    		s2=new char[4];
    		s3=new char[4];
    		s4=new char[4];
    		s5=new char[2];
            inf>>s1>>s2>>s3>>s4;//将文件input.dat中的数据存入字符
            A_Matrix[i][0]=atof(s1);//将读取到的字符转换为double类型
    	    A_Matrix[i][1]=atof(s2);
    	    A_Matrix[i][2]=atof(s3);
    	    A_Matrix[i][3]=atof(s4);
    	    A_Matrix[i][4]=atof(s5);
    	    i++;
    	}
    	inf.close();*/
    	   //输入矩阵A
    		//}
    //	}
    	for(int i=0;i<A_N;i++)
    	{
    		U_Matrix[0][i]=A_Matrix[0][i]; //容易看出A和U的第一行元素对应相等
    		for(int j=i+1;j<A_N;j++)     //U矩阵的下三角为0;
    		{
    			U_Matrix[j][i]=0;	
    		}	
    	}
    	for(int i=0;i<A_N;i++)
    	{
    		L_Matrix[i][0]=A_Matrix[i][0]/U_Matrix[0][0];//矩阵L为单位下三角矩阵
    		                                             //且L的第一列为矩阵A的第一列除以U的第一个元素
    		L_Matrix[i][i]=1;         //主对角线为1;
    		for(int j=i+1;j<A_N;j++)  //L矩阵的上三角为0
    		{
    			L_Matrix[i][j]=0;
    		}
    	}
    	for(int k=1;k<A_N;k++)  //推理:已知U的前k-1行和L的前k-1列求U的第k行元素和L的第k列元素
    	{
    		for(int j=k,i=k+1;j<A_N;j++,i++)
    		{
                double U_Sum=0;
    			double L_Sum=0;   
    			for(int s=0;s<=k-1;s++)
    			{
    				U_Sum+=L_Matrix[k][s]*U_Matrix[s][j];
    			}
    			U_Matrix[k][j]=A_Matrix[k][j]-U_Sum;
    			if(j==A_N-1)break;
    			for(int s=0;s<=k-1;s++)
    			{
    				L_Sum+=L_Matrix[i][s]*U_Matrix[s][k];
    			}
    			L_Matrix[i][k]=(A_Matrix[i][k]-L_Sum)/U_Matrix[k][k];
    		}	
    	}
    	for(int i=0;i<A_N;i++)   //输出L矩阵
    	{
    		for(int j=0;j<A_N;j++)
    		{
    			cout<<std::left<<setw(10)<<L_Matrix[i][j]<<'	';
    		}
             cout<<'
    ';
    	}
    	cout<<'
    ';
    	cout<<'
    ';
    	for(int i=0;i<A_N;i++)  //输出U矩阵
    	{
    		for(int j=0;j<A_N;j++)
    		{
    			cout<<std::left<<setw(10)<<U_Matrix[i][j]<<'	';
    		}
    		cout<<'
    ';
    	}
    	system("pause");
    }
    

  • 相关阅读:
    Vue_(组件通讯)父子组件简单关系
    JavaWeb_(Struts2框架)Struts创建Action的三种方式
    JavaWeb_(Struts2框架)Servlet与Struts区别
    Vue_(组件通讯)动态组件结合keep-alive
    Vue_(组件通讯)动态组件
    Vue_(组件通讯)组件
    JavaWeb_(Struts2框架)使用Struts框架实现用户的登陆
    JavaWeb_(Struts2框架)使用Servlet实现用户的登陆
    原生Js_实现广告弹窗
    原生Js_简易图片轮播模板
  • 原文地址:https://www.cnblogs.com/zztong/p/6695291.html
Copyright © 2011-2022 走看看