Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Решение СЛАУ на С++


Автор: Tinysik 23.12.2007, 13:52
подскажите кто знает.... :( ниже код для решения СЛАУ методом простой итерации. На парах мы делали след. образом - писали код(проверяли его), затем в него вставляли какой-ниб. пример и этот пример решался. 

в этом коде есть ошибка в выделенной строке...

#include<math.h>

 #define N 100

 double A[N][N], F[N], mf, X[N], X1[N], S[N], msf;

 

main()

 { int i, j;

   long int dt;

   double t, e;



   mf = 0;

   for(i = 0; i < N; i++)

    { for(j = 0; j < N; j++)

       (i==j)?(A[i][j]=2):(A[i][j]=1);

      F[i] = N+1;



      mf += F[i]*F[i];

    }

 


   t = 0.01;

   e = 0.00001;

 


   for(i = 0; i < N; i++)

    X1[i] = 0.6;


    do

      { for(i = 0; i < N; i++)



         X[i] = X1[i];

 

        for(msf=0,i = 0; i < N; i++)

         { for(S[i] = 0,j = 0; j < N; j++)

             S[i] += A[i][j] * X[j];

           X1[i] = X[i] - t*(S[i] - F[i]);


           msf += (S[i]-F[i])*(S[i]-F[i]);

         }

      }

    while(msf/mf > e*e);  

    for(i = 0; i < 4; i++)

     printf(" %f\n",X[i]);

 return(0);

  }



что это за ошибка?! до сег. дня все работало...не знаю как так может быть:( 


МНЕ НУЖНО - избавиться от ошибки и посчитать например такой пример 
-  3x1 - x2 = 5
-2x1+ x2+ x3 = 0
-2x1- x2+ 4x3 = 15                                                                               

Автор: bsa 23.12.2007, 14:10
какая ошибка? Почему не воспользовался тегом "код"?
Почему после while, который перед for с проблемным printf, стоит точка с запятой?

Автор: Tinysik 23.12.2007, 14:24
вообще этот код я нашла в интернете... он выглядел так - 

#include<stdio.h>
#include<sys/time.h>
#define N 100

 double A[N][N], F[N], mf, X[N], X1[N], S[N], msf;

 main()

 { int i, j;

   long int dt;

   double t, e;

   struct timeval tv1, tv2;   

 /* Генерация данных. Здесь задается матрица с элементами равными 1,

  * по диагонали равными 2. Матрица берется хорошо обусловленной.

  * При правой части равной N+1 все корни будут равными 1. */

   mf = 0;

   for(i = 0; i < N; i++)

    { for(j = 0; j < N; j++)

       (i==j)?(A[i][j]=2):(A[i][j]=1);

      F[i] = N+1;

 /* Сразу вычисляем сумму квадратов элементов вектора F,

  * т.е. подкоренное выражение формулы (4). */ 

      mf += F[i]*F[i];

    }


/* Задаем шаг t и e. */

   t = 0.01;

   e = 0.00001;

/* Задаем начальное приближение корней. В Х1 хранятся значения корней

 * к+1-й итерации. */

   for(i = 0; i < N; i++)

    X1[i] = 0.6;

/* Засекаем время начала вычислений. */

    gettimeofday(&tv1,NULL);

    do

      { for(i = 0; i < N; i++)


/* В Х хранятся значения корней к-й итерации. */

         X[i] = X1[i];

        for(msf=0,i = 0; i < N; i++)

         { for(S[i] = 0,j = 0; j < N; j++)

             S[i] += A[i][j] * X[j];

           X1[i] = X[i] - t*(S[i] - F[i]);

 /* Вычисляем сумму квадратов элементов невязки, т.е. подкоренное

  * выражение числителя формулы (4). */ 

           msf += (S[i] – F[i])*(S[i] – F[i]);

         }

      }

    while(msf/mf > e*e);   /* Проверка условия по формуле (3). */

/* Засекаем время конца вычислений. */

    gettimeofday(&tv2,NULL);

    dt = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;

/* Выводим на экран время вычислений в секундах */

    printf(" Time= %d\n",dt); 


/* Для контроля выводим 4-е первых корня */

    for(i = 0; i < 4; i++)

     printf(" %f\n",X[i]);

 return(0);

  }




но, т.к. мне не надо, чтобы он считал время вычисления и т.д., я удалилато, что связано с time(то,что зачеркнуто)


правильно я сделала?

теперь мне нужно,чтоб этот код работал, а потом уже включить в него пример 

Автор: baldina 23.12.2007, 15:25
Цитата

    do
{ for(i = 0; i < N; i++)

вот это ты зря удалила

Автор: bsa 23.12.2007, 15:33
используй тег "код"!!!
так. на счет while я все понял.
на printf ругается, потому что ты заменила #include <stdio.h> на #include <math.h>, который в данном коде не нужен.
Код должен выглядеть примерно так:
Код
#include <stdio.h>

#define N 3

const double A[N][N] = {
        {-3, -1, 0},//{0, -1, -3},
        {-2,  1, 1},//{1, 1, -2},
        {-2, -1, 4}//{4, -1, -2}
};
const double F[N] = {
        5, 0, 15
};
const double e2 = 0.00001*0.00001;

int main()
{
        int i, j;
        long int dt;
        const double t = 0.01;
        double mf = 0, X[N], X1[N], S[N], msf;
        for(i = 0; i < N; i++) {
                mf += F[i]*F[i];
                X1[i] = 0.6;
                for(j=0; j < N; ++j)
                        printf("%f ", A[i][j]);
                printf("\n");
        }

        do {
                for(i = 0; i < N; i++)
                        X[i] = X1[i];

                for(msf=0,i = 0; i < N; i++) {
                        for(S[i] = 0,j = 0; j < N; j++)
                                S[i] += A[i][j] * X[j];
                        X1[i] = X[i] - t*(S[i] - F[i]);
                        msf += (S[i]-F[i])*(S[i]-F[i]);
                }
        }while(msf/mf > e2);

        for(i = 0; i < N; i++)
                printf(" %f\n",X[i]);

   return(0);
}
Вот только как бы код не выглядел, он почему-то работает некорректно.

2baldina
посмотри первый пост, там это не удалено.

Автор: Tinysik 23.12.2007, 15:46
ой спасибо...... 


программа работает, ошибок нет, но он должен выводить корни, а там что-то не то выводит...

 простите за мой "тупизм", просто я на С++ не бум-бум, был бы VB я бы еще там что-то сообразила,если ошибки были бы.(хотя эту задачу сказали можно и на VB делать)



еще раз вам спасибо, а то у меня никакого продвижения не было (прям реально замучалась)


а на счет includ'a я сделала там #include<math.h>, т.к. мы с <stdio.h> не работали никогда, только с 
#include<iostream.h>
#include<math.h>

Автор: bsa 23.12.2007, 16:02
Tinysik, никто не мешает заменить stdio.h на iostream... Только там printf надо будет заменить на cout.

Автор: Tinysik 23.12.2007, 16:39
так будет?  smile 

cout<<("%f ", A[i][j]);
                cout<<("\n");


см. вложение ---->


Автор: bsa 23.12.2007, 21:11
Tinysik, ой.
нужно просто cout << X[i] << "\n";

Автор: Tinysik 23.12.2007, 21:38
а что вот это такое ???


см. рисунок... (выделено красным)

Автор: bsa 23.12.2007, 23:55
INF - сокращение от infinite - бесконечность.
я же говорю, программа не работает.

Автор: Tinysik 24.12.2007, 00:10
ммммммммммм жалко... что ж такое, а .. прям не везет с этой прогаммой smile  smile 

Автор: bsa 24.12.2007, 12:34
Попробуй это: http://www2.sscc.ru/Publikacii/Primery_Prll/5.htm
только убери все, что связано с MPI

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)