⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 逆矩阵.cpp

📁 矩阵的求逆
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#define MAX 10

void main()
{
	    int j;
		double zh;
	    double E[MAX][MAX];//定义单位矩阵
		for (int i=0;i<MAX;i++)
			for(j=0;j<MAX;j++)
			{
				if(i==j)E[i][j]=1;
				else
					E[i][j]=0;
			}
		double y[MAX],s1,s2,x[MAX][MAX];
		double a[MAX][MAX];
		int p[MAX]; // 记录分解过程中的行交换!
		int k,N;
		cout<<"请输入矩阵的阶数:";
        cin>>N;
		cout<<"请输入矩阵:"<<endl;
        for (i=0;i<N;i++)
			for (j=0;j<N;j++)
			{
			   cin>>a[i][j];
			}

		for(k=0;k<N;k++)
			p[k] = k+1;  // 初始化,相当于单位阵
//****** 开始LU分解 *************
		for(k=0;k<N-1;k++)
		{
			int s,t; //s存储当前列绝对值最大的元素所在的行号,t为中间变量
			s=k;
			for(i=k+1;i<N;i++)
			{
				if(fabs(a[i][k])>fabs(a[s][k]))
					s=i;
			} // 选主元素
			if(s!=k)
			{
				double m;
				for(j=0;j<N;j++)// 注意这里要交换k、s两行所有的元素
				{
					m = a[k][j];
					a[k][j] = a[s][j];
					a[s][j] = m;
					zh=E[k][j];E[k][j]=E[s][j];E[s][j]=zh;
				}  // 交换行
				t= p[s];
				p[s] = p[k];
				p[k] = t;  //记录当前行交换
			} 

			if(a[k][k]==0)
			{
				cout << "存在为零的主元素!LU分解不能进行!" << endl;
				continue;
			}// 判定主元素为零,矩阵奇异,方程组解不唯一 

			for(i=k+1;i<N;i++)
			{
				a[i][k] = a[i][k] / a[k][k];  // 矩阵A的严格下三角部分存储L矩阵的严格下三角部分 
				for(j=k+1;j<N;j++)
				{
					a[i][j] = a[i][j] - a[i][k] * a[k][j];
				}  //计算U矩阵     
			}
		}
		//下面是求解过程
		for(k=0;k<N;k++)
		{
            y[0]=E[k][0];
	     	for(i=1;i<N;i++)
			{   
		       s1=0;
		       for(j=0;j<i;j++)
                  s1=s1+a[i][j]*y[j];
		       y[i]=E[k][i]-s1;
			}   
	    	x[N-1][k]=y[N-1]/a[N-1][N-1];
    		for(i=N-2;i>=0;i--)
			{
		        s2=0;
		        for(j=i+1;j<N;j++)
			       s2+=a[i][j]*x[j][k];
	 	      x[i][k]=(y[i]-s2)/a[i][i];
			}	
		}
		for(i=0;i<N;i++)//输出方阵
			for(j=0;j<N;j++)
			{
			   cout<<x[i][j]<<"   ";
			   if(j==N-1)cout<<endl;
			}
} //程序结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -