2014 dxdy logo

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

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




 
 Метод Конечных Разностей для уравнения в частных производных
Сообщение09.11.2013, 17:55 
Здравствуйте, требуется ваша помощь в нахождении ошибки в программе. Вычисляю по явной схеме. Выдает какие-то очень большие числа.

Задача такая:
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 
Ну у Вас типичная неустойчивость и наблюдается, что и естественно. У Вас там, судя по всему, шаг по координате одна десятая, по времени -- порядка одной шестидесятой, а для устойчивости требуется не более, чем порядка одной шестисотой.

 
 
 
 Re: Метод Конечных Разностей для уравнения в частных производных
Сообщение09.11.2013, 19:40 
ewert
Поменял на I = 10, J = 300. Но из-за этого решение стало во многих точках не устойчивым.
Изображение


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

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

 
 
 
 Re: Метод Конечных Разностей для уравнения в частных производных
Сообщение10.11.2013, 07:45 
Добавил также выгрузку динамического массива:
for (i=0; i<I;i++)
{
delete [] u[i];
}
delete [] u;
ругается:
Цитата:
ОС Windows инициировала точку останова в proga7Метод конечных разностей.exe.

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

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

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

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group