对于高斯消元逻辑错误 [英] Logic error for Gauss elimination

查看:87
本文介绍了对于高斯消元逻辑错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

的逻辑错误问题,高斯消元code ...这code是从1990年的我的数值方法的文字。在code从输入以下资料─在不产生正确的输出...

运行示例:

 解决线性方程组的
         使用高斯消元 这个程序使用高斯消元来解决
 系统Ax = b的,其中A是已知的矩阵
 系数,B是已知常数的矢量
 和x是未知的柱基质。
 方程数:3 输入矩阵的元素[A]
 A(1,1)= 0
 A(1,2)= -6
 A(1,3)= 9
 A(2,1)= 7
 A(2,2)= 0
 A(2,3)= -5
 A(3,1)= 5
 A(3,2)= -8
 A(3,3)= 6 输入并[b]向量的元素
 B(1)= -3
 B(2)= 3
 B(3)= -4         解线性方程组的         解决的办法是
         ×(1)= 0.000000
         ×(2)= - 1。#IND00
         X(3)= -1。#IND00
         行列式= -1。#IND00
preSS任意键继续。 。 。

从文本复制的code ...

  //修改$ C $从C的数值方法2009年文本 - 六月Ç#包括LT&;&stdio.h中GT;
#包括LT&;&math.h中GT;
#定义MAXSIZE 20//函数原型
INT高斯(双A [] [MAXSIZE],重B [],诠释N,双* DET);INT主要(无效)
{
    双A [MAXSIZE] [MAXSIZE],B [MAXSIZE],DET;
    INT I,J,N,RETVAL;    输出(的线性方程组\\ n \\ T溶液);
    的printf(\\ n \\ T使用高斯消元\\ n);
    的printf(\\ n这个程序使用高斯消元,解决了);
    的printf(\\ n系统AX = B,其中A是已知矩阵);
    的printf(\\ n个系数,B是已知常数的矢量);
    的printf(\\ n和x是未知的柱基质。);    //获取方程的数
    N = 0;
    而(N< = 0 || N'GT; MAXSIZE)
    {
    的printf(方程\\ N多:);
    scanf函数(%d个,&安培; N);
    }    //读取矩阵A
    的printf(\\ n输入矩阵的元素[A] \\ n);
    对于(i = 0; I< N;我++)
    为(J = 0; J< N; J ++)
    {
    的printf(A(%D,%D)=,I + 1,J + 1);
    scanf函数(%LF,&安培; A [I] [J]);
    }
    //读取{B}矢量
    的printf(\\ n输入[B]载体\\ n个元素);
    对于(i = 0; I< N;我++)
    {
    的printf(B(%D)=,I + 1);
    scanf的(%LF,和b由[i]);
    }    //调用高斯消元函数
    RETVAL =高斯(A,B中,n,&放大器; DET);    //打印结果
    如果(RETVAL == 0)
    {
    的printf(线性方程组的\\ n \\ n \\ T溶液);
    的printf(\\ n \\ t的解决方案是);
    对于(i = 0; I< N;我++)
    的printf(\\ n \\ t X(%D)=%LF,I + 1,B [I]);
    的printf(\\ n \\ t =行列式LF%\\ n,DET);
    }
    其他
    的printf(\\ n \\ t奇异矩阵\\ n);    返回0;
 }/ *解决了方程[A] {X} =使用{B}的系统* /
/ *高斯消元法的部分回转。 * /
/ *参数:* /
/ * N - 方程式数* /
/ *一个[n]的[n]的 - 系数矩阵* /
/ * B [N] - 右侧向量* /
/ * * DET - 行列式[A] * /INT高斯(双A [] [MAXSIZE],重B [],诠释N,双* DET)
{
    双TOL,温度,MULT;
    INT npivot,I,J,L,K,标志;    //初始化
    * DET = 1.0;
    TOL = 1E-30; //初始公差值
    npivot = 0;
        // MULT = 0;    //消除前进
    对于(K = 0; K< N; k ++)
    {
    //搜索枢轴最大系数行向A [k]的[K]主元
    对于(I = K + 1; I< N;我++)
    {
    如果(晶圆厂(A [I] [K])GT;晶圆厂(A [k]的[K]))
    {
    //交换行与主元行最大信号元
    npivot ++;
    为(L = 0; L&下; N,L ++)
    {
    TEMP =一个[我] [1];
    一个由[i] [1] = A [k]的[L];
    一个[k]的[1] =温度;
    }
    温度= B [I]
    B〔Ⅰ〕= B [k]的;
    B〔K] =温度;
    }
    }
    //测试奇点
    如果(晶圆厂(A [k]的[K])LT; TOL)
    {
           //矩阵是singular-终止
    标志= 1;
    返回标志;
    }
        //计算determinant-枢轴元件的产物
    * DET = * DET * A [k]的[K];    //消除的X(Ⅰ)的系数
    对(我= K,I< N;我++)
    {
    MULT =一个由[i] [k]的/一个[k]的[K];
    B〔Ⅰ〕= B [Ⅰ] - B [k]的* MULT; //计算常数
    为(J = K,J< N; J ++)//计算系数
    一个[I] [J] =一[I] [J] - 一个[K] [J] * MULT;
    }
    }
    //调整行列式的符号
    如果(npivot%2 == 1)
      * DET = * DET *(-1.0);    //回代
    B〔N] = B [n]的/一个[n]的[N];
    为(ⅰ= N - 1; I&大于1;我 - )
    {
    为(J = N; J> i + 1的; j--)
    B〔I] = B [I] - 一个由[i] [j]的* B [J]。
    B〔Ⅰ〕= B [I] /一个[I - 1] [I];
    }
    标志= 0;
    返回标志;
}

