Решение смешанной краевой задачи для гиперболического уравнения разностным методом

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

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 соответственно. Зна