Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите найти ошибку в коде С++ (http://www.tehnari.ru/f41/t30377/)

Aleksandr89 20.11.2009 18:04

Помогите найти ошибку в коде С++
 
Надо решить СЛАУ методом Якоби
вот код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int n = 4;
int A[4][4] = {{2, 0, 7, 1},{0, 2, 0, 0},{1, 2, -1, -1},{-1, -2, 1, 2}};
int C[4] = {11, 6, 2, 0};
float X[4] = {1, 1, 1, 1}, X1[4];
float delta = 0.05;
float maxdelta = 1;
while ( maxdelta >= delta )
{
for (int i = 0; i < n; i++)
{
X1[i] = -C[i];
for (int j = 0; j < n; j++)
{
if (i != j)
{
X1[i] += A[i][j] * X[j];
}
}
X1[i] /= -A[i][i];
}
maxdelta = fabs(X[0] - X1[0]);
for (int i = 0; i < n; i++)
{
if (maxdelta < fabs(X[i] - X1[i]))
maxdelta = fabs(X[i] - X1[i]);
X[i] = X1[i];
}
}
for (int i = 0; i < n; i++)
printf("X[%i] = %5.2f\n", i+1, X[i]);
system ("pause");
}

никак не могу найти ошыбку.......

Matrix 21.11.2009 00:23

напиши задание подробнее...
так то, код правильный, компилируется и работает!

Aleksandr89 21.11.2009 00:42

он компилируется, но работает не правильно (выдает результат: -1.#J). Вот задание: решить СЛАУ методом Якоби:

2*x1+7*x3+x4=11
2*x2=6
x1+2*x2-x3-x4=2
-x1-2*x2+x3+2*x4=0

Long Cat 21.11.2009 01:20

Код:

int A[4][4] = {{2, 0, 7, 1},{0, 2, 0, 0},{1, 2, -1, -1},{-1, -2, 1, 2}};
int C[4] = {11, 6, 2, 0};
float X[4] = {1, 1, 1, 1}, X1[4];
float delta = 0.05;
float maxdelta = 1;

заменить на
Код:

double A[4][4] = {{2, 0, 7, 1},{0, 2, 0, 0},{1, 2, -1, -1},{-1, -2, 1, 2}};
double C[4] = {11, 6, 2, 0};
double X[4] = {1, 1, 1, 1}, X1[4];
double delta = 0.05;
double maxdelta = 1;


Aleksandr89 21.11.2009 01:55

не помогает, теперь выдает результат: 0.

Long Cat 21.11.2009 07:51

Код:

printf("X[%i] = %5.2f\n", i+1, X[i]);
заменить на
Код:

printf("X[%d] = %5.2lf\n", i+1, X[i]);
Настоятельно рекомендую код отформатировать и выложив, заключив в блок CODE. Тогда его хотя бы можно будет читать и разбирать.

Aleksandr89 21.11.2009 13:12

Отформатировал вот результат:
Код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
  double n = 4;
  double A[4][4] = {{2, 0, 7, 1},{0, 2, 0, 0},{1, 2, -1, -1},{-1, -2, 1, 2}};
  double C[4] = {11, 6, 2, 0};
  double X[4] = {1, 1, 1, 1}, X1[4];
  double delta = 0.05;
  double maxdelta = 1;
  while ( maxdelta >= delta )
  {
        for (int i = 0; i < n; i++)
        {
            X1[i] = -C[i];
            for (int j = 0; j < n; j++)
            {
                    if (i != j)
                    {
                        X1[i] += A[i][j] * X[j];
                    }
            }
            X1[i] /= -A[i][i];
        }
        maxdelta = fabs(X[0] - X1[0]);
        for (int h = 0; h < n; h++)
        {
            if (maxdelta < fabs(X[h] - X1[h]))
            maxdelta = fabs(X[h] - X1[h]);
            X[h] = X1[h];
        }
  }
  for (int i = 0; i < n; i++)
  printf("X[%d] = %lf\n", i+1, X[i]);
  system ("pause");
}

Результат: -1.#IND00

Long Cat 21.11.2009 13:19

Код:

if (maxdelta < fabs(X[h] - X1[h]))
            maxdelta = fabs(X[h] - X1[h]);
            X[h] = X1[h];

по определению алгоритма должно быть так
Код:

if (maxdelta < fabs(X[h] - X1[h]))
{
            maxdelta = fabs(X[h] - X1[h]);
            X[h] = X1[h];
}

или так
Код:

if (maxdelta < fabs(X[h] - X1[h]))
{
            maxdelta = fabs(X[h] - X1[h]);
}
X[h] = X1[h];

?
и да, верните обратно int n=4;

Aleksandr89 21.11.2009 13:36

Код:

if (maxdelta < fabs(X[h] - X1[h]))
{
            maxdelta = fabs(X[h] - X1[h]);
            X[h] = X1[h];
}

X[h] = X1[h] нужно выполнить обязательно посколько дальше программа работать не сможет

Код:

if (maxdelta < fabs(X[h] - X1[h]))
{
            maxdelta = fabs(X[h] - X1[h]);
}
X[h] = X1[h];

и
Код:

if (maxdelta < fabs(X[h] - X1[h]))
            maxdelta = fabs(X[h] - X1[h]);
            X[h] = X1[h];

одинаковы посколько {} не обязательно если выполняется одно дейсвие

Long Cat 21.11.2009 13:54

Метод Якоби — Википедия
- готовая реализация метода Якоби. Обратите внимание на то, что перед осуществлением итераций требуется выполнить преобразования матрицы в вектора правой части.


Часовой пояс GMT +4, время: 18:13.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.