使用Gauss-Seidel解决系统的功能

时间:2016-04-03 22:37:17

标签: c function gaussian

我正在尝试编写一个函数,以便使用Gauss-Seidel方法求解方程组。到目前为止我的功能不起作用。代码在“输入初始猜测...”之后停止给我输出,并且没有解决我正在输入的功能。这是我的功能或我的代码的其他部分的问题吗?

/* code to solve a nxn system using the Gauss-Seidel method */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX_DIM 100
#define MAX_ITER 500
#define TOLERANCE 1.e-6

void gauss_seidel(double a[][MAX_DIM], double b[], double x[], int n);
void main()
{       
    int i, j, n;
    int violation_counter, answer;
    int violation_rows[MAX_DIM];
    double sum;
    double a[MAX_DIM][MAX_DIM];
    double b[MAX_DIM], x[MAX_DIM];

    /* read in data */
    n = MAX_DIM + 1;
    while (n > MAX_DIM) {
        printf("Enter the dimension of the system to be solved: ");
            scanf_s("%d", &n);
    }
    printf("\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Enter a[%d][%d] element of the system matrix: ",i,j);
                scanf_s("%lf", &a[i][j]);
        }
        printf("Enter b[%d] of the right-hand-side vector: ", i);
        scanf_s("%lf", &b[i]);
        printf("\n");
    }

    /* test the convergence criterion */
    violation_counter = 0;
    for (i = 0; i < n; i++) {
        sum = 0.0;
        for (j = 0; j < n; j++)
            if (i != j)
                sum = sum + fabs(a[i][j]);
        if (fabs(a[i][i]) < sum) {
            violation_rows[violation_counter] = i;
            violation_counter = violation_counter + 1;
        }
        if (a[i][i] == 0.0) {
            printf("Found diagonal element equal to zero; rearrange equations; exiting ...\n");
                exit(0);
        }
    }
    if (violation_counter > 0) {
        printf("The Gauss-Seidel convergence criterion is violated in %d rows out of %d\n", violation_counter, n);
            printf("Specifically, it was violated in rows:\n");
        for (i = 0; i < violation_counter; i++)
            printf("%d ", violation_rows[i]);
        printf("\n");
        printf("Enter 1 if you want to continue; any other number to abort : ");
            scanf_s("%d", &answer);
        if (answer != 1)
            exit(1);
        printf("Check results carefully\n\n");
    }

    /* initialize the solution vector -- initial guesses */
    for (i = 0; i < n; i++) {
        printf("Enter an initial guess for x[%d] of the solution vector : ",i);
            scanf_s("%lf", &x[i]);
    }

    /* solve the system */
    gauss_seidel(a, b, x, n);

    /* output solution */
    for (i = 0; i < n; i++)
        printf("x[%d]=%f\n", i, x[i]);
    printf("\n");
}

/* function to solve a system using Gauss-Seidel */
void gauss_seidel(double a[][MAX_DIM], double b[], double x[], int n)
{
    double maxerror = 1.0;
    double iteration_error;
    double e, sum, temp;
    int i, j;

    while (maxerror > 1.e-6) {
        iteration_error = 0.0;

        for (i = 0; i < n; i++) {
            sum = 0.0;
            for (j = 0; j < n; j++) {
                if (i != j)
                    sum = sum + (a[i][j] * x[j]);
            }
        }

        temp = (a[i][n] - sum) / a[i][i];
        e = fabs((temp - x[i]) / x[i]);
        x[i] = temp;

        if (e > iteration_error)
            iteration_error = e;
    }
    maxerror = iteration_error;
}

0 个答案:

没有答案