Дипломx

реклама
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультет прикладной математики и информатики
Кафедра вычислительной математики
БАСАЛАЙ ДМИТРИЙ НИКОЛАЕВИЧ
БЕССЕТОЧНЫЙ МЕТОД РЕШЕНИЯ УРАВНЕНИЯ ПУАССОНА
Дипломная работа
студента 5 курса 5 группы
“Допустить к защите“
Зав. кафедрой Выч. мат.
_____________________
“___” ___________ 2010 г
Минск 2010
Руководитель
Никифоров Иван Васильевич,
доцент кафедры Выч. мат.,
канд. физ.-мат. наук
Рецензент
Будник Анатолий
Михайлович,
доцент кафедры Выч. мат.,
канд. физ.-мат. наук
АННОТАЦИЯ
Главной целью работы является изучение бессеточного метода решения
уравнения Пуассона, построение алгоритмов численного решения, проведение
вычислительного эксперимента, а также анализ полученных результатов.
АНАТАЦЫЯ
Галоўнай мэтай дадзенай работы з’яўляецца вывучэнне бяссетачнага
метаду рашэння ураўнення Пуасона, пабудова алгарытмаў колькаснага
рашэння, правядзенне вылічальнага эксперыменту, а таксама аналіз атрыманых
вынікаў.
ANNOTATION
The main objective of this work is to study the grid free method for solving the
Poisson equation, the construction of algorithms for numerical solution, making
numerical experiment and analysis of the results.
2
РЕФЕРАТ
Дипломная работа, 38 с., 18 рис., 3 табл., 6 источников, 1 приложение.
УРАВНЕНИЕ ПУАССОНА, ЗАДАЧА ДИРИХЛЕ, ЗАДАЧА НЕЙМАНА,
БЕССЕТОЧНЫЙ МЕТОД, МЕТОД НАИМЕНЬШИХ КВАДРАТОВ
Объект исследования – бессеточный метод решения уравнения Пуассона.
Цель работы – изучить бессеточный метод решения уравнения Пуассона,
построить
алгоритмы
численного
решения,
провести
вычислительный
эксперимент, а также проанализировать полученные результаты.
Методы исследования: численные, сравнительного анализа.
Результатами являются численный метод решения уравнения Пуассона, а
также анализ полученных результатов.
Областью применения исследуемого метода является гидродинамика.
3
СОДЕРЖАНИЕ
Обозначения и сокращения ........................................................................................ 5
Введение ....................................................................................................................... 6
1
Численный метод ................................................................................................ 8
1.1
Аппроксимация функции и ее производных методом наименьших
квадратов.................................................................................................... 8
1.2
Аппроксимация методом наименьших квадратов для уравнения
Пуассона .................................................................................................. 10
2
3
Программа .......................................................................................................... 15
2.1
Общее описание ...................................................................................... 15
2.2
Обзор основного функционала и работа с программой ..................... 15
Тесты .................................................................................................................. 20
3.1
Двумерная задача с граничными условиями Дирихле ....................... 20
3.2
Трехмерная задача с граничными условиями Дирихле ...................... 23
Список используемых источников .......................................................................... 32
Приложение А Листинг программы для решения уравнения Пуассона
бессеточным методом ............................................................................................... 34
4
ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ
SPH – Smoothed Particle Hydrodynamics.
СУБД – система управления баз данных.
PDE – Partial Differential Equation.
5
ВВЕДЕНИЕ
Бессеточные методы, также называемые методами частиц, первоначально
были разработаны для решения модельных задач динамики жидкости.
Примером таких методов может служить метод гидродинамики сглаженных
частиц (Smoothed Particle Hydrodynamics, SPH), изначально используемый для
решения астрофизических задач, но в последствии применяемый для
моделирования движения жидкостей. Метод SPH является бессеточным
методом Лагранжа (в котором координаты движутся вместе с жидкостью), и
разрешающая
способность
метода
может
быть
легко
отрегулирована
относительно переменных, таких как плотность. Метод гидродинамики
сглаженных частиц имеет массу переимуществ по сравнению с традиционными
основанными на сетке методиками.
Другой бессеточный метод для задач динамики жидкости основан на
методе наименьших квадратов или методе скользящих наименьших квадратов.
Основная
идея
этого
метода
–
аппроксимировать
пространственные
производные функции в произвольной точке, используя ее значения в соседних
точках. Точки выбираются произвольным образом и не обязательно должны
быть распределены регулярно. [1, с. 1]
Решение уравнения Пуассона (фр. Siméon-Denis Poisson, 1781 – 1840)
применяется для нестационарных задач в несжимаемых потоках жидкости. В
некоторых проекционных методах для уравнения Навье-Стокса (фр. Navier,
1785 – 1836; англ. George Gabriel Stokes, 1819 – 1903) требуется решить
уравнение Пуассона для давления. [3] Некоторые авторы рассмотрели
проекционные методы, основанные на правильной сеточной структуре, в
результате чего уравнение Пуассона можно было решить с помощью
стандартных методов, например, методом конечных элементов или конечных
разностей. Однако сеточный метод становится достаточно трудоёмким, если
вычислительная область изменяется со временем или принимает сложные
формы. В этом случае требуется переразбиение сетки, и необходимо
6
предпринимать больше вычислительных усилий. Поэтому бессеточный метод
имеет несравненные преимущества.
Бессеточный метод может быть применен к любой эллиптической задаче
и подходит для численного решения эллиптического уравнения на достаточно
плохой сетке.
Бессеточный метод представляет собой локальный итерационный
процесс, основанный на аппроксимации методом наименьших квадратов.
Функции и ее производные могут быть очень точно приближены в
соответствии с методом в произвольной точке, используя ее дискретные
значения в соседних точках. Однако в силу того, что значения функции в
точках не даны, а есть только уравнение Пуассона и граничные условия, в
качестве начальных значений мы полагаем значения функции на границе.
Метод
является устойчивым, и численное решение сходится
к
фиксированной точке при числе итераций, стремящемся к бесконечности. Он
может быть применен как к грубому, так и более тонкому распределению
точек. Скорость сходимости выше на более грубой сетке. [1, с. 3]
7
1
Численный метод
1.1
Аппроксимация функции и ее производных методом
наименьших квадратов
Метод
наименьших
квадратов
может
быть
применен
к
весьма
неправильным структурам. В практических приложениях сетка играет
определяющую роль в нахождении решения, и многие методы теряют точность,
если она задана плохо. Преимущество метода наименьших квадратов состоит в
том, что он не требует правильной структуры сетки для приближения функции
и ее производных.
Пусть 𝑓(𝑥⃗) скалярная функция, и 𝑓𝑖 ее значения в точках 𝑥⃗𝑖 ∈ Ω ⊂
𝑅𝑑 (𝑑 = 1, 2, 3), 𝑖 = 1, 2, … , 𝑁, где 𝑁 – общее число точек в Ω. Мы решаем задачу
аппроксимации функции 𝑓(𝑥⃗) и ее производных в точке 𝑥⃗𝑖 , используя значения
в соседних точках. Чтобы ограничить количество точек, мы используем
весовую функцию 𝑤 = 𝑤(𝑥⃗𝑖 − 𝑥⃗; ℎ) с параметром ℎ. Константа ℎ подобна
длине сглаживания в классическом методе сглаженных частиц. Весовая
функция может быть произвольной. В наших вычислениях будем использовать
весовую функцию Гаусса в следующей форме:
‖𝒙
‖𝒙
⃗⃗𝒊 − 𝒙
⃗⃗‖𝟐
⃗⃗𝒊 − 𝒙
⃗⃗‖
𝒆𝒙𝒑 (−𝜶
,
если
≤𝟏
)
⃗⃗𝒊 − 𝒙
⃗⃗; 𝒉) = {
𝒘(𝒙
𝒉𝟐
𝒉
𝟎, в противном случае,
(1.1)
где 𝜶 – положительная константа. Размер ℎ определяет набор соседних точек
вокруг 𝑥⃗. Пусть 𝑃(𝑥⃗; ℎ) = {𝑥⃗𝑖 : 𝑖 = 1, 2, … , 𝑛} множество из 𝑛 точек, лежащих в
шаре с центром в точке 𝑥⃗ радиуса ℎ. Радиус ℎ берут большим, если функцию
необходимо приблизить многочленом большей степени.
Разложение в ряд Тейлора и метод наименьших квадратов позволяют
быстро и точно вычислить приближение функции и ее производных. Для этого
записываем разложение Тейлора в окресности точки 𝑥⃗ с неизвестными
8
коэффициентами и затем вычисляем эти коэффициенты, минимизируя
взвешенную ошибку по соседним точкам.
Рассмотрим разложение по формуле Тейлора функции
𝑓(𝑥⃗𝑖 ) в
окрестности точки 𝑥⃗:
𝟑
⃗⃗𝒊 ) = 𝒇(𝒙
⃗⃗) + ∑ 𝒇𝒌 (𝒙
⃗⃗) ∙ (𝒙𝒌𝒊 − 𝒙𝒌 )
𝒇(𝒙
𝒌=𝟏
(1.2)
𝟑
+
𝟏
⃗⃗) ∙ (𝒙𝒌𝒊 − 𝒙𝒌 ) ∙ (𝒙𝒍𝒊 − 𝒙𝒍 ) + 𝒆𝒊 , 𝒊 = 𝟏, … , 𝒏
∑ 𝒇𝒌𝒍 (𝒙
𝟐
𝒌,𝒍=𝟏
где 𝒆𝒊 – ошибка разложения в точке 𝑥⃗𝑖 . Символами 𝑥1𝑖 , 𝑥2𝑖 и 𝑥3𝑖 обозначены
компоненты точки 𝑥⃗𝑖 . Неизвестные 𝑓, 𝑓𝑘 и 𝑓𝑘𝑙 (= 𝑓𝑙𝑘 ), 𝑘, 𝑙 = 1, 2, 3 вычисляются
минимизацией ошибки 𝑒𝑖 , 𝑖 = 1, … , 𝑛. Система уравнений может быть записана
как
⃗⃗ = 𝑴𝒂
⃗⃗ − ⃗𝒃⃗
𝒆
(1.3)
где
𝑴=
𝟏
𝒅𝒙𝟏
𝒅𝒚𝟏
𝒅𝒛𝟏
𝟏
𝒅𝒙𝟐
𝒅𝒚𝟐
𝒅𝒛𝟐
⋮
⋮
⋮
⋮
𝒅𝒚𝒏
𝒅𝒛𝒏
(𝟏 𝒅𝒙𝒏
𝟏 𝟐
𝒅𝒙
𝟐 𝟏
𝟏 𝟐
𝒅𝒙
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒙
𝟐 𝒏
𝒅𝒙𝟏 𝒅𝒚𝟏
𝒅𝒙𝟏 𝒅𝒛𝟏
𝒅𝒙𝟐 𝒅𝒚𝟐
𝒅𝒙𝟐 𝒅𝒛𝟐
⋮
⋮
𝒅𝒙𝒏 𝒅𝒚𝒏
𝒅𝒙𝒏 𝒅𝒛𝒏
𝟏 𝟐
𝒅𝒚
𝟐 𝟏
𝟏 𝟐
𝒅𝒚
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒚
𝟐 𝒏
𝒅𝒚𝟏 𝒅𝒛𝟏
𝒅𝒚𝟐 𝒅𝒛𝟐
⋮
𝒅𝒚𝒏 𝒅𝒛𝒏
𝟏 𝟐
𝒅𝒛
𝟐 𝟏
𝟏 𝟐
𝒅𝒛
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒛
𝟐 𝒏)
(1.4)
⃗⃗ = [𝒇, 𝒇𝟏 , 𝒇𝟐 , 𝒇𝟑 , 𝒇𝟏𝟏 , 𝒇𝟏𝟐 , 𝒇𝟏𝟑 , 𝒇𝟐𝟐 , 𝒇𝟐𝟑 , 𝒇𝟑𝟑 ]𝑻 ,
𝒂
⃗𝒃⃗ = [ 𝒇𝟏 , 𝒇𝟐 , … , 𝒇𝒏 ]𝑻 ,
⃗⃗ = [ 𝒆𝟏 , 𝒆𝟐 , … , 𝒆𝒏 ]𝑻 .
𝒆
9
(1.5)
Символами 𝑑𝑥𝑖 , 𝑑𝑦𝑖 , 𝑑𝑧𝑖 обозаначены 𝑥𝑖1 − 𝑥1 , 𝑥𝑖2 − 𝑥𝑖 , 𝑥𝑖3 − 𝑥3 ,
соответственно, 𝑖 = 1, … , 𝑛.
При 𝑛 > 10 эта система переопределена для десяти неизвестных
𝑓, 𝑓𝑘 и 𝑓𝑘𝑙 , 𝑘, 𝑙 = 1, 2, 3.
Неизвестный вектор 𝑎⃗ получается из взвешеннго метода наименьших
квадратов минимизацией квадратичной формы
𝒏
𝑱 = ∑ 𝒘𝒊 𝒆𝟐𝒊
(1.6)
𝒊=𝟏
которая может быть записана в следующей форме
𝑻
⃗⃗ − ⃗𝒃⃗) 𝑾(𝑴𝒂
⃗⃗ − ⃗𝒃⃗)
𝑱 = (𝑴𝒂
(1.7)
𝒘𝟏
𝟎
𝑾=(
⋮
𝟎
(1.8)
где
𝟎
𝒘𝟐
⋮
𝟎
⋯ 𝟎
⋯ 𝟎
)
⋱
⋮
⋯ 𝒘𝒏
Минимизация 𝐽 формально дает результат
⃗⃗
⃗⃗ = (𝑴𝑻 𝑾𝑴)−𝟏 (𝑴𝑻 𝑴)𝒃
𝒂
1.2
(1.9)
Аппроксимация методом наименьших квадратов для
уравнения Пуассона
Применим аппроксимацию методом наименьших квадратов для решения
уравнения Пуассона. При этом мы не будем дискретизировать уравнение
10
Пуассона непосредственно как в классических методах, а решим его при
помощи итерационного процесса. Рассмотрим следующее уравнение Пуассона
∆𝒖 = 𝒇 в 𝛀
(1.10)
с граничными условиями Дирихле: 𝒖 = 𝒈 на 𝚪
(1.11)
с граничными условиями Неймана:
𝝏𝒖
= 𝒈 на 𝚪
⃗⃗
𝝏𝒏
(1.12)
или со смешанными граничными условиями.
В предыдущем разделе мы рассмотрели метод наименьших квадратов для
приближения функции и ее производных в произвольной точке, используя ее
значение в соседних точках. В данном же случае значения 𝑢 в дискретных
точках неизвестны априори. Это значит, что если вектор 𝑏⃗⃗ в формуле (1.9)
неизвестен, то мы не можем определить коэффициенты вектора 𝑎⃗, поэтому
задаем начальное значение 𝑢(0) функции 𝑢 во всех точках. Теперь рассмотрим
задачу нахождения 𝑢 в произвольной точке 𝑥⃗ по ее соседним точкам 𝑥⃗𝑖 , 𝑖 =
1, … , 𝑛. Как было показано в предыдущем пункте, снова рассмотрим
разложение 𝑢 в точке 𝑥⃗
𝟑
(𝝉+𝟏)
⃗⃗𝒊 ) = 𝒖(𝝉+𝟏) (𝒙
⃗⃗) + ∑ 𝒖𝒌
𝒖(𝝉) (𝒙
(𝒙
⃗⃗) ∙ (𝒙𝒌𝒊 − 𝒙𝒌 )
𝒌=𝟏
(1.13)
𝟑
+
𝟏
(𝝉+𝟏)
(𝝉+𝟏)
⃗⃗) ∙ (𝒙𝒌𝒊 − 𝒙𝒌 ) ∙ (𝒙𝒍𝒊 − 𝒙𝒍 ) + 𝒆𝒊
∑ 𝒖𝒌𝒍 (𝒙
, 𝝉 = 𝟎, 𝟏, 𝟐, …
𝟐
𝒌,𝒍=𝟏
⃗⃗𝒊 ) известные начальные значения. Также применяем условие того, что
где 𝒖(𝟎) (𝒙
точка 𝑥⃗ является решением уравнения (1.10). Для этого добавляем следующее
уравнение к упомянутым выше 𝑛 уравнениям:
(𝝉+𝟏)
𝒇 = 𝒖𝟏𝟏
(𝝉+𝟏)
(𝝉+𝟏)
(𝒙
⃗⃗) + 𝒖𝟐𝟐 (𝒙
⃗⃗) + 𝒖𝟑𝟑 (𝒙
⃗⃗)
11
(1.14)
Для граничных условий Неймана (1.12) мы имеем еще одно уравнение
для точки 𝑥⃗, лежащей на границе
(𝝉+𝟏)
𝒈 = 𝒖𝟏
(𝝉+𝟏)
(𝝉+𝟏)
(𝒙
(𝒙
(𝒙
⃗⃗)𝒏𝒙 + 𝒖𝟐
⃗⃗)𝒏𝒚 + 𝒖𝟑
⃗⃗)𝒏𝒛
(1.15)
где 𝒏𝒙 , 𝒏𝒚 , 𝒏𝒛 – компоненты нормального вектора 𝑛⃗⃗ в граничной точке 𝑥⃗.
Следовательно, мы имеем систему из 𝑛 + 2 уравнений с 10 неизвестными и в
общем случае 𝑛 ≥ 10.
Получим коэффициенты
(𝝉+𝟏)
𝒖(𝝉+𝟏) , 𝒖𝟏
(𝝉+𝟏)
, 𝒖𝟐
(𝝉+𝟏)
, 𝒖𝟑
(𝝉+𝟏)
, 𝒖𝟏𝟏
(𝝉+𝟏)
, 𝒖𝟏𝟐
(𝝉+𝟏)
, 𝒖𝟏𝟑
(𝝉+𝟏)
, 𝒖𝟐𝟐
(𝝉+𝟏)
, 𝒖𝟐𝟑
(𝝉+𝟏)
, 𝒖𝟑𝟑
(1.16)
для 𝜏 = 1, 2, … в точке 𝑥⃗ минимизацией
𝒏
𝑱=
(𝝉+𝟏) 𝟐
∑ 𝒘𝒊 (𝒆𝒊
)
𝒊=𝟏
𝟐
𝝏𝒖(𝝉+𝟏)
(𝝉+𝟏)
+ (∆𝒖
− 𝒇) + (
− 𝒈)
⃗⃗
𝝏𝒏
𝟐
(1.17)
Аналогично минимизация 𝐽 дает
⃗⃗(𝝉) , 𝝉 = 𝟎, 𝟏, …,
⃗⃗(𝝉+𝟏) = (𝑴𝑻 𝑾𝑴)−𝟏 (𝑴𝑻 𝑴)𝒃
𝒂
(1.18)
где матрицы и векторы отличаются от (1.4), (1.5) и имеют вид
𝑴=
𝟏
𝒅𝒙𝟏
𝒅𝒚𝟏
𝒅𝒛𝟏
𝟏
𝒅𝒙𝟐
𝒅𝒚𝟐
𝒅𝒛𝟐
⋮
⋮
⋮
⋮
𝒅𝒚𝒏
𝒅𝒛𝒏
𝟎
𝒏𝒚
𝟎
𝒏𝒙
𝟏 𝒅𝒙𝒏
𝟎
(𝟎
𝟎
𝒏𝒙
𝟏 𝟐
𝒅𝒙
𝟐 𝟏
𝟏 𝟐
𝒅𝒙
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒙
𝟐 𝒏
𝟏
𝟎
𝒅𝒙𝟏 𝒅𝒚𝟏
𝒅𝒙𝟏 𝒅𝒛𝟏
𝒅𝒙𝟐 𝒅𝒚𝟐
𝒅𝒙𝟐 𝒅𝒛𝟐
⋮
⋮
𝒅𝒙𝒏 𝒅𝒚𝒏
𝒅𝒙𝒏 𝒅𝒛𝒏
𝟎
𝟎
𝟎
𝟎
12
𝟏 𝟐
𝒅𝒚
𝟐 𝟏
𝟏 𝟐
𝒅𝒚
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒚
𝟐 𝒏
𝟏
𝟎
𝒅𝒚𝟏 𝒅𝒛𝟏
𝒅𝒚𝟐 𝒅𝒛𝟐
⋮
𝒅𝒚𝒏 𝒅𝒛𝒏
𝟎
𝟎
𝟏 𝟐
𝒅𝒛
𝟐 𝟏
𝟏 𝟐
𝒅𝒛
𝟐 𝟐
⋮
𝟏 𝟐
𝒅𝒛
𝟐 𝒏
𝟏
𝟎 )
(1.19)
𝒘𝟏
𝟎
⋮
𝑾=
𝟎
𝟎
(𝟎
(𝝉+𝟏)
⃗𝒂⃗(𝝉+𝟏) = [𝒖(𝝉+𝟏) , 𝒖𝟏
(𝝉+𝟏)
, 𝒖𝟐
⃗⃗(𝝉)
𝒃
𝟎
𝒘𝟐
⋮
𝟎
𝟎
𝟎
(𝝉+𝟏)
, 𝒖𝟑
=[
⋯
⋯
⋱
⋯
⋯
⋯
𝟎
𝟎
⋮
𝒘𝒏
𝟎
𝟎
(𝝉+𝟏)
, 𝒖𝟏𝟏
(𝝉+𝟏)
, 𝒖𝟏𝟐
𝟎
𝟎
⋮
𝟎
𝟏
𝟎
𝟎
𝟎
⋮
𝟎
𝟎
𝟏)
(𝝉+𝟏)
, 𝒖𝟏𝟑
(1.20)
(𝝉+𝟏)
, 𝒖𝟐𝟐
(𝝉+𝟏)
, 𝒖𝟐𝟑
(𝝉+𝟏) 𝑻
, 𝒖𝟑𝟑
]
,
(1.21)
𝑻
(𝝉) (𝝉)
(𝝉)
𝒖𝟏 , 𝒖𝟐 , … , 𝒖𝒏 , 𝒇, 𝒈]
Отметим, что можно использовать уравнение (1.14) в (1.13) для того,
чтобы уменьшить количество неизвестных. Так например, из (1.14) имеем
(𝝉+𝟏)
𝒖𝟑𝟑
(𝝉+𝟏)
(𝝉+𝟏)
(𝒙
⃗⃗) = 𝒇 − 𝒖𝟏𝟏 (𝒙
⃗⃗) − 𝒖𝟐𝟐 (𝒙
⃗⃗)
(1.22)
Подставляем в (1.13) и уменьшаем число неизвестных до 9 для внутренних
точек. Следовательно, вместо матицы 10 × 10 нужно инвертировать матрицу
9 × 9. Это, конечно, не сильно уменьшает вычислительные затраты. В этом
случае коэффициенты матрицы 𝑀 и вектора 𝑏⃗⃗ отличаются от предложенных
выше. Но при этом в обоих случаях скорость сходимости остается одинаковой.
Итерации повторяются для каждой точки. После каждой из них функции
присваиваются новые значения 𝑢(𝜏+1) . Для каждой точки, например, в
трехмерном случае нужно инвертировать матрицу 10 × 10. Этот метод может
оказаться медленнее, чем другие классические методы для решения уравнения
Пуассона, но в нашем случае мы не прилагаем усилий для генерации сетки, и
решение может быть получено для произвольной нерегулярной геометрии.
Завершаем
итерации,
если
ошибка
неравенству
13
удовлетворяет
следующему
(𝝉+𝟏)
(𝝉)
∑𝑵
− 𝒖𝒊 |
𝒊=𝟏 |𝒖𝒊
(𝝉+𝟏)
∑𝑵
|
𝒊=𝟏 |𝒖𝒊
<𝜺
(1.23)
и решение определяется как 𝑢(𝑥𝑖 ) ≔ 𝑢(𝜏+1) (𝑥𝑖 ) при 𝜏 стремящемся к
бесконечности. Параметр 𝜀 – очень малая положительная константа,
варьирующаяся в зависимости от задачи и значения ℎ. Параметр ℎ обычно
выбирают согласно топологии. Скорость сходимости будет больше, если
выбрать параметр ℎ большим, при этом увеличив расстояние между точками.
14
2
Программа
2.1
Общее описание
Для численного решения уравнения Пуассона было разработано
приложение, позволяющее решать уравнение Пуассона двух видов (∆𝑢 = 𝑓 и
∆𝑢 − 𝑢 = 𝑓) с регулярным и нерегулярным распределением точек, используя
бессеточный метод, а также предоставляющее возможность сохранения
полученных результатов для последующей визуализации или использования в
прикладных задачах. Приложение А содержит листинг описанной программы.
2.2
Обзор основного функционала и работа с программой
Программа представляет собой веб-приложение (см. рисунок 2.1).
Рисунок 2.1 – Демонстрационное приложение
15
Для решения необходимо выбрать тип уравнения Пуассона:
Рисунок 2.2 – Выбор типа уравнения
размерность задачи (двумерная или трехмерная):
Рисунок 2.3 – Выбор размерности задачи
метод задания сетки:
16
Рисунок 2.4 – Выбор метода задания сетки
и наконец, ввести входные параметры метода:
Рисунок 2.5 – Входные параметры
Если все введенные данные корректны, то по окончанию рассчетов
полученные результаты будут выведены на экран (см. рисунок 2.6), а также
будет построен график решения (см. рисунок 2.7):
17
Рисунок 2.6 – Решение
Рисунок 2.7 – График решения
18
Для анализа результатов выполнения программы с разными входными
данными предусмотрена возможность просмотра статистики:
Рисунок 2.8 – Статистика
19
3
Тесты
3.1
Двумерная задача с граничными условиями Дирихле
Выполним численные эксперименты в двумерном пространстве, решив
уравнение Пуассона на единичном квадрате, где известно аналитическое
решение. Рассмотрим как регулярное, так и нерегулярное распределение точек.
Регулярные точки сгенерированы с интервалом ∆𝑥 = 0.1. Для нерегулярного
случая границы области заменены набором точек с интервалом 0.1, а
распределение внутренних точек выбрано произвольным неоднородным
образом. Параметр ℎ в весовой функции выберем равным 0.23. В качестве
начального приближения для 𝑢 возьмем 𝑢(0) (𝑥⃗𝑖 ) = 0 во всех точках.
Рассмотрим следующую задачу для уравнения Пуассона с граничными
условиями Дирихле
∆𝒖 = 𝟏 в (𝟎, 𝟏) × (𝟎, 𝟏)
𝒖 = 𝟎 на 𝒙 = 𝟎, 𝒚 = 𝟎, 𝒙 = 𝟏, 𝒚 = 𝟏
(3.1)
Аналитическое решение этой задачи задается формулой:
𝒖(𝒙, 𝒚) =
(𝒙 − 𝟏)𝒙
𝟐
∞
𝟒
𝒔𝒊𝒏𝒉[(𝟐𝒏 − 𝟏)𝝅(𝟏 − 𝒚)] + 𝒔𝒊𝒏𝒉[(𝟐𝒏 − 𝟏)𝝅𝒚]
+ 𝟑∑[
]
𝝅
𝒔𝒊𝒏𝒉(𝟐𝒏 − 𝟏)𝝅
𝒏=𝟏
∙
𝒔𝒊𝒏(𝟐𝒏 − 𝟏)𝝅𝒙
(𝟐𝒏 − 𝟏)𝟑
Таблица 3.1 – Входные параметры
Параметр
Количество точек
Значение
100
20
(3.2)
Продолжение таблицы 3.1
Параметр
Значение
X1
0
X2
1
Y1
0
Y2
1
Значение функции на границе
0
𝜀
0.00001
ℎ
0.23
𝛼
0.00001
Результаты:
 количество итераций – 28,
 время выполнения – 00:00:00.7950455,
 максимальная погрешность – 0.001502105.
21
Рисунок 3.1 – График решения
Увеличим параметр ℎ, отвечающий за выбор соседних точек, в два раза и
посмотрим как при этом изменятся результаты вычислений.
Таблица 3.2 – Входные параметры
Параметр
Значение
Количество точек
100
X1
0
X2
1
Y1
0
Y2
1
Значение функции на границе
0
𝜀
0.00001
ℎ
0.46
𝛼
0.00001
Результаты:
 количество итераций – 13,
 время выполнения – 00:00:01.1480657,
 максимальная погрешность – 0.001201603.
22
Рисунок 3.2 – График решения
Как
видим
из
полученных
результатов,
количество
итераций
уменьшилось более чем в два раза, однако время выполнения увеличилось в
полтора раза, погрешность при этом практически не изменилась. Увеличение
времени вычислений связано с тем, что наиболее затратной процедурой в
алгоритме является нахождение матриц 𝑀 и 𝑊, а также произведение
необходимых
операций
над
ними:
перемножение,
транспонирование,
вычисление обратных матриц.
3.2
Трехмерная задача с граничными условиями Дирихле
Выполним численные эксперименты в трехмерном пространстве, решив
уравнение Пуассона на единичном кубе, где известно аналитическое решение.
Рассмотрим как регулярное, так и нерегулярное распределение точек.
Регулярные точки сгенерированы с интервалом ∆𝑥 = 0.1. Для нерегулярного
случая границы области заменены набором точек с интервалом 0.1, а
распределение внутренних точек выбрано произвольным неоднородным
23
образом. Параметр ℎ в весовой функции выберем равным 0.3. В качестве
начального приближения для 𝑢 возьмем 𝑢(0) (𝑥⃗𝑖 ) = 0 во всех точках.
Рассмотрим следующую задачу для уравнения Пуассона с граничными
условиями Дирихле
∆𝒖 = −𝟐(𝒚 ∙ (𝟏 − 𝒚) ∙ 𝒛 ∙ (𝟏 − 𝒛) + 𝒙 ∙ (𝟏 − 𝒙) ∙ 𝒛 ∙ (𝟏 − 𝒛) + 𝒙 ∙ (𝟏 − 𝒙)
∙ 𝒚 ∙ (𝟏 − 𝒚)) в (𝟎, 𝟏) × (𝟎, 𝟏) × (𝟎, 𝟏)
(3.1)
𝒖 = 𝟎 на 𝒙 = 𝟎, 𝒚 = 𝟎, 𝒛 = 𝟎, 𝒙 = 𝟏, 𝒚 = 𝟏, 𝒛 = 𝟏
Аналитическое решение этой задачи задается формулой:
𝒖(𝒙, 𝒚, 𝒛) = (𝟏 − 𝒙) ∙ 𝒙 ∙ (𝟏 − 𝒚) ∙ 𝒚 ∙ (𝟏 − 𝒛) ∙ 𝒛
Таблица 3.3 – Входные параметры
Параметр
Значение
Количество точек
1000
X1
0
X2
1
Y1
0
Y2
1
Z1
0
Z2
1
Значение функции на границе
0
𝜀
0.0001
ℎ
0.3
𝛼
0.00001
Результаты:
 количество итераций – 15,
24
(3.2)
 время выполнения – 00:00:02.7633425,
 максимальная погрешность – 0.001512335.
25
4
Решения уравнения Пуассона при помощи MATLAB
MATLAB – это пакет прикладных программ для решения задач
технических вычислений.
Partial Differential Equation (PDE) Toolbox из пакета MATLAB
содержит
средства
для
исследования
и
решения
нестационарных
дифференциальных уравнений второго порядка в частных производных. В
пакете используется метод конечных элементов. Команды и графический
интерфейс
пакета
могут
быть
использованы
для
математического
моделирования PDE применительно к широкому классу инженерных и научных
приложений,
включая
задачи
сопротивления
материалов,
расчеты
электромагнитных устройств, задачи тепломассопереноса и диффузии.
4.1
Решение
Найдем решение двумерной задачи, рассмотренной в предыдуще пункте,
используя PDE toolbox.
В командной строке MATLAB выполним команду pdetool. В результате
откроется окно тулбокса:
Рисунок 4.1 –PDE toolbox
26
Зададим область Ω, определив нижнюю, верхнюю, левую и правую ее границы:
Рисунок 4.2 – PDE toolbox: задание области
Зададим условия на границе. Исходя из нашей задачи ℎ = 1, 𝑟 = 0 (см.
рисунок 4.3).
Рисунок 4.3 – PDE toolbox: задание граничных условий
27
Проинициализируем сетку:
Рисунок 4.4 – PDE toolbox: инициализация сетки
Определим уравнение Пуассона, выбрав вид уравнения, а также необходимые
значения коэффициентов. В нашем случае уравнение имеет вид:
−𝑑𝑖𝑣(𝑐 ∙ 𝑔𝑟𝑎𝑑(𝑢) ) + 𝑎 𝑢 = 𝑓
где 𝑐 = −1, 𝑎 = 0, 𝑓 = 1.
На рисунке 4.5 представлено окно определения уравнения.
28
(4.1)
Рисунок 4.5 – PDE toolbox: задание вида уравнения
Получим решение и построим его график:
Рисунок 4.6 – PDE toolbox: график решения
29
Полученные результаты можно экспортировать в файл. Эта возможность
использована для последующего сравнения с полученными бессеточным
методом результатами.
4.2
Сравнение результатов, полученных с помощью бессеточного
метода и PDE toolbox
В предыдущем пункте мы нашли решение задачи для уравнения Пуассона
с граничными условиями Дирихле. Посмотрим, как оно коррелирует с
решением, полученным с помощью бессеточного метода. Для этого решим
уравнение Пуассона на сетке, построенной в MATLAB:
Рисунок 4.7 – Нерегулярная сетка
Получим решение, используя наше приложение:
30
Рисунок 4.8 – Сравнение полученных результатов
Рисунок 4.9 – Графики решений
Максимальная погрешность решения, полученного в MATLAB равна
0.000005204, решения полученного бессеточным методом – 0.001201603.
31
ЗАКЛЮЧЕНИЕ
Итак, получена численная модель для решения уравнения Пуассона в
бессеточной
структуре.
Рассматриваемый
метод
основан
на
методе
наименьших квадратов. Он может применяться для любой эллиптической
задачи, в особенности, если сетка имеет сложную нерегулярную структуру.
Также было получено решение уравнения Пуассона с помощью пакета
прикладных программ MATLAB. В сравнении с ним бессеточный метод
показал отличный результат, что говорит о высокой степени эффективности его
применения для подобных задач.
32
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
1. J. Kuhnert, S. Tiwari. Grid free method for solving the Poisson equation. –
Berichte des Fraunhofer ITWM, Nr. 25, 2001. – 20 с.
2. T. Belytschko, Y. Krongauz, D. Organ, M. Fleming, P. Krysl. Meshless methods.
An overview and recent developments. 2001. – 77 с.
3. A. Chorin, Numerical solution of the Navier-Stokes equations; J. Math. Comput.
22 (1968) 745-762
4. К.Е. Афанасьев, И.В. Григорьева. Современное состояние бессеточных
методов. Кемеровский государственный университет, 2007. – 7 с.
5. [Электронный ресурс] http://eqworld.ipmnet.ru
6. [Электронный ресурс] http://ru.wikipedia.org
33
ПРИЛОЖЕНИЕ А
Листинг программы для решения уравнения Пуассона бессеточным
методом
Ниже приведен листинг основной части приложения, отвечающей за
решение уравнения. Используемая платформа разработки – Microsoft .NET
Framework 4.0, язык программирования C#, СУБД – Microsoft SQL Server 2008.
Отметим, что для нахождения обратной матрицы использовался метод
LU-факторизации.
public class GridFreeMethodFor2D
{
#region Public properties
public Problem2D Problem { get; set; }
public bool AutoGeneratePoints { get; set; }
#endregion
#region Private properties
private List<Point3D> PrevU { get; set; }
#endregion
#region Constructors and Initializers
public GridFreeMethodFor2D(Problem2D problem): this(problem, true)
{
}
public GridFreeMethodFor2D(Problem2D problem, bool autoGeneratePoints)
{
AutoGeneratePoints = autoGeneratePoints;
Problem = problem;
Problem.Solution = new Solution2D();
Problem.ExactSolution = new Solution2D();
if (AutoGeneratePoints)
{
Problem.Solution.U
=
GenerateRegularPoints(Problem.InputParameters.N,
Problem.InputParameters.X1,
Problem.InputParameters.X2,
Problem.InputParameters.Y1,
Problem.InputParameters.Y2);
}
}
public GridFreeMethodFor2D(int n,
double x1, double x2,
double y1, double y2,
double g, double epsilon, double h, double alpha)
{
Problem = new Problem2D
34
{
InputParameters = new InputParameters2D
{
N = n,
X1
X2
Y1
Y2
=
=
=
=
x1,
x2,
y1,
y2,
G = g,
Epsilon = epsilon,
H = h,
Alpha = alpha
},
Solution = new Solution2D
{
IterationsCount = 0
}
};
Problem.Solution.U
Problem.InputParameters.X1,
Problem.InputParameters.Y2);
}
=
GenerateRegularPoints(Problem.InputParameters.N,
Problem.InputParameters.X2,
Problem.InputParameters.Y1,
public static double F(double x, double y)
{
return 1;
}
#endregion
#region Private methods
private Matrix GetM(Point3D p, IList<Point3D> neighboringPoints)
{
int n = neighboringPoints.Count;
var m = new Matrix(n + 1, 6);
for (int i = 0; i < n; i++)
{
var point = neighboringPoints[i];
m[i,
m[i,
m[i,
m[i,
m[i,
m[i,
0]
1]
2]
3]
4]
5]
=
=
=
=
=
=
1;
point.X - p.X;
point.Y - p.Y;
0.5 * (point.X - p.X) * (point.X - p.X);
(point.X - p.X) * (point.Y - p.Y);
0.5 * (point.Y - p.Y) * (point.Y - p.Y);
}
m[n, 0] = Problem.Type == ProblemType.TypeThree ? -1 : 0;
m[n, 1] = 0; m[n, 2] = 0;
m[n, 3] = 1; m[n, 4] = 0; m[n, 5] = 1;
return m;
}
private
{
int
var
for
{
Matrix GetW(Point3D p, IList<Point3D> neighboringPoints)
n = neighboringPoints.Count;
w = new Matrix(n + 1, n + 1);
(int i = 0; i < n; i++)
var point = neighboringPoints[i];
35
double norm = (new Vector(point) - new Vector(p)).Norm();
if (norm / Problem.InputParameters.H <= 1)
{
w[i, i] = System.Math.Exp(-Problem.InputParameters.Alpha * norm * norm /
(Problem.InputParameters.H * Problem.InputParameters.H));
}
else
{
w[i, i] = 0;
}
}
w[n, n] = 1;
return w;
}
private Vector GetB(Point3D p, IList<Point3D> neighboringPoints)
{
int n = neighboringPoints.Count;
var b = new Vector(n + 1);
for (int i = 0; i < n; i++)
{
var point = neighboringPoints[i];
b[i] = GetPoint(point, neighboringPoints).Z;
}
b[n] = F(p.X, p.Y);
return b;
}
public void Solve()
{
var startTime = DateTime.Now;
Problem.Solution.IterationsCount = 0;
do
{
PrevU = new List<Point3D>(Problem.InputParameters.N);
foreach (Point3D p in Problem.Solution.U)
{
PrevU.Add(new Point3D(p));
}
for (int i = 0; i < Problem.Solution.U.Count; i++)
{
Point3D point = Problem.Solution.U[i];
if (!point.IsBoundary)
{
var neighboringPoints = GetNeighboringPoints(point);
var m = GetM(point, neighboringPoints);
var w = GetW(point, neighboringPoints);
var b = GetB(point, neighboringPoints);
var mt = m.Transpose();
var tmp = mt * w;
var a = (tmp * m).Inverse() * tmp * b;
point.Z = a[0];
}
else
{
point.Z = Problem.InputParameters.G;
}
}
36
Problem.Solution.IterationsCount++;
} while (!IsIterationsStopped());
var endTime = DateTime.Now;
Problem.Solution.ExecutionTime = endTime - startTime;
}
private bool IsIterationsStopped()
{
double summ1 = 0;
double summ2 = 0;
for (int i =
{
summ1 +=
summ2 +=
}
return summ1
0; i < Problem.Solution.U.Count; i++)
System.Math.Abs(Problem.Solution.U[i].Z - PrevU[i].Z);
System.Math.Abs(Problem.Solution.U[i].Z);
/ summ2 < Problem.InputParameters.Epsilon;
}
private Point3D GetPoint(Point3D point, IEnumerable<Point3D> points)
{
var list = points
.Where(p => p.X == point.X && p.Y == point.Y)
.ToList();
if (list.Count > 0)
{
return list[0];
}
return null;
}
private List<Point3D> GenerateRegularPoints(int count, double x1, double x2, double
y1, double y2)
{
var points = new List<Point3D>(count);
int boundaryPointsCount = (int)System.Math.Pow(count, 1.0 / 2);
double hx = (x2 - x1) / boundaryPointsCount;
double hy = (y2 - y1) / boundaryPointsCount;
for (int i = 0; i <= boundaryPointsCount; i++)
{
for (int j = 0; j <= boundaryPointsCount; j++)
{
points.Add(new Point3D(x1 + i * hx, y1 + j * hy, 0,
i == 0 || j == 0 ||
i
==
boundaryPointsCount
boundaryPointsCount));
}
}
||
return points;
}
private IList<Point3D> GetNeighboringPoints(Point3D point)
{
var list = Problem.Solution.U
.Where(p => GetDistance(point, p) <= Problem.InputParameters.H &&
(p.X != point.X && p.Y != point.Y))
.ToList();
37
j
==
return list;
}
private static double GetDistance(Point3D a, Point3D b)
{
return System.Math.Sqrt((a.X - b.X) * (a.X - b.X) +
(a.Y - b.Y) * (a.Y - b.Y));
}
#endregion
}
38
Скачать