Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Метод Конечных Разностей для уравнения в частных производных  (Прочитано 6113 раз)
0 Пользователей и 1 Гость смотрят эту тему.
illuminates
Новенький

ru
Offline Offline

« : 10-11-2013 05:18 » 

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

Задача такая:
[math]U_t=3(1,1-0,5x)U_{xx}+e^t-1[/math]
[math]$ U(0,t)=0$[/math]
[math]$ U(1,t)=0$[/math]
 [math]$U(x,0)=0.01(1-x)x$[/math]
 
Решение нужно  найти с точностью [math]$0.0001$[/math] на отрезке [math]$T=1/a^*, где a^*=\max a(x,t)$[/math]
Построить графики функций [math]$u(x^*,t), u(x,jt^*)$[/math] где [math]$x^*=0.6, t^*=T/10, j=1,2,4$[/math]

явная разностная схема такая:
([math]$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$$[/math]

код программы:
Код:
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;
}

выводит следующее:
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-11-2013 14:36 » new

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

Разбейте ее на небольшие функции, каждая их которых решает свою подзадачу. Затем попробуем протестировать эти функции. На сайте есть статьи по использованию Unity, этот инструмент вполне сгодится.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines