Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Invalid floating point operation, расчёт по формуле даёт NaN 
V
    Опции темы
trinitr0
Дата 8.10.2014, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Результат выполнения даёт "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]));
   }
 }
}

PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
Дата 8.10.2014, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Не подскажите как лучше отформатировать в данном случае? Чтобы было удобно и наглядно? А то мне и самому сложно разбирать такое форматирование?
PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
Дата 8.10.2014, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Поправил так:

Код

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]));
        }
}


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

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

Это сообщение отредактировал(а) trinitr0 - 8.10.2014, 10:57
PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(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 ] ) );
    }
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
Дата 8.10.2014, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



А! Я забыл добавить граничные условия!

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

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

Код

{
   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, 
а не после того как пробегут все значения в этом поле

Это сообщение отредактировал(а) trinitr0 - 8.10.2014, 11:55
PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



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

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

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
  Дата 8.10.2014, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Вот спасибо! Работает!  smile 
PM MAIL Jabber   Вверх
trinitr0
Дата 8.10.2014, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



В завершении темы:

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

Код

Application -> ProcessMessages();


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

PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
Дата 8.10.2014, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



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

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

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

Понимаю, что рано, но хотя бы пока в теории хотелось ознакомится КАК?
Нет ли у вас ссылочки?
PM MAIL Jabber   Вверх
borisbn
Дата 8.10.2014, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



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

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

Это сообщение отредактировал(а) borisbn - 8.10.2014, 15:20


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
trinitr0
  Дата 8.10.2014, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Ценю тонкий юмор! 

Я подумал может у Вы располагаете особой ссылкой на хорошую,
проверенную статью по теме. Но, в любом случае, её раз спасибо!
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.