解决方案应该是:1.058824,1.823529,0.882353与DET为-102.000000

任何有识之士为AP preciated ...


解决方案

  //消除的X(I)的系数
对(我= K,I< N;我++)

如果这也许是

 为(I = K + 1; I< N;我++)

现在是这样的,我相信这将导致你本身分割的支点排,零吧。

Logic error problem with the Gaussian Elimination code...This code was from my Numerical Methods text in 1990's. The code is typed in from the book- not producing correct output...

Sample Run:

         SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS
         USING GAUSSIAN ELIMINATION

 This program uses Gaussian Elimination to solve the
 system Ax = B, where A is the matrix of known
 coefficients, B is the vector of known constants
 and x is the column matrix of the unknowns.
 Number of equations: 3

 Enter elements of matrix [A]
 A(1,1) = 0
 A(1,2) = -6
 A(1,3) = 9
 A(2,1) = 7
 A(2,2) = 0
 A(2,3) = -5
 A(3,1) = 5
 A(3,2) = -8
 A(3,3) = 6

 Enter elements of [b] vector
 B(1) = -3
 B(2) = 3
 B(3) = -4

         SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS

         The solution is
         x(1) = 0.000000
         x(2) = -1.#IND00
         x(3) = -1.#IND00
         Determinant = -1.#IND00
Press any key to continue . . .

The code as copied from the text...

//Modified Code from C Numerical Methods Text- June 2009

#include <stdio.h>
#include <math.h>
#define MAXSIZE 20

//function prototype
int gauss (double a[][MAXSIZE], double b[], int n, double *det);

