Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Floating point overflow, ошибка в формуле? 
V
    Опции темы
trinitr0
Дата 24.9.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В коде построения графика по формуле расчёта методом конечных разностей
(метод решёток):

Код

double dT[8];
     float T[8];

     int i;
     int m = 8;

     float dtau = 0.1;
     float lx = 0.14;
     float a = 0.0001; 
     //float dx = 0.02;  
     float dx = lx/(m-1);
     long int tt;

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


     for (tt=0; tt<=500; tt++)
     {
         T[0] = 100;

                for (int i=0; i<=m; i++)
                {
                      T[7] = 0;

                         for (int i=1; i<m-1; i++)
                         {
                           dT[i] = a*dtau*((T[i-1]-2*T[i]+T[i+1])/(dx*dx))+T[i];
                           T[i] = T[i]+dT[i];
                         }

                        if (tt%100 == 0)
                           Series1 -> AddXY(tt*dtau, T[2]);

                }
      }


при нажатии появляется сообщение о переполнении (Floating point overflow), 
и указание на строчку с формулой dT[i] = a*dtau*((T[i-1]-2*T[i]+T[i+1])/(dx*dx))+T[i];

Но если в строчке 29 задать i от 3 (i=3...), то рисуется просто прямая линия...

В формуле, вроде, ошибок нет... Помогите пожалуйста!

Это сообщение отредактировал(а) trinitr0 - 24.9.2014, 16:40
PM MAIL Jabber   Вверх
tzirechnoy
Дата 24.9.2014, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
Код

       for (int i=0; i<=m; i++)
         ...
         for (int i=1; i<m-1; i++)


Неудивительно.
PM MAIL   Вверх
trinitr0
  Дата 25.9.2014, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

double dT[8];
     float T[8];
     int i;
     int m = 8;
     float dtau = 0.1;
     float lx = 0.14;
     float a = 0.0001; 
     //float dx = 0.02;  
     float dx = lx/(m-1);
     long int tt;
     for (int i=0; i<m; i++)
     {
        dT[i]=0;
        T[i]=0;
     }
     
      for (tt=0; tt<=500; tt++)
     {
         T[0] = 100;
               
                      T[7] = 0;
                         for (int i=1; i<m-1; i++)
                         {
                           dT[i] = a*dtau*((T[i-1]-2*T[i]+T[i+1])/(dx*dx))+T[i];
                           T[i] = T[i]+dT[i];
                         }
                        if (tt%100 == 0)
                           Series1 -> AddXY(tt*dtau, T[2]);
       }
  


Но всё равно при нажатии рисуется прямая просто линия, вместо графика... 
PM MAIL Jabber   Вверх
xvr
Дата 25.9.2014, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цикл вы зря выкинули, верните обратно, но сделайте ему отдельную переменную для цикла.
Замените все float на double, и исправьте индекс T в AddXY (там должно быть T[1])

PM MAIL   Вверх
trinitr0
  Дата 25.9.2014, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, сейчас попробую...

Добавлено через 5 минут и 11 секунд
Написал теперь так:

Код

{
     double dT[8];
     double T[8];

     int i;
     int m = 8;

     float dtau = 0.1;
     float lx = 0.14;
     float a = 0.0001;
     //float dx = 0.02;
     float dx = lx/(m-1);
     int tt;

     int x;

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


     for (int tt=1; tt<=500; tt++)
     {
         T[0] = 100;

                for (int j=0; j<=m; j++)
                {
                      T[7] = 0;

                         for (int i=2; i<m-1; i++)
                         {
                           dT[i] = a*dtau*((T[i-1]-2*T[i]+T[i+1])/(dx*dx))+T[i];
                           T[i] = T[i]+dT[i];


                              if (tt%100 == 0)
                                Series1 -> AddXY(tt*dtau, T[1]);
                         }
                }
      }
  }


Но всё равно просто прямая линия и нули... 
PM MAIL Jabber   Вверх
xvr
Дата 25.9.2014, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



  • У вас if (tt%100 == 0) оказался внутри цикла (в строке 32), а должен быть снаружи
  • Поставьте double везде, где был float, а не только в массивах
  • Цикл в строке 32 должен начинаться с 1, а не с 2


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


Шустрый
*


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

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



Спасибо!!! Решено!   smile 


Применив ваши советы, ещё попотев пришёл к такому рабочему коду:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     const int m = 8;
     double dT[m],
             T[m],

             dtau = 0.1,
             lx   = 0.14,
             a    = 0.0001;

     double dx    = lx/(m-1);

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

     for (int tt=1; tt<=500; tt++){
         T[0] = 100;
         T[7] = 0;
                      for (int i=1; i<m-1; i++){

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

                      }

                    if (tt%100 == 0)
                       Series1 -> AddXY(tt*dtau, T[2]);
                      
                }
      }
  }


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Он может и рабочий, но исходному коду на Delphi он не соотвествует.
Повторюсь -

Цитата(xvr @  25.9.2014,  13:19 Найти цитируемый пост)
Цикл вы зря выкинули, верните обратно, но сделайте ему отдельную переменную для цикла.
Исправьте индекс T в AddXY (там должно быть T[1])


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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