Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Invalid floating point operation


Автор: trinitr0 8.10.2014, 09:25
Результат выполнения даёт "NaN". Не могу найти ошибку!
Если кто увидит где она, помогите пожалуйста!

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   double dT[10][10],
           T[10][10];

   double dtau = 1,
           lx = 2,
           lz = 3,
           a = 4,
         

           dx = lx/9,
           dy = lz/9;

int tt;

           for (int i=0; i<9; ++i){
                for (int j=0; j<9; ++j){

                        dT[i][j] = T [i][j] = 0;
                }

                for (tt=1; tt<500; ++tt){

                        for (int i=2; i<8; ++i){
                                for (int j=2; j<8; ++j){

 dT[i][j]=dtau*(a*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(dx*dx))+(T[i][j+1]-2*T[i][j]+T[i][j-1])/(dy*dy)+T[i][j]));
 T[i][j]=T[i][j] + dT[i][j];
                        }
                }


 if (tt%10 == 0)
        Series1 -> AddXY(tt, dT[2][2]);
        Memo1 -> Lines -> Add(FloatToStr(T[2][2]));
   }
 }
}

Автор: borisbn 8.10.2014, 10:14
Или закрывающая скобка на 38-й строке должна быть на 22-й или внутренние переменные цикла лучше назвать не i, j, а ii, jj.
А вообще - за форматирование кода твёрдая двойка.

Автор: trinitr0 8.10.2014, 10:21
Не подскажите как лучше отформатировать в данном случае? Чтобы было удобно и наглядно? А то мне и самому сложно разбирать такое форматирование?

Автор: borisbn 8.10.2014, 10:42
Для начала скажи - моё предположение относительно закрывающей скобки правильно ?

Автор: trinitr0 8.10.2014, 10:54
Поправил так:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   double dT[10][10],
           T[10][10];

   double dtau = 1,
           lx = 2,
           lz = 3,
           a = 4;
        
  double   dx = lx/9,
                dy = lz/9;

  int tt;

  for (int i=0; i<9; ++i)
  {
    for (int j=0; j<9; ++j)
    {
       dT[i][j] = T [i][j] = 0;
    }
  }

        for (tt=1; tt<500; ++tt)
        {
                for (int i=2; i<8; ++i)
                {
                        for (int j=2; j<8; ++j)
                        {
                          dT[i][j]=dtau*(a*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(dx*dx))+(T[i][j+1]-2*T[i][j]+T[i][j-1])/(dy*dy)+T[i][j]));
                          T[i][j]=T[i][j] + dT[i][j];
                        }

                }
                if (tt%10 == 0)
                        Series1 -> AddXY(tt*dtau, dT[2][2]);
                Memo1 -> Lines -> Add(FloatToStr(T[2][2]));
        }
}


Теперь одни нули вылазиют...

По поводу скобки, Вы абсолютно правы! Спасибо! Из-за плохого форматирования не увидел этого

Автор: borisbn 8.10.2014, 11:14
Цитата(trinitr0 @  8.10.2014,  10:54 Найти цитируемый пост)
Теперь одни нули вылазиют...

А чего ты хотел ? У тебя изначально в массивах одни нули. Что бы ты с ними не делал (кроме добавления констант) они нулями и останутся.

Цитата(trinitr0 @  8.10.2014,  10:21 Найти цитируемый пост)
Не подскажите как лучше отформатировать в данном случае? 

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    double dT[ 10 ][ 10 ],
           T[ 10 ][ 10 ];
    double dtau = 1,
           lx = 2,
           lz = 3,
           a = 4;
        
    double dx = lx / 9,
           dy = lz / 9;
    int tt;
    for ( int i = 0; i < 9; ++i )
    {
        for ( int j = 0; j < 9; ++j )
        {
            dT[ i ][ j ] = T [ i ][ j ] = 0;
        }
    }
    for ( tt = 1; tt < 500; ++tt )
    {
        for ( int i = 2; i < 8; ++i )
        {
            for ( int j = 2; j < 8; ++j )
            {
                double x = ( T[ i + 1 ][ j ] - 2 * T[ i ][ j ] + T[ i - 1 ][ j ] );
                double y = ( T[ i ][ j + 1 ] - 2 * T[ i ][ j ] + T[ i ][ j - 1 ] );
                dT[ i ][ j ] = dtau * ( a * ( ( x / ( dx * dx ) ) + y / ( dy * dy ) + T[ i ][ j ] ) );
                T[ i ][ j ] = T[ i ][ j ] + dT[ i ][ j ];
            }
        }
        if ( tt % 10 == 0 )
            Series1->AddXY( tt * dtau, dT[ 2 ][ 2 ] );
        Memo1->Lines->Add( FloatToStr( T[ 2 ][ 2 ] ) );
    }
}

