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

📄 sequation.java

📁 求解线形方程组
💻 JAVA
字号:
package com.lc.v3.scm.datamining.math;

/***********************************************************************
 * @author leitw
 *
 *  at Taian - Shandong province ,China
 *  corporation langchao Group
 *  15/2/2005
 **********************************************************************/

/***********************************************************************
 * This class was write for Line sequation group,The line sequation was used 
 * widely ,such as regression analysic,linear programming in operational management
 * and so on.
 * This class offered some basic method for solute line sequations,
 * the first step offered guass method
 * ***********************************************************************/

/************************************************************************
*线性方程组,根据AX=B,A为系数矩阵,B为常数矩阵
*线性方程求解法则参见线性代数
*
*****************************************************************/
public class Sequation 
{
	public Sequation()
	{
	}
    
	/***********************************************************************
	*简要说明:全选主元高斯消元法
	*功能:解线性方程组
	*输入参数:
	*    @param  double[][]  coeffA  系数矩阵 n×n
	*    @param  double[][]  constB  常向量  线性方程组的右端 n×m
	*    @param  double[][]  resultX 返回线性方程组的解   n×m
	*    @param  int    n  矩阵coeffA的阶数
	*    @param  int    m  矩阵const的列数
	*输出参数:
	*    @return double abs  矩阵coeffA的行列式,如果abs=0,比较复杂,本函数不作处理,认为没有希望得到的解当|coeffA|=0,可能有无穷多解
	**********************************************************************/
	public static  double  guassEquation(double[][] coeffA ,double[][] constB, double[][] resultX , int n , int m )
	{
		int i,j,k,row,line;
		double temp,max,abs=1;
		/*
		*change用于记载系数矩阵列交换的信息
		*/
		int[] change = new int[n] ;
		for(i=0;i<n;i++) change[i]=i ;
		/*
		*从矩阵的第一行开始
		*a、找主元
		*b、行列互换
		*c、线性变换
		*/
		for(i=0;i<n-1;i++)
		{
			/*
			*找主元
			*/
			row=i;line=i; max = Math.abs(coeffA[i][i]);
			for(j=i;j<n;j++)
			{
				for(k=i;k<n;k++)
					{
						temp = Math.abs(coeffA[j][k]);
						if(temp>max)
							{
							max = temp;
							row = j;
							line = k;
						
							}
			
					}
			}
			/*
			*主元找到了为第row行,第line列,值为max
			*如果max=0 ,表示行列式为0,返回0,退出
			*/
			if(max==0)
			{
				return 0;
			}
			/*
			*第二步,行列互换,准备先行变换
			*/
			if(row != i)
			{
				for(k=i;k<n;k++)
				{
					temp = coeffA[i][k];
					coeffA[i][k] = coeffA[row][k];
					coeffA[row][k] = temp ;
				}
				for(k=0;k<m;k++)
				{
					temp=constB[i][k];
					constB[i][k]=constB[row][k];
					constB[row][k]=temp;
				}
			}

			if(line != i)
			{
				for(j=0;j<n;j++)
				{
					temp = coeffA[j][line];
					coeffA[j][line]= coeffA[j][i];
					coeffA[j][i]=temp;
				}
				/*
				*记载变量位置的变化(列变换信息标识了变量位置的变化信息)
				*/
				k=change[i];
				change[i]=change[line];
				change[line]= k;
			}

			/*
			*开始线性变换,先对第i行归一化,然后对余行线性变换
			*/
			abs *=coeffA[i][i];
			for(k=i+1;k<n;k++) coeffA[i][k]/=coeffA[i][i];
			for(k=0;k<m;k++) constB[i][k] /= coeffA[i][i];
			coeffA[i][i]=1;

			/*
			*余矩阵变换
			*/
			for(j=i+1;j<n;j++)
			{
				for(k=i+1;k<n;k++) coeffA[j][k] -= coeffA[j][i]*coeffA[i][k];
				for(k=0;k<m;k++) constB[j][k] -= coeffA[j][i]*constB[i][k];
				coeffA[j][i] =0 ;
			
			}

		}
		abs *= coeffA[n-1][n-1];

		/*
		*回代消元
		*/
		for(k=0;k<m;k++)
		{
			constB[n-1][k] /= coeffA[n-1][n-1];
			for(i=n-2;i>=0;i--)
				for(j=i+1;j<n;j++)
				constB[i][k]-=coeffA[i][j]*constB[j][k];
		}

		/*
		*根据change,调整变量顺序,得最后解
		*/
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
			resultX[change[i]][j]=constB[i][j];
			}
		}
		return abs ;
	}
}

⌨️ 快捷键说明

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