Метод конечных элементов

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Википедия Метод конечных элементов - это численный метод решения дифференциальных уравнений. В данной статье будет показан метод подсчёта и приведён код соответствующей программы на C++ (g++ 5.1.0; linux 4.0.x-ARCH). Для работы также потребуется MATLAB 4.0+ с возможностью вызова из терминала.

Суть

Суть метода следует из его названия. Область, в которой ищется решение дифференциальных уравнений, разбивается на конечное количество подобластей (элементов). В каждом из элементов произвольно выбирается вид аппроксимирующей функции. В простейшем случае это полином первой степени. Вне своего элемента аппроксимирующая функция равна нулю. Значения функций на границах элементов (в узлах) являются решением задачи и заранее неизвестны. Коэффициенты аппроксимирующих функций обычно ищутся из условия равенства значения соседних функций на границах между элементами (в узлах). Затем эти коэффициенты выражаются через значения функций в узлах элементов. Составляется система линейных алгебраических уравнений. Количество уравнений равно количеству неизвестных значений в узлах, на которых ищется решение исходной системы, прямо пропорционально количеству элементов и ограничивается только возможностями ЭВМ. Так как каждый из элементов связан с ограниченным количеством соседних, система линейных алгебраических уравнений имеет разрежённый вид, что существенно упрощает её решение.

Если говорить в матричных терминах, то собираются так называемые матрицы жёсткости (или матрица Дирихле) и масс. Далее на эти матрицы накладываются граничные условия (например, при условиях Неймана в матрицах не меняется ничего, а при условиях Дирихле из матриц вычёркиваются строки и столбцы, соответствующие граничным узлам, так как в силу краевых условий значение соответствующих компонент решения известно). Затем собирается система линейных уравнений и решается одним из известных методов.

Матрица жёсткости

Матрица жёсткости (матрица Дирихле) — матрица особого вида, использующаяся в методе конечных элементов для решения дифференциальных уравнений в частных производных. Она применяется при решениях задач электродинамики и механики.

Обычно матрица жёсткости получается разреженной, то есть содержащая большое количество нулей. Для работы с подобным типом матриц созданы специальные библиотеки (mtl4, SparseLib++, SPARSPAK и другие)

Определение

Элементы матрицы жёсткости Ak в общем случае равны

Aij=Ωφiφjdx.

Например, если дано уравнение Пуассона

2u=f

в пространстве Ω и граничные условния — это u=0.

Представим функцию как ряд:

uuh=u1φ1++unφn.
ui — это известные значения функции в узлах, а φ — некие базисные функции

то

Aij[k]=triangleφiφjdx.

Создание матрицы

Для одного треугольника

Пусть дан один конечный элемент, для простоты — треугольный. Матрица жёсткости, по сути, задаёт связи между узлами. Так как у элемента три узла (в локальной нумерации — 0, 1 и 2), то матрица будет иметь вид

[S00S01S02S10S11S12S20S21S22]

В дальнейшем матрицу для одного треугольника будем называть локальной, для всей сетки сразу - глобальной.

В общем случае, элементы Sij определяются через линейные функции

α1=14A((x1y2+x2y1)+(y1y2)x+(x2x1)y).
где
A — площадь треугольного элемента.

α2 и α3 получаются из α1 цикличной перестановкой индексов. Удобно искать A как определитель матрицы

A=det[1x1y11x2y21x3y3]

Сами Sij=(αi)(αj)dSi,j=0,1,2

В описываемом случае для каждого треугольника составляется такая матрица:

[S00=0S01=(y1y2)(y2y0)+(x2x1)(x0x2)4AS02=(y2y1)(y1y0)+(x1x2)(x0x1)4AS10=(y0y2)(y2y1)+(x2x0)(x1x2)4AS11=0S12=(y2y0)(y0y1)+(x0x2)(x1x0)4AS20=(y0y1)(y1y2)+(x1x0)(x2x1)4AS21=(y1y0)(y0y2)+(x0x1)(x0x2)4AS22=0]

Первый вид обобщения на несколько треугольников - сшивание

Для того, чтобы сделать из многих раздельных матриц, полученных выше, одну большую матрицу, описывающую отношения между узлами всей области расчёта, необходимо произвести процедуру объединения матриц. Пусть символ d обозначает разделённые элементы (рис. а), а символ c — объединённые элементы (рис. б).

