Метод сеток
Var i, j, k: integer; u: array of real; x, y, s, f, f1, f2,f3,f4:real; begin s:=1; writeln ('Legenky Ilya 21BI'); writeln ('Kyrsova9 rabota: Metod Setok'); writeln ('3adanna9 to4nost e=0.01'); writeln ('shag h=0.2'); writeln ('f1=45y (1-y), f2=25, f3=25x, f4=25x*sin ((3.14*x)/2)'); //задаем функции и считаем их значения в каждой точке и записываем их в массив for i:=0 to a do begin x:=i*h… Читать ещё >
Метод сеток (реферат, курсовая, диплом, контрольная)
Сибирская государственная автомобильно-дорожная академия (СибАДИ) Факультет Информационных систем в управлении Кафедра Информационной безопасности Специальность «Комплексное обеспечение ИБ АС»
Пояснительная записка к курсовой работе по дисциплине: Вычислительная математика и программирование тема: Метод сеток Омск — 2009
- Аннотация
Программа разработана для решения дифференциального уравнения Лапласа:
в прямоугольной области ABCD, с вершинами A (0;0), B (0:1), C (1;1), D (1,0), шагом h=l=0,2, принимающее на границе заданные значения:; ;; , методом сеток, c точностью е= 0,01.Программа разработана на языке Borland Pascal 7.0
- 1. Численная постановка задачи
Уравнение Лапласа является модельным для эллиптических уравнений в частных производных. Некоторые важные задачи, часто встречающиеся в приложениях, сводятся к решению одного эллиптического уравнения. К ним относятся задачи расчета дозвукового безвихревого (потенциального) течения газа и определения стационарного поля температуры в твердом теле.
В данной работе требуется решить конечно — разностную задачу Дирихле для уравнения Лапласа в прямоугольной области т. е. найти непрерывную функцию и (х, у), удовлетворяющую внутри прямоугольной области уравнению Лапласа
(1)
и принимающую на границе области заданные значения, т. е.
,
,
где fl, f2, f3, f4 — заданные функции.
Будем считать, что и (х, у) непрерывна на границе области, т. е.
.
Выбрав шаги h, l по x и y соответственно, строим сетку:
, , ,
где,. [1]
Вводя обозначения, аппроксимируем частные производные и в каждом внутреннем узле сетки центральными разностными производными второго порядка
[2]
и заменим уравнение Лапласа конечно-разностным уравнением
(2)
.
Погрешность замены дифференциального уравнения разностным, составляет величину. [2]
Уравнения (2) вместе со значениями в граничных узлах образуют систему линейных алгебраических уравнений относительно приближенных значений функции и (х, у) в узлах сетки. Наиболее простой вид имеет эта система при :
(3) [1]
, , ,
.
При получении сеточных уравнений (3) была использована схема узлов. Набор узлов, используемых для аппроксимации уравнения в точке, называется шаблоном. В данной работе используется шаблон типа «крест».
Численное решение задачи Дирихле для уравнения Лапласа в прямоугольнике состоит в нахождении приближенных значений искомой функции и (х, у) во внутренних узлах сетки. Для определения величин требуется решить систему линейных алгебраических уравнений (3).
В данной работе она решается методом Зайделя, который состоит в построении последовательности итераций вида
(верхним индексом s обозначен номер итерации). При последовательность сходится к точному решению системы (3). В качестве условия окончания итерационного процесса можно принять
, .
Таким образом, погрешность приближенного решения, полученного методом сеток, складывается из двух погрешностей: погрешности аппроксимации дифференциального уравнения разностными значениями; погрешности, возникающей в результате приближенного решения системы разностных уравнений (3).
Известно, что описанная здесь разностная схема обладает свойством устойчивости и сходимости. Устойчивость схемы означает, что малые изменения в начальных данных приводят к малым изменениям решения разностной задачи. Только такие схемы имеет смысл применять в реальных вычислениях. Сходимость схемы означает, что при стремлении шага сетки к нулю () решение разностной задачи стремится к решению исходной задачи. Таким образом, выбрав достаточно малый шаг h, можно как угодно точно решить исходную задачу. [3]
Пример решения такой задачи Дирихле, приведен в решении заданного примера.
2. Решение заданного примера
Используя метод сеток, составить приближенное решение задачи Дирихле для уравнения Лапласа (1).
Решение получить в квадрате ABCD, с вершинами A (0;0), B (0:1), C (1;1), D (1,0), шаг h=l=0,2 ;
;
;
;
Систему линейных алгебраических уравнений решить по методу Зайделя, при е=0,01.
Для решения этой задачи, необходимо найти значение функции в ее узлах.
U1,U2,…, U16.
1) Построим сетку с шагом h=l=0,2
2) Вычислим значение функции, ,, построим сетку с граничными условиями.
на стороне АВ:
U (y=0)=0; U (y=0,2)=7,2; U (y=0,4)=10,8; U (y=0,6)=10,8; U (y=0,8)=7,2; U (y=1)=0
на стороне ВС:
U (x=0,2)=5; U (x=0,4)=10; U (x=0,6)=15; U (x=0,8)=20; U (x=1)=25
на стороне СD:
U (y=0,2)=25; U (y=0,4)=25; U (y=0,6)=25; U (y=0,8)=25;
на стороне АD:
U (x=0,2)=1,545;; U (x=0,4)=5,878; U (x=0,6)=12,135; U (x=0,8)=19,021;
U (x=1)=25
3) Составим систему линейных алгебраических уравнений:
Зададим начальные условия, значения функции в узловых точках равны 0
Составленную систему будем решать итерационным методом Зайделя.
2) Проверим условия сходимости: Возьмем значение функции в точке
коэффициенты перед и равны по 0,25; проверяем условие сходимости +<1, следовательно функция сходится.
Значение функции в узлах, находим при помощи программы.
3. Листинг программы
program MetodSetok;
{$APPTYPE CONSOLE}
uses SysUtils, Math;
const a=5; //количество шагов по х b=5; //количество шагов по y h=0.2; //шаг функции e=0.01; //заданная точность
var i, j, k:integer; u: array [0.5,0.5] of real; x, y, s, f, f1,f2,f3,f4:real; begin s:=1; writeln ('Legenky Ilya 21BI'); writeln ('Kyrsova9 rabota: Metod Setok'); writeln ('3adanna9 to4nost e=0.01'); writeln ('shag h=0.2'); writeln ('f1=45y (1-y), f2=25, f3=25x, f4=25x*sin ((3.14*x)/2)'); //задаем функции и считаем их значения в каждой точке и записываем их в массив for i:=0 to a do begin x:=i*h; f3:=25*x; f4:=25*x*sin ((3.14*x)/2); u[i][0]: =f3; u[i][b]: =f4; end; //задаем функции и считаем их значения в каждой точке и записываем их в массив for j:=0 to b do begin y:=j*h; f1:=45*y*(1-y); f2:=25; u[0][j]: =f1; u[a][j]: =f2; end; //вывод сетки с граничными условиями
writeln;
writeln ('Setka s grani4nimi yslovi9mi:'); writeln;
writeln ('y=1.0',' ', u[0][0]: 6:3,' ', u[1][0]: 6:3,' ', u[2][0]: 6:3,' ', u[3][0]: 6:3,' ', u[4][0]: 6:3,' ', u[5][0]: 6:3);
writeln ('y=0.8',' ', u[0][1]: 6:3,' u1=', u[1][1]: 6:3,' u2=', u[2][1]: 6:3,' u3=', u[3][1]: 6:3,' u4=', u[4][1]: 6:3,' ', u[5][1]: 6:3);
writeln ('y=0.6',' ', u[0][2]: 6:3,' u5=', u[1][2]: 6:3,' u6=', u[2][2]: 6:3,' u7=', u[3][2]: 6:3,' u8=', u[4][2]: 6:3,' ', u[5][2]: 6:3);
writeln ('y=0.4',' ', u[0][3]: 6:3,' u9=', u[1][3]: 6:3,' u10=', u[2][3]: 6:3,' u11=', u[3][3]: 6:3,' u12=', u[4][3]: 6:3,' ', u[5][3]: 6:3);
writeln ('y=0.2',' ', u[0][4]: 6:3,' u13=', u[1][4]: 6:3,' u14=', u[2][4]: 6:3,' u15=', u[3][4]: 6:3,' u16=', u[4][4]: 6:3,' ', u[5][4]: 6:3);
writeln ('y=0.0',' ', u[0][5]: 6:3,' ', u[1][5]: 6:3,' ', u[2][5]: 6:3,' ', u[3][5]: 6:3,' ', u[4][5]: 6:3,' ', u[5][5]: 6:3);
writeln (' ',' x=0',' x=0.2',' x=0.4',' x=0.6',' x=0.8',' x=1'); //решение системы методом Зайделя k:=0; while s>e do begin k:=k+1; //подсчет итераций for i:=1 to a-1 do begin for j:=1 to b-1 do begin f:=u[i][j]; //запонимаем значения функции u[i][j]: =(u[i+1][j]+u[i-1][j]+u[i][j+1]+u[i][j-1])/4; //решение системы методом Зайделя s:=abs (f-u[i][j]); //проверяем разность end; end;
writeln;
writeln ('iterazi9 nomer ', k);
writeln;
writeln ('y=1.0',' ', u[0][0]: 6:3,' ', u[1][0]: 6:3,' ', u[2][0]: 6:3,' ', u[3][0]: 6:3,' ', u[4][0]: 6:3,' ', u[5][0]: 6:3);
writeln ('y=0.8',' ', u[0][1]: 6:3,' u1=', u[1][1]: 6:3,' u2=', u[2][1]: 6:3,' u3=', u[3][1]: 6:3,' u4=', u[4][1]: 6:3,' ', u[5][1]: 6:3);
writeln ('y=0.6',' ', u[0][2]: 6:3,' u5=', u[1][2]: 6:3,' u6=', u[2][2]: 6:3,' u7=', u[3][2]: 6:3,' u8=', u[4][2]: 6:3,' ', u[5][2]: 6:3);
writeln ('y=0.4',' ', u[0][3]: 6:3,' u9=', u[1][3]: 6:3,' u10=', u[2][3]: 6:3,' u11=', u[3][3]: 6:3,' u12=', u[4][3]: 6:3,' ', u[5][3]: 6:3);
writeln ('y=0.2',' ', u[0][4]: 6:3,' u13=', u[1][4]: 6:3,' u14=', u[2][4]: 6:3,' u15=', u[3][4]: 6:3,' u16=', u[4][4]: 6:3,' ', u[5][4]: 6:3);
writeln ('y=0.0',' ', u[0][5]: 6:3,' ', u[1][5]: 6:3,' ', u[2][5]: 6:3,' ', u[3][5]: 6:3,' ', u[4][5]: 6:3,' ', u[5][5]: 6:3);
writeln (' ',' x=0',' x=0.2',' x=0.4',' x=0.6',' x=0.8',' x=1'); end; //вывод результата
writeln;
writeln ('Rezultati vipolneni9 programmi:');
writeln ('koli4estvo iterazii i=', k);
writeln;
writeln ('y=1.0',' ', u[0][0]: 6:3,' ', u[1][0]: 6:3,' ', u[2][0]: 6:3,' ', u[3][0]: 6:3,' ', u[4][0]: 6:3,' ', u[5][0]: 6:3);
writeln ('y=0.8',' ', u[0][1]: 6:3,' u1=', u[1][1]: 6:3,' u2=', u[2][1]: 6:3,' u3=', u[3][1]: 6:3,' u4=', u[4][1]: 6:3,' ', u[5][1]: 6:3);
writeln ('y=0.6',' ', u[0][2]: 6:3,' u5=', u[1][2]: 6:3,' u6=', u[2][2]: 6:3,' u7=', u[3][2]: 6:3,' u8=', u[4][2]: 6:3,' ', u[5][2]: 6:3);
writeln ('y=0.4',' ', u[0][3]: 6:3,' u9=', u[1][3]: 6:3,' u10=', u[2][3]: 6:3,' u11=', u[3][3]: 6:3,' u12=', u[4][3]: 6:3,' ', u[5][3]: 6:3);
writeln ('y=0.2',' ', u[0][4]: 6:3,' u13=', u[1][4]: 6:3,' u14=', u[2][4]: 6:3,' u15=', u[3][4]: 6:3,' u16=', u[4][4]: 6:3,' ', u[5][4]: 6:3);
writeln ('y=0.0',' ', u[0][5]: 6:3,' ', u[1][5]: 6:3,' ', u[2][5]: 6:3,' ', u[3][5]: 6:3,' ', u[4][5]: 6:3,' ', u[5][5]: 6:3);
writeln (' ',' x=0',' x=0.2',' x=0.4',' x=0.6',' x=0.8',' x=1'); readln; { TODOoUsercConsole Main: Insert code here }
end.
4. Результаты работы программы
Литература
1. Демидович Б. П., Марон И. А., Шувалова Э. З. «Численные методы анализа. Приближение функций, дифференциальные и интегральные уравнения», М.: Наука, 1967. — 368 с.
2. Вержбицкий В. М. «Численные методы. Математический анализ и обыкновенные дифференциальные уравнения», М.: Высшая школа, 2001. — 384 с.
3. Бундаев В. В., Дамбаев Ж. Г. «Методические указания и контрольные задания по численным методам», Улан-Удэ: РИО ВСГТУ, 2003. — 16 с.