Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> численные методы, решение уравнения теплопроводности 
V
    Опции темы
trinitr0
Дата 21.10.2015, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте!

Нужно построить график переходного процесса от криволинейной поверхности заданной функцией f(x),
с выводом графика самой f(x). 
f(x) - представлена вектором (последовательный набор значений в точках по x).

Пробую делать так:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        double  Lx = 0.9, //граничные условия
                Ly = 0.1, //граничные условия

            dt = 0.01,
            a  = 0.0001; //коэфициент теплопроводности

        int     tsc;  // time Step count

        double dx = Lx/(X-1); //шаг по X
        double dy = Ly/(Z-1); //шаг по Y

   double dT[X][Z],
               T[X][Z];
   double f[F] = {8,9,8,9,11,13,15,15,15,14,14,14,13,13,12,12,11,11,10,10,10,9};
//-------------------------------------------------------------------------------
 for (int i=0; i<X; ++i)
   {
        for (int j=0; j<Z; ++j)
        {
                dT[i][j] = T[i][j] = 0;
        }
   }
//-----------------------------------------------------------------------------
for (int tsc=1; tsc<5000; ++tsc) //цикл по времени
   {

         for (int i=1; i<X-1; ++i)
         {
               for (int j=f[0]; j<f[F-1]; ++j)
                 {
                        //решение уравнения теплопроводности от поверхности f(x)
                        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] = dt * ( a * (( x / (dx * dx)) + y / (dy * dy) + T[i][j] ));
                 }
         }

//----------------- граничные условия -----------------------------------------

                       for (int i=0; i<X; ++i)
                       {
                                for (int j=0; j<f[30]; ++j)
                                       {
                                                T[0][j] = 100;
                                                T[0][j] = 0;
                                                T[30][j] = 0;

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

         Series1 -> AddXY(tsc, T[1][1]); // график переходного процесса в точке
                Series2 -> AddXY(tsc,f[F]);       // график самой функции f(x)
      }
}


В итоге на Series1 и на Series2 просто прямые.
Никак не могу сообразить как связать f(x) и переходной процесс...  smile 
Помогите пожалуйста!

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


Эксперт
****


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

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



Я в Вашем
Цитата(trinitr0 @  21.10.2015,  15:31 Найти цитируемый пост)
double f[F] = {8,9,8,...

насчитал 22 элемента, а Вы обращаетесь аж к 30-му в 44-й строке
Цитата(trinitr0 @  21.10.2015,  15:31 Найти цитируемый пост)
for (int j=0; j<f[30]; ++j)


ещё один странный цикл
Цитата(trinitr0 @  21.10.2015,  15:31 Найти цитируемый пост)
for (int j=f[0]; j<f[F-1]; ++j)

этот цикл выполнится один раз для j равного 8.
Если Вы хотите, чтобы j прошло по всем значениям f, то нужно сделать так
Код

for (int f_iter=0; f_iter<F; ++f_iter) {
    int j = f[ f_iter ];
    ...
}


Добавлено через 2 минуты и 23 секунды
Цитата(trinitr0 @  21.10.2015,  15:31 Найти цитируемый пост)
Series2 -> AddXY(tsc,f[F]);

а тут действительно будет выведена линия, т.к. f нигде не меняется. И, кстати, т.к. f объявлен как массив длиной F, то обращаться можно только к элементам с индексами от 0 до F-1, а Вы обращаетесь к F-му


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


Шустрый
*


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

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



Переделал и расписал граничные условия,
но без результата. Не графика переходного процесса, ни самой функции...   smile 

Код

...
#define X 20
...
{
        double  dt = 0.01,
                   dx = 0.1,
                   dy = 0.02,
                   a  = 0.0001;

        int       tsc; //время с сек.

       double dT[20][17],
                  T[20][17];
 //значение функции f(x) в точках по x
   int f[X] = {8,9,8,9,11,13,15,15,15,14,14,14,13,13,12,12,11,11,10,10};
//----------------------------Обнуление массивов---------------------------
 for (int i=0; i<19; ++i)
   {
       for (int j=0; j<16; ++j)
        {
                dT[i][j] = T[i][j] = 0;
        }
   }
//-----------------------------------------------------------------------------
for (int tsc=1; tsc<5000; ++tsc) //цикл по времени
{
         for (int i=1; i<18; ++i)
         {
               for (int f_iter=1; f_iter<X; ++f_iter)
                 {
                        int j = f[f_iter];
                        //уравнение теплопроводности в дескретной форме
                        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] = a * dt * ( x/(dx*dx) + y/(dy*dy) + T[i][j]);
                 }
        }
//------------------граничные условия---------------------------------------

                       //сверху+воздействие
                       for (int x=0; x<19; ++x)
                       {
                                T[x][f[x]]  = 100;

                       }
                       //слева
                       for (int y_iter=0; y_iter<f[0]; ++y_iter)
                       {
                                int y = f[y_iter];
                                T[0][y]  = 0;
                       }
                       //снизу
                       for (int x=0; x<19; ++x)
                       {
                                T[x][0] = T[x][1];
                       }
                       //справа
                       for (int y_iter=0; y_iter<f[X-1]; ++y_iter)
                       {
                                int y = f[y_iter];
                                T[19][y]  = 0;
                       }
                       
//--------------------приращение-------------------------------------------
                       for (int x=0; x<19; ++x)
                       {
                                for (int y_iter=0; y_iter<X; ++y_iter)
                                {
                                        int y = f[y_iter];
                                        T[x][y] = T[x][y]+dT[x][y];
                                }
                       }


         Series1 -> AddXY(tsc, T[2][2]);
         Series2 -> AddXY(tsc,f[X-2]);

 }

}


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


Шустрый
*


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

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



Переписал так:
Код

{
double
           dt = 0.01,
            dx = 0.1,
            dy = 0.02,
            a  = 0.0001;

        int     tsc;
      
   double dT[20][17],
           T[20][17];
   int f[X] = {8,9,8,9,11,13,15,15,15,14,14,14,13,13,12,12,11,11,10,10};

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

for (int tsc=1; tsc<20000; ++tsc)
{
         for (int i=1; i<18; ++i)
         {
               for (int j=1; j<15; ++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] = dt*(a*((x/(dx*dx)) + y/(dy*dy) + T[i][j]));
                 }
        }

     for (int x=0; x<18; ++x)
     {
          for (int y=0; y<16; ++y)
          {
                     T[x][f[x]]  = 100;
                     T[x][0] = T[x][1];
                     T[19][y]  = 0;
                     T[x][y] = T[x][y]+dT[x][y];
          }
      }

         Series1 -> AddXY(tsc, T[2][2]);
 }
}
Построился график переходного процесса. Но насколько это корректно?

PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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