2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Метод Конечных Разностей для уравнения в частных производных
Сообщение09.11.2013, 17:55 


22/06/12
417
Здравствуйте, требуется ваша помощь в нахождении ошибки в программе. Вычисляю по явной схеме. Выдает какие-то очень большие числа.

Задача такая:
U_t=3(1,1-0,5x)U_{xx}+e^t-1
$ U(0,t)=0$
$ U(1,t)=0$
$U(x,0)=0.01(1-x)x$

Решение нужно найти с точностью $0.0001$ на отрезке $T=1/a^*, где a^*=\max a(x,t)$
Построить графики функций $u(x^*,t), u(x,jt^*)$ где $x^*=0.6, t^*=T/10, j=1,2,4$

явная разностная схема такая:
($u_t^{j+1}-u_i^j)/\tau=3(1,1-0,5x_i)(u_{i+1}^{j}-2u_i^j+u_{i-1}^j)/h^2+e^{t_j}+1$$

код программы:
Код:
int main ( void )
{
   setlocale(LC_ALL, "rus");

   int I = 10, J = 30, i, j;
   double  T = 1.0/ pow(3.3, 0.5), h_x = 1.0/ I, h_t = T/ J, epsilon = h_t + pow(h_x, 2), c;
   double **u = new double *[I + 1];
   for (i = 0; i <= I; i++) u[i] = new double [J + 1];

   cout<< "Схема может быть неустойчива  при значениях Х :\n";
   for (i = 0; i <= I; i++)
   {
      c = 3 * (1.1 - 0.5 * h_x * i) * h_t * pow(h_x, -2);
      if (c < 0.5) cout << i * h_x << "   ";
   }
   cout <<"\n";
   
   //нулевой слой (j = 0)
   for (i = 0; i <= I; i++)
   {
      u [i][0] = 0.01 * (1 - i * h_x) * i * h_x;
      //u [i][0] = 1 - i * h_x;  //НУ, несоответствие ГУ и НУ!
   }
      //последующие слои
   for (j = 0; j <= J; j++)
   {
      for (i = 1; i < I; i++) //расчёт j + 1 - го слоя по j-му
      {
         u [0][j + 1] = 0; //ГУ u [0][j + 1] = 1;
         u [I][j + 1] = 0; //ГУ
         u [i][j + 1] = u [i][j] + h_t * (3 * (1.1 - 0.5 * h_x * i) * (u [i + 1][j] -2 * u [i][j] + u [i - 1][j])/ pow(h_x, 2) + exp(h_t * j) - 1);
      }
   }
   int Jv = J/10;

   ofstream out;
    out.open ("D:\\proga7.txt");

   out << "U = U(0.6, t):\n";
   cout << "U = U(0.6, t):\n";
   for (i = 0; i <= J; i++)
   {
      out << h_t * i <<"\t"<< u [6][i] <<"\n";
       cout << h_t * i <<"\t"<< u [6][i] <<"\n";
   }
   out << "\n U = U(x, 0.33):\n";
   cout << "\n U = U(x, 0.33):\n";
   for (i = 0; i <= I; i++)
   {
      out << h_x * i <<"\t"<< u [i][Jv] <<"\n";
      cout << h_x * i <<"\t"<< u [i][Jv] <<"\n";
   }
   out << "\n U = U(x, 0.66):\n";
   cout << "\n U = U(x, 0.66):\n";
   for (i = 0; i <= I; i++)
   {
      out << h_x * i <<"\t"<< u [i][Jv * 2] <<"\n";
       cout << h_x * i <<"\t"<< u [i][Jv * 2] <<"\n";
   }
   out << "\n U = U(x, 1.32):\n";
   cout << "\n U = U(x, 1.32):\n";
   for (i = 0; i <= I; i++)
   {
      out << h_x * i <<"\t"<< u [i][Jv * 4] <<"\n";
       cout << h_x * i <<"\t"<< u [i][Jv * 4] <<"\n";
   }
   out.close();
   getch();
   return 0;
}


выводит следующее:
Изображение

 Профиль  
                  
 
 Re: Метод Конечных Разностей для уравнения в частных производных
Сообщение09.11.2013, 18:13 
Заслуженный участник


11/05/08
32166
Ну у Вас типичная неустойчивость и наблюдается, что и естественно. У Вас там, судя по всему, шаг по координате одна десятая, по времени -- порядка одной шестидесятой, а для устойчивости требуется не более, чем порядка одной шестисотой.

 Профиль  
                  
 
 Re: Метод Конечных Разностей для уравнения в частных производных
Сообщение09.11.2013, 19:40 


22/06/12
417
ewert
Поменял на I = 10, J = 300. Но из-за этого решение стало во многих точках не устойчивым.
Изображение


Временной график не верен т к он возрастает, а должен стать стационарным.
Изображение

Можно ли Вас попросить помочь?, а то сам не могу найти свою ошибку.

 Профиль  
                  
 
 Re: Метод Конечных Разностей для уравнения в частных производных
Сообщение10.11.2013, 07:45 


22/06/12
417
Добавил также выгрузку динамического массива:
for (i=0; i<I;i++)
{
delete [] u[i];
}
delete [] u;
ругается:
Цитата:
ОС Windows инициировала точку останова в proga7Метод конечных разностей.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в proga7Метод конечных разностей.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит proga7Метод конечных разностей.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group