Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 20.11.2009, 18:04   #1 (permalink)
Aleksandr89
Новичок
 
Регистрация: 19.11.2009
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите найти ошибку в коде С++

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

#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");
}

никак не могу найти ошыбку.......
Aleksandr89 вне форума   Ответить с цитированием

Старый 20.11.2009, 18:04
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

По вашему вопросу так же нашлись совпадения, советую почитать

Помогите найти ошибку в программе
Помогите найти ошибку, Pascal abc
Задача на массивы, Pascal. Помогите найти ошибку

Старый 21.11.2009, 00:23   #2 (permalink)
Matrix
IT-Specialist
 
Аватар для Matrix
 
Регистрация: 12.04.2007
Сообщений: 2,906
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1845
По умолчанию

напиши задание подробнее...
так то, код правильный, компилируется и работает!
Matrix вне форума   Ответить с цитированием
Старый 21.11.2009, 00:42   #3 (permalink)
Aleksandr89
Новичок
 
Регистрация: 19.11.2009
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

Последний раз редактировалось Aleksandr89; 21.11.2009 в 00:53
Aleksandr89 вне форума   Ответить с цитированием
Старый 21.11.2009, 01:20   #4 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Код:
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;
Long Cat вне форума   Ответить с цитированием
Старый 21.11.2009, 01:55   #5 (permalink)
Aleksandr89
Новичок
 
Регистрация: 19.11.2009
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

не помогает, теперь выдает результат: 0.
Aleksandr89 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 21.11.2009, 07:51   #6 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Последний раз редактировалось Long Cat; 21.11.2009 в 08:28
Long Cat вне форума   Ответить с цитированием
Старый 21.11.2009, 13:12   #7 (permalink)
Aleksandr89
Новичок
 
Регистрация: 19.11.2009
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Отформатировал вот результат:
Код:
#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
Aleksandr89 вне форума   Ответить с цитированием
Старый 21.11.2009, 13:19   #8 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Код:
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;
Long Cat вне форума   Ответить с цитированием
Старый 21.11.2009, 13:36   #9 (permalink)
Aleksandr89
Новичок
 
Регистрация: 19.11.2009
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
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];
одинаковы посколько {} не обязательно если выполняется одно дейсвие
Aleksandr89 вне форума   Ответить с цитированием
Старый 21.11.2009, 13:54   #10 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Последний раз редактировалось Long Cat; 21.11.2009 в 14:03
Long Cat вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.