(原创)利用克拉默法则求解多元一次方程组

package  zouyf.matrix;

/**
 * 
@author zouyf 2008-4-7 本程序利用克拉默法则求解多元一次方程组
 
*/

public   class  GetMatrix
{
    
private double[][] savequot;// 保存变量系数
    private double[] constquot;// 保存常量系数
    private double[] saveResult;// 保存解的集合

    
public GetMatrix(double quot[][])
    
{
        
int count = quot.length;
        savequot 
= new double[count][count];
        constquot 
= new double[count];
        saveResult 
= new double[count];
        
int i = 0, j = 0;
        
for (i = 0; i < count; i++)
        
{
            
for (j = 0; j < count; j++)
            
{
                savequot[i][j] 
= quot[i][j];
            }

            constquot[i] 
= quot[i][count];
            saveResult[i] 
= 0;
        }

    }


    
private double getMatrixResult(double input[][])// 递归的方法求得某个行列式的值
    {
        
if (input.length == 2)//递归出口,为二阶行列式时,直接返回
        {
            
return input[0][0* input[1][1- input[0][1* input[1][0];
        }
 
        
else
        
{
            
double[] temp = new double[input.length];//存放第一列的系数值
            double[][] tempinput = new double[input.length - 1][input.length - 1];
            
double result = 0;
            
for (int i = 0; i < input.length; i++)
            
{
                temp[i] 
= input[i][0];
                
int m = 0, n = 0;
                
for (int k = 0; k < input.length; k++)
                
{
                    
if (k != i)
                    
{
                        
for (m = 0; m < input.length - 1; m++)
                        
{
                            tempinput[n][m] 
= input[k][m + 1];//删除当前变量系数所在的行和列,得到减少一阶的新的行列式
                        }

                        n
++;
                    }

                }

                
if (i % 2 == 0)// 递归调用,利用代数余子式与相应系数变量的乘积之和得到多阶行列式的值
                {
                    result 
= result + temp[i] * getMatrixResult(tempinput);
                }

                
else
                
{
                    result 
= result - temp[i] * getMatrixResult(tempinput);
                }

            }

            
return result;
        }

    }

    
    
private double[][] getReplaceMatrix(int i)// 用常数系数替换相应的变量系数,得到新的行列式
    {
        
double tempresult[][] = new double[savequot.length][savequot.length];
        
for (int m = 0; m < savequot.length; m++)
        
{
            
for (int n = 0; n < savequot.length; n++)
            
{
                
if (i != m)
                
{
                    tempresult[n][m] 
= savequot[n][m];
                }
 
                
else
                
{
                    tempresult[n][i] 
= constquot[n];// 用常量系数替换当前变量系数
                }

            }

        }

        
return tempresult;
    }


    
public double[] getResult()
    
{
        
double basic = 0;
        basic 
= getMatrixResult(savequot);//得到变量系数行列式的值
        if (Math.abs(basic) < 0.00001)//得到行列式的值为零时,表示此方程组没有唯一解
        {
            System.out.println(
"it dose not have the queue result!");
            
return saveResult;
        }

        
double[][] temp = new double[saveResult.length][saveResult.length];
        
for (int i = 0; i < saveResult.length; i++)
        
{
            temp 
= getReplaceMatrix(i);
            saveResult[i] 
= getMatrixResult(temp) / basic;//依次计算得到每一个变量的解
        }

        
return saveResult;
    }


    
public static void main(String[] args)
    
{
        
/**
         * 测试方程组 
         * 2a+b-5c+d=8 
         * a-3b-6d=9 
         * 2b-c+2d=-5 
         * a+4b-7c+6d=0
         
*/

        
double[][] test = 21-518 }1-30-69 },
                
02-12-5 }14-760 } }
;
        GetMatrix gm 
= new GetMatrix(test);
        
double[] uu = new double[test.length];// 返回结果集
        uu = gm.getResult();
        
for (int i = 0; i < uu.length; i++)
        
{
            System.out.println(uu[i] 
+ ",");
        }

    }

}

 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
克拉默法则是一种求解线性方程组的方法,可以使用C语言实现。具体步骤如下: 1. 定义系数矩阵A和常数矩阵B; 2. 计算系数矩阵A的行列式D; 3. 对于方程组中的每个未知数,将常数矩阵B替换为系数矩阵A的对应列,并计算替换后的矩阵的行列式D_i; 4. 未知数的即为D_i/D。 以下是C语言代码实现: ```c #include <stdio.h> #define N 3 // 方程组未知数个数 int main() { double A[N][N] = {{2, 1, -1}, {-3, -1, 2}, {-2, 1, 2}}; // 系数矩阵 double B[N] = {8, -11, -3}; // 常数矩阵 double D = 0; // 系数矩阵的行列式 double D_i[N]; // 替换后的矩阵的行列式 double X[N]; // 方程组 // 计算系数矩阵的行列式 for (int i = 0; i < N; i++) { double temp = 1; for (int j = 0; j < N; j++) { temp *= A[(i+j)%N][j]; } D += temp; temp = 1; for (int j = N-1; j >= 0; j--) { temp *= A[(i-j+N)%N][j]; } D -= temp; } // 计算替换后的矩阵的行列式 for (int k = 0; k < N; k++) { double temp[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j == k) { temp[i][j] = B[i]; } else { temp[i][j] = A[i][j]; } } } double D_temp = 0; for (int i = 0; i < N; i++) { double temp2 = 1; for (int j = 0; j < N; j++) { temp2 *= temp[(i+j)%N][j]; } D_temp += temp2; temp2 = 1; for (int j = N-1; j >= 0; j--) { temp2 *= temp[(i-j+N)%N][j]; } D_temp -= temp2; } D_i[k] = D_temp; } // 计算方程组 for (int i = 0; i < N; i++) { X[i] = D_i[i] / D; } // 输出方程组 printf("方程组为:\n"); for (int i = 0; i < N; i++) { printf("x%d = %f\n", i+1, X[i]); } return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值