МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Факультет прикладной математики и информатики Кафедра вычислительной математики БАСАЛАЙ ДМИТРИЙ НИКОЛАЕВИЧ БЕССЕТОЧНЫЙ МЕТОД РЕШЕНИЯ УРАВНЕНИЯ ПУАССОНА Отчет по преддипломной практике студента 5 курса 5 группы “Допустить к защите“ Руководитель практики с предварительной оценкой ___ Никифоров Иван Васильевич, Руководитель практики доцент кафедры Выч. мат., _____________________ “___” ___________ 2010 г Минск 2010 канд. физ.-мат. наук БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Факультет прикладной математики и информатики Кафедра вычислительной математики “Утверждаю” Заведующий кафедрой _______________ П.А. Мандрик “___” _______________ 2010 г. ЗАДАНИЕ ПО ПОДГОТОВКЕ ПРЕДДИПЛОМНОЙ ПРАКТИКИ Студенту 5 курса Басалаю Дмитрию Николаевичу 1. Тема работы БЕССЕТОЧНЫЙ МЕТОД РЕШЕНИЯ УРАВНЕНИЯ ПУАССОНА 2. Срок сдачи студентом законченной работы 20 февраля 2010 г. 3. Исходные данные к работе o Методические материалы. o Размещенные в электронной библиотеке методические материалы, примеры из обучающих программных модулей. o Технические требования к электронным версиям отчетных документов, рекомендации составителям. Библиографические описания источников, рекомендуемых студентам к ознакомлению при выполнении работы (для изучения 2 предметной части задания, как правило, достаточно ознакомиться с любой из перечисленных в начале списка книг): 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. К.Е. Афанасьев, И.В. Григорьева. Современное состояние бессеточных методов. Кемеровский государственный университет, 2007. – 7 с. 4. [Электронный ресурс] http://eqworld.ipmnet.ru 5. [Электронный ресурс] http://ru.wikipedia.org 4. Перечень вопросов подлежащих разработке или краткое содержание работы изучение литературы по решению уравнения Пуассона бессеточными методами, построение алгоритмов численного решения, проведение вычислительного эксперимента, анализ полученных результатов, оформление дипломной работы согласно ГОСТа. 5. Перечень графического материала Логотип БГУ для включения на слайды презентации. 6. Дата выдачи задания «23» ноября 2009г. 7. Календарный график работы на весь период (с указанием этапов работы и сроков их выполнения) 23.11.09 – 23.01.10 – ознакомление с предлагаемыми темами, выбор и согласование темы с руководителем, регистрация на кафедре Выч. мат., ознакомление с техническими требованиями к электронным отчетным документам и освоение правил, как их реализовать, изучение постановки задачи, основных теоретических вопросов; 23.01.10 – 20.02.10 – практическая реализация задач проекта, оформление результатов работы (отчета, презентации), подготовка доклада и отладка презентации на защиту; 20.02.10 – защита. 3 Руководитель ____________________ / ____________________ / (подпись) Задание принял к исполнению (Ф.И.О.) “___” ___________ 2009г. ______________________ (подпись студента) 4 Аннотация Главной целью работы является изучение бессеточного метода решения уравнения Пуассона. Анатацыя Галоўнай мэтай дадзенай работы з’яўляецца вывучэнне бяссетачнага метада рашэння ураўнення Пуасона. Annotation The main objective of this work is learning of the grid free method for Poisson equation solving. 5 Реферат Отчет по преддипломной практике, 37 с., 18 рисунков, 5 источников. БЕССЕТОЧНЫЙ МЕТОД РЕШЕНИЯ УРАВНЕНИЯ ПУАССОНА Объект исследования – уравнение Пуассона, а также бессеточный метод его решения. Цель работы – найти решение уравнения Пуассона, используя бессеточный метод. Результаты работы – найдено решение уравнения Пуассона. 6 Содержание Введение ....................................................................................................................... 8 1 Численный метод ................................................................................................ 10 1.1 Аппроксимация функции и ее производных методом наименьших квадратов ................................................................................................................ 10 1.2 Аппроксимация методом наименьших квадратов для уравнения Пуассона13 2 3 Программа ............................................................................................................ 18 2.1 Общее описание .................................................................................... 18 2.2 Обзор основного функционала и работа с программой ................... 18 2.3 Листинг .................................................................................................. 22 Тесты .................................................................................................................... 27 3.1 4 Задача с граничными условиями Дирихле ......................................... 27 Решения уравнения Пуассона при помощи MATLAB.................................... 30 4.1 Решение .................................................................................................. 30 4.2 Сравнение результатов, полученных с помощью бессеточного метода и PDE toolbox ............................................................................................ 33 Заключение ................................................................................................................ 36 Список используемой литературы .......................................................................... 37 7 Введение Бессеточные методы были первоначально разработаны для решения модельных задач динамики жидкости. Это так называемые методы частиц. В рассматриваемых моделях жидкость заменяется дискретным набором точек или частиц, которые движутся вместе с ней. Изначально так называемый метод сглаженных частиц (SPH-метод) был разработан для решения астрофизических задач без границы.SPH-метод был распространен решение различных задач динамики жидкости. Другой бессеточный метод для задач динамики жидкости основан на методе наименьших квадратов или методе скользящих наименьших квадратов. Основная идея этого метода – аппроксимация пространственных производных функции в произвольной точке, используя ее значения в соседних точках. Эти выбираются произвольным образом и не обязательно должны быть распределены регулярно. Решение уравнения Пуассона применяется для нестационарных задач в несжимаемых потоках жидкости. В некоторых проекционных методах для уравнения Навье-Стокса требуется решить уравнение Пуассона для давления. Некоторые авторы рассмотрели такие проекционные методы, основанные на правильной сеточной структуре, что уравнение Пуассона можно было решить с помощью стандартных методов, например, методом конечных элементов или конечных разностей. Но сеточный метод становится достаточно сложным, если вычислительная область изменяется со временем или принимает сложные формы. В этом случае требуется переразбиение сети, и неоходимо принимать больше вычислительных усилий. Поэтому бессеточный метод имеет несравненные преимущества. Метод может быть применен к любой эллиптической задаче. Он подходит для численного решения эллиптического уравнения на достаточно плохой сетке. 8 Бессеточный метод представляет собой локальный итерационный процесс. Он основан на аппроксимации методом наименьших квадратов. Функции и ее производные могут быть очень точно приближены в соответствии с методом в произвольной точке, используя ее дискретные значения в соседних точках. Однако значения функции в точках не даны. Есть только уравнение Пуассона и граничные условия. Поэтому в качесте начальных значений мы полагаем значения функции на границе. Метод устойчив, и численное решение сходится к фиксированной точке при числе итераций, стремящемся к бесконечности. Он может быть применен как г грубому, так и более тонкому распределению точек. Скорость сходимости выше на более грубой сетке. 9 1 Численный метод 1.1 Аппроксимация функции и ее производных методом наименьших квадратов Метод наименьших квадратов может быть применен к очень неправильным структурам. Во многиз практических приложениях сетка играет определяющую роль в нахождении решения, и многие методы теряют точность, если она задана плохо. Преимущество метода наименьших квадратов состоит в том, что он не требует правильной структуры сетки для приближения функции и ее производных. Пусть 𝑓(𝑥⃗) скалярная функция, и 𝑓𝑖 ее значения в точках 𝑥⃗𝑖 ∈ Ω ⊂ 𝑅𝑑 (𝑑 = 1, 2, 3), 𝑖 = 1, 2, … , 𝑁, где 𝑁 – общее число точек в Ω. Мы решаем задачу аппроксимации функции 𝑓(𝑥⃗) и ее производных в точке 𝑥⃗𝑖 , используя значения в соседних точках. Чтобы ограничить количество точек, мы используем весовую функцию 𝑤 = 𝑤(𝑥⃗𝑖 − 𝑥⃗; ℎ) с параметром ℎ. Константа ℎ подобна длине сглаживания в классическом методе сглаженных частиц. Весовая функция может быть произвольной. В наших вычислениях будем использовать весовую функцию Гаусса в следующей форме: ‖𝑥⃗𝑖 − 𝑥⃗‖2 ‖𝑥⃗𝑖 − 𝑥⃗‖ 𝑒𝑥𝑝 (−𝛼 , если ≤1 ) 𝑤(𝑥⃗𝑖 − 𝑥⃗; ℎ) = { ℎ2 ℎ 0, в противном случае, (1.1) где 𝛼 – положительная константа. Размер ℎ определяет набор соседних точек вокруг 𝑥⃗. Пусть 𝑃(𝑥⃗; ℎ) = {𝑥⃗𝑖 : 𝑖 = 1, 2, … , 𝑛} множество из 𝑛 точек, лежащих в шаре с центром в точке 𝑥⃗ радиуса ℎ. Радиус ℎ берут большим, если функцию необходимо приблизить многочленом большей степени. 10 Разложение в ряд Тейлора и метод наименьших квадратов позволяют легко и точно вычислить приближение функции и ее производных. Для этого записываем разложение Тейлора в окресности точности точки 𝑥⃗ с неизвестными коэффициентами и затем вычисляем эти коэффициенты, минимизируя взвешенную ошибку по соседним точкам. Рассмотрим разложение по формуле Тейлора функции 𝑓(𝑥⃗𝑖 ) в окрестности точки 𝑥⃗: 3 𝑓(𝑥⃗𝑖 ) = 𝑓(𝑥⃗) + ∑ 𝑓𝑘 (𝑥⃗) ∙ (𝑥𝑘𝑖 − 𝑥𝑘 ) 𝑘=1 (1.2) 3 + 1 ∑ 𝑓𝑘𝑙 (𝑥⃗) ∙ (𝑥𝑘𝑖 − 𝑥𝑘 ) ∙ (𝑥𝑙𝑖 − 𝑥𝑙 ) + 𝑒𝑖 , 𝑖 = 1, … , 𝑛 2 𝑘,𝑙=1 где 𝑒𝑖 ошибка разложения в точке 𝑥⃗𝑖 . Символами 𝑥1𝑖 , 𝑥2𝑖 и 𝑥3𝑖 обозначены компоненты точки 𝑥⃗𝑖 . Неизвестные 𝑓, 𝑓𝑘 и 𝑓𝑘𝑙 (= 𝑓𝑙𝑘 ), 𝑘, 𝑙 = 1, 2, 3 вычисляются минимизацией ошибки 𝑒𝑖 , 𝑖 = 1, … , 𝑛. Система уравнений может быть записана как 𝑒⃗ = 𝑀𝑎⃗ − 𝑏⃗⃗ где 11 (1.3) 𝑀 = 1 𝑑𝑥1 𝑑𝑦1 𝑑𝑧1 1 𝑑𝑥2 𝑑𝑦2 𝑑𝑧2 ⋮ ⋮ ⋮ ⋮ 𝑑𝑦𝑛 𝑑𝑧𝑛 (1 𝑑𝑥𝑛 1 2 𝑑𝑥 2 1 1 2 𝑑𝑥 2 2 ⋮ 1 2 𝑑𝑥 2 𝑛 𝑑𝑥1 𝑑𝑦1 𝑑𝑥1 𝑑𝑧1 𝑑𝑥2 𝑑𝑦2 𝑑𝑥2 𝑑𝑧2 ⋮ ⋮ 𝑑𝑥𝑛 𝑑𝑦𝑛 𝑑𝑥𝑛 𝑑𝑧𝑛 1 2 𝑑𝑦 2 1 1 2 𝑑𝑦 2 2 ⋮ 1 2 𝑑𝑦 2 𝑛 𝑑𝑦1 𝑑𝑧1 𝑑𝑦2 𝑑𝑧2 ⋮ 𝑑𝑦𝑛 𝑑𝑧𝑛 1 2 𝑑𝑧 2 1 1 (1.4) 𝑑𝑧 2 2 2 ⋮ 1 2 𝑑𝑧 2 𝑛) 𝑎⃗ = [𝑓, 𝑓1 , 𝑓2 , 𝑓3 , 𝑓11 , 𝑓12 , 𝑓13 , 𝑓22 , 𝑓23 , 𝑓33 ]𝑇 , 𝑏⃗⃗ = [ 𝑓1 , 𝑓2 , … , 𝑓𝑛 ]𝑇 , (1.5) 𝑒⃗ = [ 𝑒1 , 𝑒2 , … , 𝑒𝑛 ]𝑇 . Символами 𝑑𝑥𝑖 , 𝑑𝑦𝑖 , 𝑑𝑧𝑖 обозаначены 𝑥𝑖1 − 𝑥1 , 𝑥𝑖2 − 𝑥𝑖 , 𝑥𝑖3 − 𝑥3 , соответственно, 𝑖 = 1, … , 𝑛. При 𝑛 > 10 эта система переопределена для десяти неизвестных 𝑓, 𝑓𝑘 и 𝑓𝑘𝑙 , 𝑘, 𝑙 = 1, 2, 3. Неизвестный вектор 𝑎⃗ получается из взвешеннго метода наименьших квадратов минимизацией квадратичной формы 𝑛 𝐽 = ∑ 𝑤𝑖 𝑒𝑖2 (1.6) 𝑖=1 которая может быть записана в следующей форме 𝑇 𝐽 = (𝑀𝑎⃗ − 𝑏⃗⃗) 𝑊(𝑀𝑎⃗ − 𝑏⃗⃗) 12 (1.7) где 𝑤1 0 𝑊=( ⋮ 0 0 𝑤2 ⋮ 0 ⋯ 0 ⋯ 0 ) ⋱ ⋮ ⋯ 𝑤𝑛 (1.8) Минимизация 𝐽 формально дает результат 𝑎⃗ = (𝑀𝑇 𝑊𝑀)−1 (𝑀𝑇 𝑀)𝑏⃗⃗ (1.9) 1.2 Аппроксимация методом наименьших квадратов для уравнения Пуассона Используя этот метод, мы не дискретизируем уравнение Пуассона непосредственно как в классических методах. Мы решим его, используя итерационный процесс. Рассмотрим следующее уравнение Пуассона ∆𝑢 = 𝑓 в Ω (1.10) с граничными условиями Дирихле: 𝑢 = 𝑔 на Γ (1.11) с граничными условиями Неймана: 𝜕𝑢 = 𝑔 на Γ 𝜕𝑛⃗⃗ (1.12) или со смешанными граничными условиями. В предыдущем пункте мы рассмотрели метод наименьших квадратов для приближения функции и ее производных в произвольной точке, используя ее значение в соседних точках. Теперь ситуация немного другая, так как значения 13 𝑢 в дискретных точках неизвестны априори. Это значит, что если вектор 𝑏⃗⃗ в формуле (1.9) неизвестен, мы не можем определить коэффициенты вектора 𝑎⃗. Поэтому мы задаем начальное значение 𝑢(0) функции 𝑢 во всех точках. Теперь рассмотрим задачу нахождения 𝑢 в произвольной точке 𝑥⃗ по ее соседним точкам 𝑥⃗𝑖 , 𝑖 = 1, … , 𝑛. Как было показано в предыдущем пункте, снова рассмотрим разложение 𝑢 в точке 𝑥⃗ 3 (𝜏+1) 𝑢(𝜏) (𝑥⃗𝑖 ) = 𝑢(𝜏+1) (𝑥⃗) + ∑ 𝑢𝑘 (𝑥⃗) ∙ (𝑥𝑘𝑖 − 𝑥𝑘 ) 𝑘=1 (1.13) 3 + 1 (𝜏+1) (𝜏+1) ∑ 𝑢𝑘𝑙 (𝑥⃗) ∙ (𝑥𝑘𝑖 − 𝑥𝑘 ) ∙ (𝑥𝑙𝑖 − 𝑥𝑙 ) + 𝑒𝑖 2 𝑘,𝑙=1 𝜏 = 0, 1, 2, …, где 𝑢(0) (𝑥⃗𝑖 ) известные начальные значения. Также применяем условие того, что точка 𝑥⃗ является решением уравнения (1.10). Для этого добавляем следующее уравнение к упомянутым выше 𝑛 уравнениям: (𝜏+1) 𝑓 = 𝑢11 (𝜏+1) (𝜏+1) (𝑥⃗) + 𝑢22 (𝑥⃗) + 𝑢33 (𝑥⃗) (1.14) Для граничных условий Неймана (1.12) мы имеем еще одно уравнение для точки 𝑥⃗, лежащей на границе (𝜏+1) 𝑔 = 𝑢1 (𝑥⃗)𝑛𝑥 + 𝑢2(𝜏+1) (𝑥⃗)𝑛𝑦 + 𝑢3(𝜏+1) (𝑥⃗)𝑛𝑧 14 (1.15) где 𝑛𝑥 , 𝑛𝑦 , 𝑛𝑧 – компоненты нормального вектора 𝑛⃗⃗ в граничной точке 𝑥⃗. Следовательно, мы имеем систему из 𝑛 + 2 уравнений с 10 неизвестными и в общем случае 𝑛 ≥ 10. Получим коэффициенты (𝜏+1) 𝑢(𝜏+1) , 𝑢1 (𝜏+1) , 𝑢2 (𝜏+1) , 𝑢3 (𝜏+1) , 𝑢11 (𝜏+1) , 𝑢12 (𝜏+1) , 𝑢13 (𝜏+1) , 𝑢22 (𝜏+1) , 𝑢23 (𝜏+1) , 𝑢33 (1.16) для 𝜏 = 1, 2, … в точке 𝑥⃗ минимизацией 𝑛 𝐽= (𝜏+1) 2 ∑ 𝑤𝑖 (𝑒𝑖 ) 𝑖=1 2 + (∆𝑢 (𝜏+1) 𝜕𝑢(𝜏+1) − 𝑓) + ( − 𝑔) 𝜕𝑛⃗⃗ 2 (1.17) Точно также минимизация 𝐽 дает 𝑎⃗(𝜏+1) = (𝑀𝑇 𝑊𝑀)−1 (𝑀𝑇 𝑀)𝑏⃗⃗ (𝜏) , 𝜏 = 0, 1, …, (1.18) где матрицы и векторы отличаются от (1.4), (1.5) и имеют вид 𝑀 = 1 𝑑𝑥1 𝑑𝑦1 𝑑𝑧1 1 𝑑𝑥2 𝑑𝑦2 𝑑𝑧2 ⋮ ⋮ ⋮ ⋮ 𝑑𝑦𝑛 𝑑𝑧𝑛 0 𝑛𝑦 0 𝑛𝑥 1 𝑑𝑥𝑛 0 (0 0 𝑛𝑥 1 2 𝑑𝑥 2 1 1 2 𝑑𝑥 2 2 ⋮ 1 2 𝑑𝑥 2 𝑛 1 0 𝑑𝑥1 𝑑𝑦1 𝑑𝑥1 𝑑𝑧1 𝑑𝑥2 𝑑𝑦2 𝑑𝑥2 𝑑𝑧2 ⋮ ⋮ 𝑑𝑥𝑛 𝑑𝑦𝑛 𝑑𝑥𝑛 𝑑𝑧𝑛 0 0 0 0 15 1 2 𝑑𝑦 2 1 1 2 𝑑𝑦 2 2 ⋮ 1 2 𝑑𝑦 2 𝑛 1 0 𝑑𝑦1 𝑑𝑧1 𝑑𝑦2 𝑑𝑧2 ⋮ 𝑑𝑦𝑛 𝑑𝑧𝑛 0 0 1 2 𝑑𝑧 2 1 1 2 𝑑𝑧2 2 (1.19) ⋮ 1 2 𝑑𝑧 2 𝑛 1 0 ) 𝑤1 0 ⋮ 𝑊= 0 0 (0 0 𝑤2 ⋮ 0 0 0 ⋯ 0 ⋯ 0 ⋱ ⋮ ⋯ 𝑤𝑛 ⋯ 0 ⋯ 0 0 0 ⋮ 0 1 0 0 0 ⋮ 0 0 1) (1.20) 𝑎⃗(𝜏+1) = (𝜏+1) [𝑢(𝜏+1) , 𝑢1 (𝜏+1) , 𝑢2 (𝜏+1) , 𝑢3 (𝜏+1) , 𝑢11 (𝜏+1) , 𝑢12 (𝜏+1) , 𝑢13 (𝜏+1) , 𝑢22 (𝜏) (𝜏) (𝜏) 𝑏⃗⃗ (𝜏) = [ 𝑢1 , 𝑢2 , … , 𝑢𝑛 , 𝑓, 𝑔] (𝜏+1) , 𝑢23 (𝜏+1) 𝑇 , 𝑢33 ] , (1.21) 𝑇 Отметим, что можно использовать уравнение (1.14) в (1.13) для того, чтобы уменьшить количество неизвестных. Например, из (1.14) имеем (𝜏+1) 𝑢33 (𝜏+1) (𝜏+1) (𝑥⃗) = 𝑓 − 𝑢11 (𝑥⃗) − 𝑢22 (𝑥⃗) (1.22) Подставляем в (1.13) и уменьшаем число неизвестных до 9 для внутренних точек. Следовательно, вместо матицы 10 × 10 нужно инвертировать матрицу 9 × 9. Это, конечно, не сильно уменьшает вычислительные затраты. В этом случае коэффициенты матрицы 𝑀 и вектора 𝑏⃗⃗ отличаются от предложенных выше. Но при этом в обоих случаях скорость сходимости остается одинаковой. Итерации повторяются для каждой точки. После каждой из них функции присваиваются новые значения 𝑢(𝜏+1) . Для каждой точки, например, в 16 трехмерном случае нужно инвертировать матрицу 10 × 10. Этот метод может оказаться медленнее, чем другие классические методы для решения уравнения Пуассона, но в нашем случае мы не прилагаем усилий для генерации сетки, и решение может быть получено для произвольной нерегулярной геометрии. Завершаем итерации, если ошибка удовлетворяет следующему неравенству (𝜏+1) (𝜏) ∑𝑁 − 𝑢𝑖 | 𝑖=1 |𝑢𝑖 (𝜏+1) ∑𝑁 | 𝑖=1 |𝑢𝑖 <𝜀 (1.23) и решение определяется как 𝑢(𝑥𝑖 ) ≔ 𝑢(𝜏+1) (𝑥𝑖 ) при 𝜏 стремящемся к бесконечности. Параметр 𝜀 – очень малая положительная константа, варьирующаяся в зависимости от задачи и значения ℎ. Параметр ℎ обычно выбирают согласно топологии. Мы рассмотрели постоянную ℎ. Скорость сходимости будет больше, если выбрать параметр ℎ большим, при этом увеличив расстояние между точками. 17 2 Программа 2.1 Общее описание Разработанное приложение позволяет решать уравнение Пуассона двух видов (∆𝑢 = 𝑓 и ∆𝑢 − 𝑢 = 𝑓) с регулярным и нерегулярным распределением точек, используя бессеточный метод, а также предоставляет возможность сохранения полученных результатов для последующей визуализации или использования в прикладных задачах. 2.2 Обзор основного функционала и работа с программой Программа представляет собой веб-приложение (см. рисунок 2.1). Рисунок 2.1 – Демонстрационное приложение Для решения необходимо выбрать тип уравнения Пуассона: 18 Рисунок 2.2 – Выбор типа уравнения размерность задачи (двумерная или трехмерная): Рисунок 2.3 – Выбор размерности задачи метод задания сетки: Рисунок 2.4 – Выбор метода задания сетки 19 и наконец, ввести входные параметры метода: Рисунок 2.5 – Входные параметры Если все введенные данные корректны, то по окончанию рассчетов полученные результаты выведутся на экран (см. рисунок 2.6), будет построен график решения (см. рисунок 2.7): 20 Рисунок 2.6 – Решение Рисунок 2.7 – График решения 21 Для анализа результатов выполнения программы с разными входными данными предусмотрена возможность просмотра статистики: Рисунок 2.8 – Статистика 2.3 Листинг Ниже приведен листинг основной части приложения, отвечающей за решение уравнения. Используемая платформа разработки – Microsoft .NET Framework 4.0, язык программирования C#. Отметим, что для нахождения обратной матрицы использовался метод 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; } 22 #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 { 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 23 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]; 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; 24 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; } } 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; } 25 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(); 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 } 26 j == 3 Тесты Числовые эксперименты выполним в двумерном пространстве. Решим уравнение Пуассона на единичном квадрате, где известно аналитическое решение. Рассмотрим как регулярное, так и нерегулярное распределение точек. Регулярные точки сгенерированы с интервалом ∆𝑥 = 0.1. Для нерегулярного случая границы области заменены набором точек с интервалом 0.1, а распределение внутренних точек выбрано произвольным неоднородным образом. Параметр ℎ в весовой функции выберем равным 0.23. В качестве начального приближения для 𝑢 возьмем 𝑢(0) (𝑥⃗𝑖 ) = 0 во всех точках. 3.1 Задача с граничными условиями Дирихле Рассмотрим следующую задачу для уравнения Пуассона с граничными условиями Дирихле ∆𝑢 = 1 в (0, 1) × (0, 1) 𝑢 = 0 на 𝑥 = 0, 𝑦 = 0, 𝑥 = 1, 𝑦 = 1 (3.1) Аналитическое решение этой задачи задается формулой: 𝑢(𝑥, 𝑦) = (𝑥 − 1)𝑥 2 ∞ 4 𝑠𝑖𝑛ℎ[(2𝑛 − 1)𝜋(1 − 𝑦)] + 𝑠𝑖𝑛ℎ[(2𝑛 − 1)𝜋𝑦] + 3∑[ ] 𝜋 𝑠𝑖𝑛ℎ(2𝑛 − 1)𝜋 𝑛=1 ∙ 𝑠𝑖𝑛(2𝑛 − 1)𝜋𝑥 (2𝑛 − 1)3 27 (3.2) Таблица 3.1 – Входные параметры. Параметр Значение Количество точек 100 X1 0 X2 1 Y1 0 Y2 1 Значение функции на границе 0 𝜀 0.00001 ℎ 0.23 𝛼 0.00001 Результаты: количество итераций – 28, время выполнения – 00:00:00.7950455, максимальная погрешность – 0.001502105. 28 Рисунок 3.1 – График решения 29 4 Решения уравнения Пуассона при помощи MATLAB MATLAB – это пакет прикладных программ для решения задач технических вычислений. Partial Differential Equation (PDE) Toolbox из пакета MATLAB содержит средства для исследования и решения нестационарных дифференциальных уравнений второго порядка в частных производных. В пакете используется метод конечных элементов. Команды и графический интерфейс пакета могут быть использованы для математического моделирования PDE применительно к широкому классу инженерных и научных приложений, включая задачи сопротивления материалов, расчеты электромагнитных устройств, задачи тепломассопереноса и диффузии. 4.1 Решение Найдем решение задачи, рассмотренной в предыдуще пункте, используя PDE toolbox. В командной строке MATLAB выполним команду pdetool. В результате откроется окно тулбокса: Рисунок 4.1 –PDE toolbox 30 Зададим область Ω: Рисунок 4.2 – PDE toolbox: задание области Зададим условия на границе: Рисунок 4.3 – PDE toolbox: задание граничных условий 31 Проинициализируем сетку: Рисунок 4.4 – PDE toolbox: инициализация сетки Определим уравнение Пуассона: Рисунок 4.5 – PDE toolbox: задание вида уравнения Получим решение и построим его график: 32 Рисунок 4.6 – PDE toolbox: график решения Полученные результаты можно экспортировать в файл. 4.2 Сравнение результатов, полученных с помощью бессеточного метода и PDE toolbox В предыдущем пункте мы нашли решение задачи для уравнения Пуассона с граничными условиями Дирихле. Посмотрим, как оно коррелирует с решением, полученным с помощью бессеточного метода. Для этого решим уравнение Пуассона на сетке, построенной в MATLAB: 33 Рисунок 4.7 – Нерегулярная сетка Получим решение, используя наше приложение: Рисунок 4.8 – Сравнение полученных результатов 34 Рисунок 4.9 – Графики решений Как видим, полученные решения отличаются лишь в 4 знаке после запятой, при этом в качестве входных параметров выбирались не самые оптимальные значения (для увеличения производительности), что говорит о высокой точности рассматриваемого метода. 35 Заключение Итак, получена численная модель для решения уравнения Пуассона в бессеточной структуре. Рассматриваемый метод основан на методе наименьших квадратов. Он может применяться для любой эллиптической задачи, в особенности, если сетка имеет сложную нерегулярную структуру. Также было получено решение уравнения Пуассона с помощью пакета прикладных программ MATLAB. В сравнении с ним бессеточный метод показал отличный результат, что говорит о высокой степени эффективности его применения для подобных задач. 36 Список используемой литературы 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. К.Е. Афанасьев, И.В. Григорьева. Современное состояние бессеточных методов. Кемеровский государственный университет, 2007. – 7 с. 4. [Электронный ресурс] http://eqworld.ipmnet.ru 5. [Электронный ресурс] http://ru.wikipedia.org 37