int main(void)
{
    double a[MAXSIZE][MAXSIZE], b[MAXSIZE], det;
    int i, j, n, retval;

    printf("\n \t SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS");
    printf("\n \t USING GAUSSIAN ELIMINATION \n");
    printf("\n This program uses Gaussian Elimination to solve the");
    printf("\n system Ax = B, where A is the matrix of known");
    printf("\n coefficients, B is the vector of known constants");
    printf("\n and x is the column matrix of the unknowns.");

    //get number of equations
    n = 0;
    while(n <= 0 || n > MAXSIZE)
    {
    	printf("\n Number of equations: ");
    	scanf ("%d", &n);
    }

    //read matrix A
    printf("\n Enter elements of matrix [A]\n");
    for (i = 0; i < n; i++)
    	for (j = 0; j < n; j++)
    	{
    		printf(" A(%d,%d) = ", i + 1, j + 1);
    		scanf("%lf", &a[i][j]);
    	}
    //read {B} vector
    printf("\n Enter elements of [b] vector\n");
    for (i = 0; i < n; i++)
    {
    	printf(" B(%d) = ", i + 1);
    	scanf("%lf", &b[i]);
    }

    //call Gauss elimination function
    retval = gauss(a, b, n, &det);

    //print results
    if (retval == 0)
    {
    	printf("\n\t SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS\n");
    	printf("\n\t The solution is");
    	for (i = 0; i < n; i++)
    		printf("\n \t x(%d) = %lf", i + 1, b[i]);
    	printf("\n \t Determinant = %lf \n", det);
    }
    else
    	printf("\n \t SINGULAR MATRIX \n");

    return 0;
 }

/* Solves the system of equations [A]{x} = {B} using       */
/* the Gaussian elimination method with partial pivoting.  */
/* Parameters:                                             */
/*      n         - number of equations                    */
/*      a[n][n]   - coefficient matrix                     */
/*      b[n]      - right-hand side vector                 */
/*      *det      - determinant of [A]                     */

int gauss (double a[][MAXSIZE], double b[], int n, double *det)
{
    double tol, temp, mult;
    int npivot, i, j, l, k, flag;

    //initialization
    *det = 1.0;
    tol = 1e-30;        //initial tolerance value
    npivot = 0;
        //mult = 0;

    //forward elimination
    for (k = 0; k < n; k++)
    {
    	//search for max coefficient in pivot row- a[k][k] pivot element
    	for (i = k + 1; i < n; i++)
    	{
    		if (fabs(a[i][k]) > fabs(a[k][k]))
    		{
    			//interchange row with maxium element with pivot row
    			npivot++;
    			for (l = 0; l < n; l++)
    			{
    			   temp = a[i][l];
    			   a[i][l] = a[k][l];
    			   a[k][l] = temp;
    			}
    			temp = b[i];
    			b[i] = b[k];
    			b[k] = temp;
    		}
    	}
    	//test for singularity
    	if (fabs(a[k][k]) < tol)
    	{
           //matrix is singular- terminate
    	   flag = 1;
    	   return flag;
    	}
        //compute determinant- the product of the pivot elements
    	*det = *det * a[k][k];

    	//eliminate the coefficients of X(I)
    	for (i = k; i < n; i++)
    	{
    		mult = a[i][k] / a[k][k];
    		b[i] = b[i] - b[k] * mult;  //compute constants
    		for (j = k; j < n; j++)     //compute coefficients
    			a[i][j] = a[i][j] - a[k][j] * mult;
    	}
    }
    //adjust the sign of the determinant
    if(npivot % 2 == 1)
      *det = *det * (-1.0);

    //backsubstitution
    b[n] = b[n] / a[n][n];
    for(i = n - 1; i > 1; i--)
    {
    	for(j = n; j > i + 1; j--)
    		b[i] = b[i] - a[i][j] * b[j];
    	b[i] = b[i] / a[i - 1][i];
    }
    flag = 0;
    return flag;
}

The solution should be: 1.058824, 1.823529, 0.882353 with det as -102.000000

Any insight is appreciated...

解决方案

//eliminate the coefficients of X(I)
for (i = k; i < n; i++)

Should this maybe be

for (i = k + 1; i < n; i++)

The way it is now, I believe this will cause you to divide the pivot row by itself, zeroing it out.

这篇关于对于高斯消元逻辑错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