首页 > 解决方案 > 注释代码时计算值发生变化

问题描述

我在 main 中有这样一部分代码,我在其中调用两个函数来搜索方程组的根。当其中一个被注释掉时,一切都很好。

/*double* res ;
int it;
res = iter(a, y, n,it);
    printf("Roots(Iter)\n");
for (int i = 0; i < n; i++) {
    printf("x[ %d ]= %lf\n", i, res[i]);
}
    printf("\n");
printf("checking(Iter):\n");
for (int i = 0; i < n; i++) {
    double sum = 0;
    for (int j = 0; j < n; j++) {
        sum += a[i][j] * res[j];
    }
    printf("%lf\n", sum);
}
printf("\n");
printf("Iterations : %d\n", it);*/
double* res_s ;
int it_s;
res_s = seidel(a, y, n,it_s);
printf("Roots(Seidel)\n");
for (int i = 0; i < n; i++) {
    printf("x[ %d ]= %lf\n", i, res_s[i]);
}
printf("\n");
printf("checking(Seidel):\n");
    for (int i = 0; i < n; i++) {
    double sum_s = 0;
    for (int j = 0; j < n; j++) {
        sum_s += a[i][j] * res_s[j];
    }
    printf("%lf\n", sum_s);
}
printf("\n");
printf("Iterations : %d\n", it_s);

在此处输入图像描述 在此处输入图像描述

但是当它们都没有被注释掉时,会发生以下情况:

在此处输入图像描述

出于某种原因,迭代次数正在改变。我不明白为什么

!还有一个小问题! 当我删除这一行scanf("%d",&n);并在 main 中留下一行n=5时,它也会给出不正确的迭代计数结果..

这是程序的完整代码,如果你能告诉我这个问题是什么,我将非常感激,因为我很困惑:(

double * seidel(double** a, double* y, int n, int& iter_s){
    double* res = new double[n];
    int i, j;
    double sum;
    


    for (i = 0; i < n; i++)
    {
        res[i] = y[i] / a[i][i];
    }

    double eps = 0.0001;
    double* Xn = new double[n];

    do {
        iter_s++;
        for (i = 0; i < n; i++) {
            Xn[i] = y[i] / a[i][i];
            for (j = 0; j < i; j++) {
                    Xn[i] -= a[i][j] / a[i][i] * Xn[j];
            }
            for (j = i+1; j < n; j++){
                Xn[i] -= a[i][j] / a[i][i] * res[j];
            }
        }



        bool flag = true;
        for (i = 0; i < n - 1; i++) {
            if (fabs(Xn[i] - res[i]) > eps) {
                flag = false;
                break;
            }
        }

        for (i = 0; i < n; i++) {
            res[i] = Xn[i];
        }

        if (flag)
            break;
    } while (1);

    return res;
}
double* iter(double** a, double* y, int n, int& iter)
{
    double* res = new double[n];
    int i, j;
    double sum;
    


    for (i = 0; i < n; i++)
    {
        res[i] = y[i] / a[i][i];
    }

    double eps = 0.0001;
    double* Xn = new double[n];

    do {
        iter++;


        for (i = 0; i < n; i++) {
            Xn[i] = y[i] / a[i][i];
            for (j = 0; j < n; j++) {
                if (i == j)
                    continue;
                else {
                    Xn[i] -= a[i][j] / a[i][i] * res[j];
                }
            }
        }

        bool flag = true;
        for (i = 0; i < n - 1; i++) {
            if (fabs(Xn[i] - res[i]) > eps) {
                flag = false;
                break;
            }
        }

        for (i = 0; i < n; i++) {
            res[i] = Xn[i];
        }

        if (flag)
            break;
    } while (1);

    return res;
}


double** InvMatr(double** a, int n)
{
    double** res;
    double* y = new double[n];
    double* itr;
    int i, j, k;
    int it;

    res = new double* [n];
    for (i = 0; i < n; i++)
    {
        res[i] = new double[n];
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (i == j)
            {
                y[j] = 1;
            }
            else
            {
                y[j] = 0;
            }
        }
        itr = iter(a, y, n,it);
        for (k = 0; k < n; k++)
        {
            res[k][i] = itr[k];
        }
    }

    return res;
}


double** prodMatr(double** a, double** b, int n)
{
    double** res;
    double sum=0;
    res = new double* [n];
    int i, j;
    res = new double* [n];
    for (i = 0; i < n; i++)
    {
        res[i] = new double[n];
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            res[i][j] = 0;
            for (int k = 0; k < n; k++)
                res[i][j] += a[i][k] * b[k][j];
        }
    }

    return res;
}

int main()
{
    double** a;
    double** x;
    double** c;

    int n, i, j;
    
    scanf("%d",&n);
    n=5;
    

    a = new double* [n];
    for (i = 0; i < n; i++)
    {
        a[i] = new double[n];
    }

/* a[0][0] = 10; a[0][1] = 3; a[0][2] = 2;
 a[1][0] = 3; a[1][1] = 23; a[1][2] = 5;
 a[2][0] = 5; a[2][1] = 4; a[2][2] = 35;*/
 a[0][0] = 32; a[0][1] = 2; a[0][2] = 1; a[0][3] = 3; a[0][4] = 1;
    a[1][0] = 1; a[1][1] = 8; a[1][2] = 3; a[1][3] = 1; a[1][4] = 3;
    a[2][0] = 1; a[2][1] = 2; a[2][2] = 16; a[2][3] = 3; a[2][4] = 1;
    a[3][0] = 1; a[3][1] = 2; a[3][2] = 3; a[3][3] = 56; a[3][4] = 1;
    a[4][0] = 1; a[4][1] = 2; a[4][2] = 1; a[4][3] = 3; a[4][4] = 32;
double y[5] = { 2,3,16,2,5 };

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf(" %.0lf \t",a[i][j]);

        }
        printf("| %.0lf ", y[i]);
        printf("\n");

    }
    printf("\n");

    x = InvMatr(a, n);

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf(" %lf \t",x[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    c = prodMatr(a, x, n);

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf(" %lf \t",c[i][j]);
        }
        printf("\n");
    }


    /*double* res ;
    int it;
    res = iter(a, y, n,it);
        printf("Roots(Iter)\n");
    for (int i = 0; i < n; i++) {
        printf("x[ %d ]= %lf\n", i, res[i]);
    }
        printf("\n");
    printf("checking(Iter):\n");
    for (int i = 0; i < n; i++) {
        double sum = 0;
        for (int j = 0; j < n; j++) {
            sum += a[i][j] * res[j];
        }
        printf("%lf\n", sum);
    }
    printf("\n");
    printf("Iterations : %d\n", it);*/
    double* res_s ;
    int it_s;
    res_s = seidel(a, y, n,it_s);
    printf("Roots(Seidel)\n");
    for (int i = 0; i < n; i++) {
        printf("x[ %d ]= %lf\n", i, res_s[i]);
    }
    printf("\n");
    printf("checking(Seidel):\n");
        for (int i = 0; i < n; i++) {
        double sum_s = 0;
        for (int j = 0; j < n; j++) {
            sum_s += a[i][j] * res_s[j];
        }
        printf("%lf\n", sum_s);
    }
    printf("\n");
    printf("Iterations : %d\n", it_s);
    return 0;
}

标签: c++iteration

解决方案


推荐阅读