Решение смешанной краевой задачи для гиперболического уравнения разностным методом
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
324
Сгущаем сетку в 16 раза M=160, N=320, , , получаем
Приближенное решение Точное решениеПогрешность 1,2717124220000001,2694823934596800,002230028540324
Из 1-5 видно, что заданная точность достигается и погрешность уменьшается с ростом M.
Заключение
К основным результатам курсовой работы можно отнести:
Обзор литературы по теме Решение смешанной краевой задачи для гиперболического уравнения разностным методом.
Программа smesh_giperb, разработанная в Borland C++ Version 3.1, код которой приведен в приложении.
Список используемой литературы
1.Трубников С.В. Численные методы. Часть 3: Решение дифференциальных уравнений. Учебное пособие для студентов вузов. - Брянск: БГУ, 2005.
2.Крылов В.И. и др. Вычислительные методы, т.II. М.: Наука, 1977.
.Самарский А.А. Теория разностных схем. М.: Наука, 1983.
.Крылов В.И, Бобков В.В, Монастырный П.И. Численные методы, т II. M.: Наука, 1977.
.Стефан Р.Д. C++ для "чайников", 4-е издание: Пер. с англ.: - М.: Издательский дом '"Вильяме", 2003.
.Трубников С.В. Задачник - практикум по численным методам. Часть 4. Описание библиотеки программ. Учебное пособие для студентов вузов. - Брянск: БГУ, 2005.
.Подбельский В.В. Язык Си++: Учебное пособие.-5-е издание - М.: Финансы и статистика, 2003.
Приложение
/* {Программа smesh_giperb предназначена для решения смешанной краевой задачи для уравнения гиперболического типа разностным методом.
Рассматривается смешанная краевая задача для дифференциального уравнения гиперболического типа:_xx (x,y)-u_yy (x,y)=f(x,y),0<y<Y<,alfa<x<betta (x,0) = fi(x), alfa<x<betta,_y (x,0)=psi(x)(y) u_x (alfa,y)+tau2(y)u(alfa,y)=w1(y)(y) u_x (betta,y)+sigma2(y)u(betta,y)=w2(y)
Ищется функция u(x,y)
В прямоугольной области (alfa<=x<=betta,0<=y<=Y), вводится сетка с шагами h и l по оси x и y соответственно.
Число отрезков разбиения по оси x - M, а по оси y - N. h=(alfa-betta)/MM, l= sqrt(h*h/2) - шаги сетки.
Приближённые значения решения u(x,y) в узлеах сетки с координатами x_j=h*j и y_i=i*l (j=0,1,...,M, i=0,1,...,N) ищутся разностным методом методом и записываются в файл rezultat.txt послойно. То есть значения ?u(x?_m,y_n) вычисляются последовательно:
На временном слое 0. При n=0 и для всех m от 0 до M,
На временном слое 1. При n=1 и для всех m от 0 до M,
................................
На временном слое N. При n=N и для всех m от 0 до M.
Записываются приближенные значения решения u(x_m,y_n) в файл rezultat.txt в следующем порядке:
sloi(x_0,y_0) u(x_1,y_0) … u(x_M,y_0)
sloi(x_0,y_1) u(x_1,y_1) … u(x_M,y_1) sloi(x_0,y_N) u(x_1,y_N) … u(x_M,y_N)
Для временного хранения приближенного решения при вычислениях по рекуррентным формулам используются также три массива u0[m],u1[m]и u2[m].
В начале вычисляется приближенное решение на нулевом временном слое. При вычислении оно помещается в массив u0 записывается в файл rezultat.txt.
Затем, зная решение на нулевом слое, по рекуррентной формуле находится решение на следующем, первом слое. При вычислении оно помещается в массив u1 и записывается в файл rezultat.txt.
Затем, зная решение на первом слое по рекуррентной формуле находится решение на следующем, втором слое. При вычислении это решение помещается в массив u2 и записывается в файл rezultat.txt
................................................................
Этот процесс продолжается до тех пор, пока не будет вычислено и записано в файл приближенное решение на последнем слое.
Массивы u0,u1 и u2 используются в качестве буферов, в которые временно помещается приближенное решение на очередном временном слое до записи его в файл. */
#include
#include
#include
#include
#include
#include
#include buffer[128], buffer_nomer[4];*copy;//указатель на переменную в которой хранится строка * fp;* st;M,N,i,j,octatok;alfa, betta, l,Y,NN;h;
# define NDEC 10
//задается функция f(x,y)f(double x,double y)
{(2*exp(x)*cos(y));
}
// задаются функции fi(x)и psi(x) из начальных условийfi(double x)
{(exp(x));
}psi(double x)
{x=0;x;
}
// задаются функции tau1(y), tau2(y),sigma1(y),sigma2(y),w1(y),w2(y) из граничных условийtau1(double y)
{y=1;y;
}tau2(double y)
{y=0;y;
}w1(double y)
{(exp(alfa)*cos(y));
}
w2(double y)
{(exp(betta)*cos(y));
}sigma1(double y)
{y=0;y;
}sigma2(double y)
{ y=1;y;
}
//функция для записи в файл номера слояzapis_sloya(int nomer)
{fp=fopen("d:\\rezultat.txt","a");(nomer,buffer_nomer,10);=new char[strlen(buffer_nomer)+1];(st,buffer_nomer);(st,"sloi ");(fp, "\n\r" );(fp, st );(fp, "\n\r" );(fp);st;
}
//функция для записи в файл значений на слое ?u(x?_m,y_n)zapis_v_file(float x)
{fp=fopen("d:\\rezultat.txt","a");(x,NDEC,buffer);=new char[strlen(buffer)+1];//строка длиной 'длина строковой переменной buffer+1',плюс 1 для нулевого символа(copy,buffer);(copy," ");(fp, copy );(fp);copy;//освобождение памяти
}()
{Y;=(betta-alfa)/M;cout<<h<<endl;//вычисление и вывод шага h=h/2;cout<<l<<endl;// вычисление и вывод шага l=fmod(Y,l);(octatok==0) NN=Y/l;NN=floor(Y/l); // вычисление N=NN;cout<<N;*u0;*u1;*u2;=(float*) malloc(M*sizeof(float));=(float*) malloc(M*sizeof(float));=(float*) malloc(M*sizeof(float));=fopen("d:\\rezultat.txt","w");
//вычисление и запись в файл нулевого слоя_sloya(0);(j=0;j<=M;j++)
{[j]=fi(j*h);_v_file(u0[j]);
}
//вычисление и запись в файл первого слоя_sloya(1);(j=0;j<=M;j++)
{[j]=psi(j*h)*l+u0[j];_v_file(u1[j]);
}
/*вычисление и запись в файл все с остальных слоев i=2,..N
Схема трехслойная, для вычисления одного слоя необходимы значения функции в узлах на предыдущих 2-х слоях.
Для вычисления, например 2го слоя используются значения на нулевом и первом, которые хранятся в массивах u0 и u1 соответственно. Значения же третьего слоя записываются в массив u2.
Для вычисления на третьем слое используются значения на первом и втором, которые хранятся в массивах u1 и u2 соответственно. Зна