• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите найти ошибку в коде С++

Aleksandr89

Ученик
Регистрация
19 Ноя 2009
Сообщения
6
Реакции
0
Баллы
0
Помогите найти ошибку в коде С++

Надо решить СЛАУ методом Якоби
вот код:

#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 = -C;
for (int j = 0; j < n; j++)
{
if (i != j)
{
X1 += A[j] * X[j];
}
}
X1 /= -A;
}
maxdelta = fabs(X[0] - X1[0]);
for (int i = 0; i < n; i++)
{
if (maxdelta < fabs(X - X1))
maxdelta = fabs(X - X1);
X = X1;
}
}
for (int i = 0; i < n; i++)
printf("X[%i] = %5.2f\n", i+1, X);
system ("pause");
}

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

2*x1+7*x3+x4=11
2*x2=6
x1+2*x2-x3-x4=2
-x1-2*x2+x3+2*x4=0
 
Последнее редактирование:
Код:
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;
 
не помогает, теперь выдает результат: 0.
 
Код:
printf("X[%i] = %5.2f\n", i+1, X[i]);
заменить на
Код:
printf("X[%d] = %5.2lf\n", i+1, X[i]);
Настоятельно рекомендую код отформатировать и выложив, заключив в блок CODE. Тогда его хотя бы можно будет читать и разбирать.
 
Последнее редактирование:
Отформатировал вот результат:
Код:
#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
 
Код:
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;
 
Код:
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];
одинаковы посколько {} не обязательно если выполняется одно дейсвие
 
Метод Якоби — Википедия
- готовая реализация метода Якоби. Обратите внимание на то, что перед осуществлением итераций требуется выполнить преобразования матрицы в вектора правой части.
 
Последнее редактирование:
У меня тот же алгоритм только масивы статические.
 
Назад
Сверху