Обозначим udT=[u1u2u3u4u5u6] — вектор-строку значений функции в вершинах двух треугольников (см.рис). Символ uT обозначает транспонирование матрицы u. То есть, это вектор значений функции в шести узлах треугольников. Очевидно, что при объединении оных получится вектор uc, содержащий только четыре компоненты.

Преобразование происходит по схеме

ud=Cuc[u1u2u3u4u5u6]=[111111][u1u2u3u4]

Нумерация, конечно же, произвольная: необходимо равенство функции в соответствующих вершинах. Матрицу C называют матрицей преобразования, а само уравнение называют связанной системой.

Запишем теперь матрицу жёсткости для двух треугольников:

Sd=[S(1)00S(2)][S00S01S02S10S11S12S20S21S22S33S34S35S43S44S45S53S54S55]

Результирующая матрица Sglobal=CTSdC=

=[S00(1)+S55(2)S01(1)+S53(2)S02(1)S54(2)S10(1)+S35(2)S11(1)+S33(2)S12(1)S34(2)S20(1)S20(1)S22(1)0S45(2)S43(2)0S44(2)]

То есть, на каждом следующем шаге необходимо добавлять новые элементы к уже существующим.

Второй вид обобщения на несколько треугольников - дозаписывание

Пусть есть область, представленная и разбитая на треугольники так, как преставлено на рисунке. Пусть данная сетка содержит N узлов. Создадим глобальную матрицу 𝔖 (размера, очевидно, N×N) и заполним её нулями. Начнём строить локальные матрицы S для треугольников, например, для Δ036.

Введём локальную нумерацию для данного треугольника: пусть его верхняя вершина имеет локальный номер 0, далее по часовой стрелке 1 и 2. Иначе говоря, пусть глобальным номерам 0,3,6 соответствуют локальные номера 0,1,2 соответственно.

Составим матрицу для этого треугольника так, как описано выше, получив что-то типа

S=[S00S01S02S10S11S12S20S21S22]

Теперь заменим локальную нумерацию на глобальную. То есть запишем локальное число S00 как глобальное число 𝔖00, S01 - как 𝔖03, S02 - как 𝔖06 и так далее.

Получим

𝔖=[S0000S0300S0600000000000000000000000S1000S1300S1600000000000000000000000S2000S2300S26000000000000000000000000000000000]

С остальными треугольниками поступаем аналогично. Необходимо помнить, что надо "дописать" число в глобальную ячейку, то есть прибавить к уже существующему.

Матрица масс

Матрица масс собирается по тем же правилам, но чуть по другим формулам. Создаётся матрица S размеров три на три, затем говорится, что

C1=(x2x1)(x3x1)+(y2y1)(y3y1)4A
C2=(x3x2)(x1x2)+(y3y2)(y1y2)4A
C3=(x1x3)(x2x3)+(y1y3)(y2y3)4A
  • S22=S22+C1
S23=S23C1
S32=S32C1
S33=S33+C1
  • S33=S33+C2
S31=S31C2
S13=S13C2
S11=S11+C2
  • S11=S11+C3
S12=S12C3
S21=S21C3
S22=S22+C3
где
  • A - площадь данного треугольника, которая считается, как в предыдущей главе.
  • C2 и C3 получаются из C1 циклической перестановкой, равно как второй и третий блок элементов матрицы из первого.

После чего полученная матрица S записывается в матрицу 𝔖 любым известным читателю способом. В коде используется метод дозаписи, приведённый выше.

Учёт граничных условий

Условия Дирихле

В случае граничных условий первого рода необходимо изменить матрицу 𝔖.

Граничное условие гласит, что функция в узлах на границе равна нулю. Для узла ui,j необходимо вычеркнуть i-тый столбец и j-ую строку в матрице 𝔖, а также вычеркнуть сам узел из массива узлов решётки.

Условия Неймана

В случае граничных условий второго рода глобальная матрица не меняется.

Код

Из-за большого объёма кода он был помещён на подстраницу.

Литература

  • Zienkiewicz, K. Morgan — Finite elements and approximation, 1983.
  • P.P. Silvester, R.L. Ferrari — Finite elements for electrical engineers, 1986.
  • E. Suli — Finite Element Methods for Partial Differential Equations, 2011
  • K.J. Bathe, E.L. Wilson — Numerical methods in finite element analysis, 1982