Автор: trinitr0 8.10.2014, 11:21
А! Я забыл добавить граничные условия!

За пример форматирования спасибо! А за разбиение формулы отдельное спасибо!

Исправил так:

Код

{
   double dT[10][10],
           T[10][10];

   double  dtau = 0.1,
           lx = 0.2,
           lz = 0.3,
           a = 0.0001;

  double   dx = lx/9,
           dy = lz/9;

  int      U = 10,
           lamda = 5,
           tt;

  for (int i=0; i<9; ++i)
  {
        for (int j=0; j<9; ++j)
        {
                dT[i][j] = T [i][j] = 0;
        }
  }

  for (tt=1; tt<500; ++tt)
  {
        for (int i=1; i<8; ++i)
                {
                        for (int j=1; j<8; ++j)
                        {
                        
                            double x = ( T[ i + 1 ][ j ] - 2 * T[ i ][ j ] + T[ i - 1 ][ j ] );
                            double y = ( T[ i ][ j + 1 ] - 2 * T[ i ][ j ] + T[ i ][ j - 1 ] );
                            dT[ i ][ j ] = dtau * ( a * ( ( x / ( dx * dx ) ) + y / ( dy * dy ) + T[ i ][ j ] ) );
                            T[ i ][ j ] = T[ i ][ j ] + dT[ i ][ j ];

                                         
                                        //граничные условия:
                                        T[i][1] = T[i][2];
                                        T[i][4] = (U*(dy/lamda)) + T[4][i];
                              
                             
                                    Series1 -> AddXY(tt*dtau, dT[3][3]);
                                    Memo1 -> Lines -> Add(FloatToStr(T[3][3]));
                                
                            }
                }
   }
}


Теперь рисуется, но ещё бы хотелось чтобы график строился по мере с вывода в Memo, 
а не после того как пробегут все значения в этом поле

Автор: borisbn 8.10.2014, 13:37
Цитата(trinitr0 @  8.10.2014,  11:21 Найти цитируемый пост)
но ещё бы хотелось чтобы график строился по мере с вывода в Memo, 
а не после того как пробегут все значения в этом поле

после
Код
Memo1 -> Lines -> Add(FloatToStr(T[3][3]));

поставь
Код
Application->ProcessMessages();

Автор: trinitr0 8.10.2014, 13:52
Вот спасибо! Работает!  smile 

Автор: trinitr0 8.10.2014, 14:11
В завершении темы:

При использовании

Код

Application -> ProcessMessages();


обсчёт сильно замедляется. Но оно и понятно...

Автор: borisbn 8.10.2014, 14:18
Вообще-то, расчёт нужно делать в отдельном потоке, но
1) Это - совсем другая тема
2) ИМХО (не обижайся) тебе ещё рано потоками заниматься  smile 

Автор: trinitr0 8.10.2014, 14:46
Цитата(borisbn @ 8.10.2014,  14:18)
Вообще-то, расчёт нужно делать в отдельном потоке, но
1) Это - совсем другая тема
2) ИМХО (не обижайся) тебе ещё рано потоками заниматься  smile

Нисколички не обижаюсь!

Напротив, очень признателен Вам за терпение и подсказки!

Понимаю, что рано, но хотя бы пока в теории хотелось ознакомится КАК?
Нет ли у вас ссылочки?

Автор: borisbn 8.10.2014, 15:18
Цитата(trinitr0 @  8.10.2014,  14:46 Найти цитируемый пост)
Нет ли у вас ссылочки? 

http://lmgtfy.com/?q=%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8+c%2B%2B+builder

Автор: trinitr0 8.10.2014, 15:23
Ценю тонкий юмор! 

Я подумал может у Вы располагаете особой ссылкой на хорошую,
проверенную статью по теме. Но, в любом случае, её раз спасибо!

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