Автор работы: Пользователь скрыл имя, 21 Октября 2014 в 10:05, курсовая работа
В работе сначала приводятся основные понятия и математическое толкование разностной схемы для уравнения Лапласа, далее приводятся разработанные в ходе исследований методы. В третьем разделе описываются работы методов и выявляется устойчивость различных разностных схем. Далее делается вывод о целесообразности применении тех или иных схем и листинги разработанных методов.
Аннотация 3
Введение 4
Раздел 1. Математическое описание алгоритмов и операций 6
Раздел 2. Библиотека функций 11
Раздел 3. Тестирование 12
Вывод 16
Заключение 17
Список использованной литературы 18
Приложения 19
Заключение
В ходе работы была изучена разностная схема «крест» для нахождения численного решения уравнения Лапласа (эллиптическое уравнение), задача Дирихле.
Также были усвоены и закреплены навыки:
Были созданы четыре метода реализующих разностную схему «крест» и один метод для «метода установления».
ElipYa.m |
function ElipYa(X,N,fi,E) %сеточный метод итерационный, процесс Якоби % X - Сторона прямоугольника % Y - Сторона прямоугольника % N - Количество узлов по х % K - Количество узлов по y % fi - функция граничного условия % E - точность h=X/N; %Равномерная сетка по пространственным переменным x=[0:h:h*N]; % Разбиваем сетку по переменной х y=[0:h:h*N]; % Разбиваем сетку по переменной у U=zeros(N+1,N+1); % матрица значений сеточной функции F=zeros(N+1,N+1); % матрица значений сеточной функции f(x,y) % "дискретизация начальных
условий" и начальное заполнение
матрицы значений сеточной U(1,:)=feval(fi,x(1),y); % Первая строка матрицы U(N+1,:)=feval(fi,x(N+1),y); % Последняя строка матрицы U(:,1)=feval(fi,y(1),x'); % Первый столбец матрицы U(:,N+1)=feval(fi,y(N+1),x'); % Последний столбец матрицы U(2:N,2:N)=rand(N-1,N-1); % Для решения нам необходимо начальное приближение. Осуществляем случайное начальное приближение! %Собственно вычисление... Применяется метод Якоби M=E+0.01; d=0; iter=0; while (M>E) % Пока не достигнем требуемой точности U0=U; for i=2:N % произведем расчеты Xb=U(i,:); for j=2:N
v=0.25*(U0(i+1,j)+U0(i-1,j)+ U(i,j)=v; end; d=norm(U(i,:)-Xb); if(M>d) % Если условия выполняется, то найдено новое значение остигнутой точности! M=d; end; end; iter=iter+1; end; figure; display('Всего потребовалось итераций: '); display(iter); surf(x,y,U); % Вывод поверхности! |
Elip1.m |
function [x,y,U]=Elip1(X,N,fi,E) %сеточный метод, итерационный процесс Гаусса-Зейделя % X - Сторона прямоугольника % Y - Сторона прямоугольника % N - Количество узлов по х % K - Количество узлов по y % fxy - функция правой части % fi - функция граничного условия % E - точность h=X/N; %Равномерная сетка по пространственным переменным x=[0:h:h*N]; % Разбиваем сетку по переменной х y=[0:h:h*N]; % Разбиваем сетку по переменной у U=zeros(N+1,N+1); % матрица значений сеточной функции F=zeros(N+1,N+1); % матрица значений сеточной функции f(x,y) % "дискретизация начальных
условий" и начальное заполнение
матрицы значений сеточной U(1,:)=feval(fi,x(1),y); % Первая строка матрицы U(N+1,:)=feval(fi,x(N+1),y); % Последняя строка матрицы U(:,1)=feval(fi,y(1),x'); % Первый столбец матрицы U(:,N+1)=feval(fi,y(N+1),x'); % Последний столбец матрицы U(2:N,2:N)=rand(N-1,N-1); % Для решения нам необходимо начальное приближение. Осуществляем случайное начальное приближение! %Собственно вычисление... Применяется метод Гаусса-Зейделя M=E+0.01; d=0; iter=0; while (M>E) % Пока не достигнем требуемой точности for i=2:N % произведем расчеты Xb=U(i,:); for j=2:N
v=0.25*(U(i+1,j)+U(i-1,j)+U(i, U(i,j)=v; end; d=norm(U(i,:)-Xb); if(M>d) % Если условия выполняется, то найдено новое значение остигнутой точности! M=d; end; end; iter=iter+1; end; %После завершения расчетов построим поверхность и вернем значения сетки и сеточной функции, опредеоенной на ней!. figure; display('Всего потребовалось итераций: '); display(iter); surf(x,y,U); % Вывод поверхности! |
ElipR.m |
function [x,y,U]=ElipR(X,N,fi,t,E) %сеточный метод, итерационный процесс верхней релаксации % X - Сторона прямоугольника % Y - Сторона прямоугольника % N - Количество узлов по х % K - Количество узлов по y % fi - функция граничного условия % E - точность h=X/N; %Равномерная сетка по пространственным переменным x=[0:h:h*N]; % Разбиваем сетку по переменной х y=[0:h:h*N]; % Разбиваем сетку по переменной у U=zeros(N+1,N+1); % матрица значений сеточной функции F=zeros(N+1,N+1); % матрица значений сеточной функции f(x,y) % "дискретизация начальных
условий" и начальное заполнение
матрицы значений сеточной U(1,:)=feval(fi,x(1),y); % Первая строка матрицы U(N+1,:)=feval(fi,x(N+1),y); % Последняя строка матрицы U(:,1)=feval(fi,y(1),x'); % Первый столбец матрицы U(:,N+1)=feval(fi,y(N+1),x'); % Последний столбец матрицы U(2:N,2:N)=rand(N-1,N-1); % Для решения нам необходимо начальное приближение. Осуществляем случайное начальное приближение! %Собственно вычисление...
Применяется метод верхней M=E+0.01; d=0; iter=0; while (M>E) % Пока не достигнем требуемой точности for i=2:N % произведем расчеты Xb=U(i,:); for j=2:N
v=(t/4)*(U(i+1,j)+U(i,j+1))-t* U(i,j)=v; end; d=norm(U(i,:)-Xb); if(M>d) % Если условия выполняется, то найдено новое значение остигнутой точности! M=d; end; end; iter=iter+1; end; figure; display('Всего потребовалось итераций: '); display(iter); surf(x,y,U); % Вывод поверхности! |
ElipGauss.m |
function [x,y,U]=ElipGauss(X,N,fi) % X - Сторона прямоугольника % N - Количество узлов по х % K - Количество узлов по y % fi - функция граничного условия % E - точность h=X/N; %Равномерная сетка по пространственным переменным x=[0:h:h*N]; % Разбиваем сетку по переменной х y=[0:h:h*N]; % Разбиваем сетку по переменной у U=zeros(N+1,N+1); % матрица значений сеточной функции F=zeros(N+1,N+1); % матрица значений сеточной функции f(x,y) Aii=-4*eye(N-1)+diag(ones(1,N- Aij=eye(N-1,N-1); % нижняя и верхняя диагонали A=zeros((N-1)*(N-1),(N-1)*(N- B=zeros((N-1)*(N-1),1); % правые части pos11=0; pos12=0; pos21=0; pos22=0; % "дискретизация начальных
условий" и начальное заполнение
матрицы значений сеточной U(1,:)=feval(fi,x(1),y); % Первая строка матрицы U(N+1,:)=feval(fi,x(N+1),y); % Последняя строка матрицы U(:,1)=feval(fi,y(1),x'); % Первый столбец матрицы U(:,N+1)=feval(fi,y(N+1),x'); % Последний столбец матрицы %U(2:N,2:N)=rand(N-1,N-1); % Для решения нам необходимо начальное приближение. Осуществляем случайное начальное приближение! for i=1:N-1 % Заполнение блочной матрицы - основной матрицы системы if(i==1) pos11=1; pos12=N-1; else pos11=pos12+1; pos12=pos12+N-1; end; for j=1:N-1 if(j==1) pos21=1; pos22=N-1; else pos21=pos22+1; pos22=pos22+N-1; end; if(i==j)
A(pos11:pos12,pos21:pos22)= else if(i==j-1 | i==j+1)
A(pos11:pos12,pos21:pos22)= end; end; end; %Произвести заполнение B if(pos11==1 & pos12==N-1) B(pos11:pos12,1)=-U(1,2:N)'; B(pos11,1)=B(pos11,1)-U(2,1); B(pos12,1)=B(pos12,1)-U(2,N+1) else if (pos11==(N-1)*(N-1)-(N-2) & pos12==(N-1)*(N-1)) B(pos11:pos12,1)=-U(N+1,2:N)'; B(pos11,1)=B(pos11,1)-U(N,1);
B(pos12,1)=B(pos12,1)-U(N,N+1) else
B(pos11,1)=B(pos11,1)-U(i+1,1)
B(pos12,1)=B(pos12,1)-U(i+1,N+ end; end; end;
%Собственно вычисление... Применяется метод Гаусса с исключением нулевых %элементов d=0; iter=0; X=A\B; for i=2:N if(i==2) pos11=1; pos12=N-1; else pos11=pos12+1; pos12=pos12+N-1; end; U(i,2:N)=X(pos11:pos12,1)' end; figure; surf(x,y,U); |
ElipT1.m |
function [x,y,U]=ElipT1(X,N,tau,fi,E) % X - Сторона квадрата % N - Количество узлов % tau - шаг по времени % fi - функция граничного условия % E - точность %Равномерная сетка по пространственным переменным h=X/N; x=[0:h:h*N]; % Разбиваем сетку по переменной х y=[0:h:h*N]; % Разбиваем сетку по переменной у U=zeros(N+1,N+1); % матрица значений сеточной функции U0=zeros(N+1, N+1); % матрица, содержащая предыдущий слой решения по времени F=zeros(N+1,N+1); % матрица значений сеточной функции f(x,y) % "дискретизация начальных условий" и начальное заполнение матрицы значений сеточной функции U(1,:)=feval(fi,x(1),y); % Первая строка матрицы U(N+1,:)=feval(fi,x(N+1),y); % Последняя строка матрицы U(:,1)=feval(fi,y(1),x'); % Первый столбец матрицы U(:,N+1)=feval(fi,y(N+1),x'); % Последний столбец матрицы % Заполнение матрицы U начальными значениями функции psi(x,y) - % произвольная функция для начального слоя for i=2:N for j=2:N U(i,j)=rand(1,1);% задаем некое случайное начальное приближение end; end; M=E+0.1; sigma=tau/h^2; iter=0; while(M>E & iter<=500) % процесс стремится к заданной точности U0=U; % запоминаем предыдущее приближение for i=2:N for j=2:N
U(i,j)=sigma*(U0(i+1,j)+U0(i- end; d=norm(U(i,:)-U0(i,:)); if(M>d) M=d; end; end; iter=iter+1; end; figure; display('Всего потребовалось итераций: '); display(iter); surf(x,y,U); % Вывод поверхности! |
1 Агошков В.И., Дубровский П.Б., Шутяев В.П. Методы решения задач математической физики
2 Турчак Л. И., Плотников П. В. Основы численных методов
3 Бахвалов Н.С., Жидков Н. П., Кобельков Г. М. Численные методы
4 Бахвалов Н.С., Жидков Н. П., Кобельков Г. М. Численные методы
5 Самарский А.А. Введение в численные методы
Информация о работе Решение эллиптических уравнений несколькими методами