Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

KM2016 / FEM2_1 / TEX / МКЭ

.tex
Скачиваний:
8
Добавлен:
14.03.2016
Размер:
132.35 Кб
Скачать
\documentclass[a4paper,14pt]{extarticle} %размер бумаги устанавливаем А4, шрифт 12пунктов
%\usepackage[koi8-r]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[utf8x]{inputenc}%включаем свою кодировку: koi8-r или utf8 в UNIX, cp1251 в Windows

\usepackage[english,russian]{babel}%используем русский и английский языки с переносами
\usepackage{amssymb,amsfonts,amsmath,mathtext,cite,enumerate,float} %подключаем нужные пакеты расширений
\author{Маглеванный Р.Р., Смоляр Р’.Рђ.}
\title{Метод конечных элементов для дифференциальных уравнений с обобщенными решениями}
\usepackage{graphicx} %хотим вставлять в диплом рисунки?
\usepackage{wrapfig}
    \makeatletter
    \bibliographystyle{gost780u}
    \renewcommand{\@biblabel}[1]{#1. } % Заменяем библиографию с квадратных скобок на точку:
    \makeatother

    \usepackage[a4paper, mag=1000,left=2.5cm, right=2cm, top=2cm, bottom=2cm]{geometry} % Меняем поля страницы

    \renewcommand{\theenumi}{\arabic{enumi}}% Меняем везде перечисления на цифра.цифра
    \renewcommand{\labelenumi}{\arabic{enumi}}% Меняем везде перечисления на цифра.цифра
    \renewcommand{\theenumii}{\arabic{enumii}}% Меняем везде перечисления на цифра.цифра
    \renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}.}% Меняем везде перечисления на цифра.цифра
    \renewcommand{\theenumiii}{\arabic{enumiii}}% Меняем везде перечисления на цифра.цифра
    \renewcommand{\labelenumiii}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.}% Меняем везде перечисления на цифра.цифра

\begin{document}
\maketitle
\newpage
\tableofcontents
\newpage

\subsubsection*{Предисловие}
Метод конечных элементов применяется в решателях уравнений в частных производных второго порядка в больших универсальных компьютерных пакетах программ, например, MATLAB, FEMLAB. Это проприетарные программы. В больших универсальных компьютерных пакетах программ со свободным доступом - SCILAB, OCTAVE - используются накопленные в течение десятилетий библиотеки научных математических программ со свободным доступом - GSL (Gnu Sientific Lybrary), например. В этих библиотеках и построенных на их основе универсальных математических пакетах имеются решатели систем обыкновенных дифференциальных уравнений, но  пока нет программ - решателей уравнений в частных производных с граничными условиями. По этой причине в случае необходимости, приходится для задачи, приводящей к уравнению в частных производных, создавать свой решатель для неё.

В данном учебном пособии на простых примерах мы рассмотрим сущность метода конечных элементов и затем шаг за шагом, переходя от простого к сложному, покажем как реализовать эту сущность в вычислительных программах, сопровождающих каждую рассмотренную в главе задачу. Естественными инструментом для решения этих задач является свободное программное обеспечение - компилятор G++ с дебаггером GDB в среде LINUX. Приведённые в Приложении программы отвечают требованиям лицензии GPL - 3, они могут свободно копироваться, распространяться  и изменяться с любыми, в том числе и с коммерческими целями, хотя главная задача авторов - это применение в учебном процессе для обучения студентов технических и физических специальностей практическому применению метода конечных элементов для обобщенного решения дифференциальных уравнений. 

\section{Введение}

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

Рсходная задача, заданная дифференциальным уравнением записанным для РёСЃРєРѕРјРѕР№ функции, представляется РІ эквивалентной интегральной формулировке, Р° затем ищется приближенное решение последней РІ РІРёРґРµ комбинации конечного числа  заданных пробных функций. Р’ методе конечных элементов пробные функции \textit{кусочно полиномиальны}. Рменно этим выбором определяется успех метода. Каждая пробная функция равна нулю РЅР° большей части области Рё отлична РѕС‚ нуля только РІ окрестности РѕРґРЅРѕРіРѕ узла. Р’ этой окрестности пробная функция составлена РёР· полиномов небольшой степени, Рё РІСЃРµ вычисления становятся максимально простыми.

Ещё один способ построения разностных схем для задач с обобщенным решением, состоит в  аппроксимации производных конечными разностями в узлах сетки и вычислении интегралов по квадратурным формулам в локальных областях в окресности узлов сетки, задаваемых кусочно-полиномиальными пробными функциями. Таким способом удалось получить хорошие апроксимации для многомерных стационарных и нестационарных задач с граниными условиями.

Первая работа, где рассматривалась схема типа метода конечных элементов, принадлежит математику Куранту \cite{co}. Построение метода с использованием физических соображений и его название «метод конечных элементов» содержатся в статье, написанной инженерами \cite{tr}. Такое сочетание специальностей авторов характерно для работ по методу конечных элементов. В последующем было опубликовано много статей и книг, посвященных этому методу и его различным модификациям. Некоторое представление об этом можно получить из списка литературы, например в \cite{zi}. 

Популярное изложение метода конечных элементов имеется в статье \cite{ro1}.  Раздел 2, в котором излагаются основные идеи метода конечных элементов на примере дискретной задачи о нагруженном стержне, взят из этой работы. Мы доведём изложение метода до числа на примере континуальной задачи для стержня - подробно опишем каждый шаг аналитических вычислений и приведём текст программы, реализующий её вычислительный алгоритм. В Приложении дан текст программы на С++, в котором решена задача об одномерном нагруженном стержне с тестовым примером.

\section{Составной нагруженный в узлах стержень }

\subsection{Постановка задачи для составного стержня}

Обратимся к дискретной задаче, состояние которой точно определяется конечным числом параметров. Рассмотрим упругий стержень в виде прямого кругового цилиндра, длина которого значительно больше его диаметра. Это позволяет отождествить стержень с его осью. Пусть несколько таких стержней расположены на оси $ x $ и соединены между собой (рисунок \ref{fig:Fig1}, (а)). Точки $ a $ и $ b $  закреплены, что условно изображено на рисунке. К осям стержней вдоль оси $ x $ приложим внешнюю нагрузку в узловых точках соединения стержней.
\begin{figure}[h]
 \centering
\includegraphics[scale=1.0]{./Fig1.png}
 \caption{Пример дискретной задачи}
 \label{fig:Fig1}
\end{figure}

Очевидно, точки на осях стержней перемещаются вдоль $ x $. Силы и перемещения считаются положительными, если они направлены в положительном направлении $ x $. Задача состоит в определении перемещений точек, принадлежащих осям стержней и продольных внутренних сил в поперечных сечениях стержней.

Согласно методу конечных элементов, представим стержневую систему в виде элементов, соединенных в узлах. В качестве элементов примем отдельные стержни, а узлов - точки их соединения. На  рисунке \ref{fig:Fig1} в скобках указаны номера элементов, а без скобок - номера узлов.

\subsubsection{Типовой элемент}
\paragraph{Условие равновесия}

 Обратимся к типовому для данной системы элементу $(i)$. На элемент с узлами $i-1,i$  (рисунок \ref{fig:Fig1}, (b)) может действовать распределенная нагрузка интенсивности $q^{(i)}(x)$. Размерность интенсивности нагрузки - сила/(единица длины). Обозначим перемещения узлов элемента $u_{i-1}^{(i)},\,\,\,u_i^{(i)}$. Обозначим длину элемента $l^{(i)}$. Получим задачу для функции  перемещений точек оси $x$. Бесконечно малая часть элемента   находится в равновесии под действием нагрузки и продольных внутренних упругих сил $f^{(i)}(x)$
\begin{equation}
\label{eq:eq2}
f^{(i)}=c^{(i)} \dfrac{du^{(i)}}{dx},
\end{equation}
где $ c^{(i)}>0 $ носит название продольной жесткости стержня и определяется из опыта. Стержень будет находится в равновесии при равенстве упругих внутренних и приложенных внешних сил в каждом его элементе $dx$
\begin{equation}
\label{eq:eq1}
 df^{(i)}+q^{(i)}dx=0,~~~~\dfrac{df^{(i)}}{dx} = -q^{(i)}, 
\end{equation}

Пусть  $ c^{(i)}=const $ для элемента $i$. Подставляя (\ref{eq:eq2}) в (\ref{eq:eq1})  получим задачу относительно $ u^{(i)}(x) $  в виде дифференциального уравнения и граничных условий
\begin{equation}
\label{eq:eq3}
-c^{(i)} \dfrac{d^2 u^{(i)}}{d^2 x}=q^{(i)},
\end{equation}
$$ u^{(i)}(x_{i-1})=u_{i-1},~~~ u^{(i)}(x_i)=u_i.$$

В нашем примере для случая дискретной задачи положим $ q^{(i)}=0 $ и будем считать, что на стержневую систему действуют только внешние силы сосредоточенные в узлах $ F_i $. Внешняя нагрузка уравновешивается силами упругости стержней $f_i=-F_i$, и система находится в равновесии, получив в каждом узле некоторое смещение $u_i$. Тогда решение уравнения (\ref{eq:eq3}) примет вид
\begin{equation}
\label{eq:eq4}
u^{(i)}(x)= \dfrac{u_i^{(i)}-u_{i-1}^{(i)}}{l^{(i)}} x - u_i^{(i)},
\end{equation}

На основании (\ref{eq:eq4}) можно заключить, что состояние типового элемента $i$, то есть $ u^{(i)}(x),~ f^{(i)}(x)$, точно определяется двумя параметрами - перемещениями его узлов  $u_i^{(i)}, u_j^{(i)} $. Действительно, подставив решение (\ref{eq:eq4}), в (\ref{eq:eq2}), получим
\begin{equation}
\label{eq:eq5}
f_i^{(i)} = \kappa^{(i)} \left( u_i^{(i)}-u_{i-1}^{(i)}\right) ,\quad
\kappa^{(i)}=\dfrac{c^{(i)}}{l^{(i)}}. 
\end{equation}
Это делает задачу нахождения связи между перемещениями узлов составного стрежня и силами в узлах линейной.

\paragraph{Внутренние силы}

 Рассмотрим внутренние упругие силы $f_i^{(i)}$ действующие в узле $i$ на элемент $(i)$. Поскольку имеет место линейная задача, то они линейно зависят от $ u_{i-1}^{(i)},~ u_i^{(i)}$:
\begin{equation}
\label{eq:eqfi}
\begin{array}{cc}
f_i^{(i)}= & f_{ii}^{(i)}u_i^{(i)}+f_{i,i-1}^{(i)}u_{i-1}^{(i)},\\
f_{i-1}^{(i)}= & f_{i-1,i}^{(i)}u_i^{(i)}+f_{i-1,i-1}^{(i)}u_{i-1}^{(i)}.
\end{array} 
\end{equation}
Здесь $ f_{lt}^{(i)},\quad l = i, i-1; \quad t = i, i-1$ есть внутренняя сила, действующая на элемент $i$ в узле $l$ и возникающая от единичного перемещения узла $t$. При этом перемещение другого узла равно нулю.

Воспользовавшись уравнением (\ref{eq:eq5}), получим
\begin{equation}
\label{eq:eq5p}
\begin{array}{cc}
f_i^{(i)}= & \kappa^{(i)}u_i^{(i)}- \kappa^{(i)}u_{i-1}^{(i)},\\
f_{i-1}^{(i)}= & -\kappa^{(i)}u_i^{(i)}+\kappa^{(i)}u_{i-1}^{(i)}.\\
\end{array} 
\end{equation}
 
 \paragraph{Матрица жесткости элемента}

 Соотношения (\ref{eq:eq5}) можно представить в матричной форме. Введем столбцы $f_{(i)}$, $u_{(i)}$ и матрицу $K_{(i)}$
\begin{equation}
f^{(i)} =\begin{vmatrix}
f_{i}^{(i)} \\
f_{i-1}^{(i)} \\
\end{vmatrix},\,\,\,
u^{(i)} =\begin{vmatrix}
u_{i}^{(i)} \\
u_{i-1}^{(i)} \\
\end{vmatrix},\,\,\,
K^{(i)} =\begin{vmatrix}
-\kappa^{(i)} & \kappa^{(i)} \\
\kappa^{(i)}  & -\kappa^{(i)} \\
\end{vmatrix}.
\end{equation}
Тогда (\ref{eq:eq5}) можно записать в виде
\begin{equation}
\label{eq:eq7}
f^{(i)} = K^{(i)}u^{(i)}.
\end{equation}
Для упругой пружины коэффициент пропорциональности между силой и перемещением называется коэффициентом жесткости пружины. Аналогично $K^{(i)}$ носит название матрицы жесткости элемента $r$.

\subsubsection{Переход к составному стержню}

От типового элемента перейдем к отдельным элементам данной системы. Для элементов с номерами $1<i<n-1$ справедливы все зависимости (\ref{eq:eq4}) - (\ref{eq:eq7}). Поскольку точки $a, b$ неподвижны, то состояние элемента 1 определяется перемещением узла 1, а элемента $n$ - перемещением узла $n-1$. На основании (\ref{eq:eq4}) будем иметь для элементов 1 и $n$ соотношения
\begin{equation}
\label{eq:eq8}
\begin{matrix}
u^{(1)} = \dfrac{u_1^{(1)}}{l^{(1)}}x,\,\,\,f^{(1)} = -\kappa^{(1)} u^{(1)},\\
u^{(n)} = \dfrac{u_{n-1}^{(n)}}{l^{(n)}}(x-x_{n-1}) + u_{n-1}^{(n)},\,\,\,f^{(n)} = -\kappa^{(n)} u_{n-1}^{(n)}.
\end{matrix}
\end{equation}
Зависимости (\ref{eq:eq5}) для элементов 1 и n примут соответственно вид:
\begin{equation}
\label{eq:eq9}
f_1^{(1)}=f_{11}^{(1)} u_1^{(1)},\,\,\,f_{n-1}^{(n)}=f_{n-1,n-1}^{(n)} u_{n-1}^{(n)}.
\end{equation}
Сравнивая (\ref{eq:eq5}) или (\ref{eq:eq7}) для элемента $1<i<n-1$ с (\ref{eq:eq9}) для элементов 1 и $n$, можно заключить, что матрицы жесткости для жесткости для одноузловых элементов 1 и $n$ имеют вид
\begin{equation}
\begin{matrix}
K^{(1)} =\begin{vmatrix}
-\kappa^{(1)} & 0 \\
0  & 0 \\
\end{vmatrix}, & 
K^{(n)} =\begin{vmatrix}
0 & 0 \\
0  &- \kappa^{(n)} \\
\end{vmatrix} \\
\end{matrix}.
\end{equation}


Теперь все известно о каждом отдельном элементе системы. Следующим шагом
является соединение элементов в узлах на основе условий:
\begin{equation}
\label{eq:eq10}
u_i^i=u_i^{(i+1)}=u_i.
\end{equation}
Отсюда следует, что состояние соединенных элементов или системы в целом определяется двумя узловыми перемещениями и рассматриваемая задача является дискретной.

Для всей системы можно записать соотношения типа (\ref{eq:eq7}) относительно суммарных для смежных элементов внутренних сил в узлах. Обозначим их $f_i$. Введем столбцы $f$, $u$ и матрицу жесткости всей системы $K$ по формулам:
\begin{equation*}
f =\begin{vmatrix}
f_1 \\
\vdots\\
f_{n-1}\\
\end{vmatrix},\,\,\,
u =\begin{vmatrix}
u_1 \\
\vdots\\
u_n \\
\end{vmatrix},\,\,\,
K =\begin{vmatrix}
f_{11} & \cdots & f_{1,n-1} \\
\cdots & \cdots & \cdots \\
f_{n-1,1} & \cdots & f_{n-1,n-1} \\
\end{vmatrix}.
\end{equation*}
Здесь $f_{lt} (l = 1, 2; t = 1, 2)$ есть суммарная внутренняя сила в узле $l$, возникающая от единичного перемещения узла $l$ при нулевом перемещении узла $t$. Эти суммарные силы определяются через узловые силы в смежных элементах.

Mатричное соотношение типа (\ref{eq:eq7}) для всей системы будет:
\[
\label{eq:eq12}
f=Ku.
\]
Учтём, что внутренние упругие силы $f_i$ уравновешивают приложенные в узлах внешние силы нагрузки $F_i$ - они равны им по величине и противоположны по направлению. Тогда матричное соотношение для системы будет иметь вид
\begin{equation}
\label{eq:eqFK}
F = -Ku.
\end{equation}

\subsubsection{Построение матрицы жесткости системы}

РР· (\ref{eq:eq10}) следует,что матрица жесткости системы строится РЅР° РѕСЃРЅРѕРІРµ коэффициентов жесткости для отдельных элементов. Алгоритмически выполнить это можно РїРѕ-разному \cite{ro}. Например, можно для всех элементов строить матрицы жесткости одинаковой размерности равной размерности матрицы $K$, основываясь РЅР° столбце $u$ перемещений всех узлов системы. Это возможно, поскольку $f_{lt}^{(i)} = 0$, если РїРѕ крайней мере РѕРґРёРЅ РёР· узлов $l$ или $t$ РЅРµ принадлежит элементу $i$. РР· условия равновесия элемента $i$ следует 
 \[f_{lt}^{(i)} = \pm f^{(i)} \,\,\,\, \text{РїСЂРё} \,\,\,\, u_l^{(i)} = 0, u_t^{(i)} = 1,\]
 где $f^{(i)} > 0$ при растяжении и $f^{(i)} < 0$ при сжатии. В результате на основании (\ref{eq:eq4}), (\ref{eq:eq5}) и (\ref{eq:eq8}) получим
\[
 K^{(1)} = 
\begin{vmatrix}
f_{11} & 0 \ldots & \ldots\\
0 & \ldots & \ldots \\
\ldots & \ldots & \ldots
\end{vmatrix},\,\,\,\,  
K^{(n-1)} = \begin{vmatrix}
\ldots & \ldots & \ldots \\
\ldots& \ldots & 0\\
\ldots & 0     & f_{n-1,n-1} \\
\end{vmatrix}, 
\]
\[
K^{(i-1)} = \begin{vmatrix}
0 & \ldots & \ldots    & \ldots       & \ldots & \ldots \\
0 & \ldots & f_{ii}    & f_{i,i+1}    & 0      & \ldots  \\
0 & \ldots & f_{i+1,i} & f_{i+1,i+1}  & 0      & \ldots \\
0 & \ldots & \ldots    & \ldots       & \ldots & \ldots \\
\end{vmatrix},\,\,\,  
\]
\[ K = K^{(1)} +\ldots + K^{(i-1)} +\ldots + K^{(n-1)}. \]


Матрица $K$ примет вид
\begin{equation}
\label{eq:eq14}
K = 
\begin{vmatrix}
-\kappa^{(1)}-\kappa^{(2)}&\kappa^{(2)} &0 & \ldots & \ldots \\
 \kappa^{(2)} &-\kappa^{(2)}-\kappa^{(3)} &\kappa^{(3)} & 0 &\ldots \\             
 0 & \kappa^{(3)} &-\kappa^{(2)}-\kappa^{(3)} & \kappa^{(4)} & 0  \\ 
 \ldots & \ldots &  \ldots & \ldots &  \ldots & \\ 
 \ldots & 0 & \kappa^{(n-2)} &-\kappa^{(n-2)}-\kappa^{(n-1)} & \kappa^{(n-1)}\\
\ldots & \ldots & 0 & \kappa^{(n-1)} &-\kappa^{(n-1)}-\kappa^{(n)}\\
\end{vmatrix}.
\end{equation}

Подставляя сюда вместо $F$ его выражение согласно (\ref{eq:eq12}), окончательно получим систему алгебраических уравнений относительно смещений элементов в узлах $u_i$
\begin{equation}
\label{eq:eq15}
\left\lbrace 
\begin{matrix}
(\kappa^{(1)} + \kappa^{(2)})u_1 -\kappa^{(2)}u_2 & = F_1,\\
\ldots & \ldots \\
-\kappa^{(i-1)}u_{i-1} + (\kappa^{(i-1)} + \kappa^{(i)})u_i + \kappa^{(i+1)}u_{i+1} &= F_i,\\
\ldots & \ldots \\
-\kappa^{(n-1)}u_1 + (\kappa^{(n-1)} + \kappa^{(n)})u_2 &= F_n,\\
\end{matrix}\right. 
\end{equation}
В результате решения системы уравнений (\ref{eq:eq15}) находятся $u^{(i)}$,  во всех элементах системы.

Таким образом, схема метода конечных элементов для дискретных задач
состоит из представления системы в виде совокупности отдельных элементов, использования точного решения для типового элемента и соединения элементов в систему. Матрица жесткости всей системы определяется посредством матриц жесткости отдельных элементов и является матрицей системы алгебраических уравнений относительно неизвестных узловых перемещений. 

\subsection{Построение системы линейных алгебраических уравнений}
\subsubsection{Матричная форма}

Метод конечных элементов сводит решение линейной задачи к решению
системы линейных алгебраических уравнений
\begin{equation}
\label{eq:systema}
\begin{matrix}
f_{11}u_1 + f_{12}u2 + \ldots + f_{1n}u_n &= F_1, \\
\hdotsfor{2}\\
f_{n1}u_1 +  f_{n2}u2 + \ldots + f_{nn}u_n &= F_n.\\
\end{matrix}
\end{equation}
Здесь $u_i\,\,\, (i = 1, 2, \ldots, n)$ - неизвестные, $F_i\,\,\, (i = 1, 2, \ldots, n)$ - заданные свободные члены, $f_{ij}\,\,\, (i, j = 1, 2, \ldots, n)$ – коэффициенты при неизвестных. Коэффициенты $f_{ij}$ образуют квадратную матрицу, состоящую из $n$ строк и $n$ столбцов
\begin{equation}
\label{eq:eq16}
K = \begin{vmatrix}
f_{11} & f_{12} & \ldots & f_{1n} \\
\hdotsfor{4}\\
f_{n1} & f_{n2} & \ldots & f_{nn}
\end{vmatrix}
\end{equation}
Если обозначить столбец неизвестных $u$, а столбец свободных членов $P$,
то система линейных алгебраических уравнений (\ref{eq:systema}) принимает матричную форму (\ref{eq:eq15}) с матрицей жесткости (\ref{eq:eq16})
\begin{equation}
\label{eq:matr}
Ku=f.
\end{equation}

Система алгебраических уравнений должна быть невырожденной, то есть иметь единственное решение. 
Для решения (\ref{eq:matr}) можно воспользоваться, например,
методом исключения Гаусса. Однако при применении приближенных методов
обычно приходится иметь дело с системами большого порядка $n\gg 1$, и матрица,
вообще говоря, может иметь такую структуру, которая затрудняет получение
решения. При этом на точности результата в той или иной степени сказываются
неизбежные в процессе вычислений ошибки округления. Одним из важных
достоинств метода конечных элементов является то, что он обычно приводит к
таким системам алгебраических уравнений, матрицы $K$ которых позволяют
эффективно строить решение.
\paragraph{Какой желательно иметь матрицу жёсткости }

Выясним, какой желательно иметь матрицу $K$ в (\ref{eq:matr}). Пределом мечты
была бы система (\ref{eq:matr}) с диагональной матрицей $K$, когда все
 \[f_{ij} = 0 \,\,\,\text{РїСЂРё}\,\,\, i \neq j. \]
 В этом случае (\ref{eq:matr}) распадается на отдельные уравнения 
 \[f_{ii}u_i = F_i.\] 
 
Такое может быть, только если в физической системе, рассчитываемой методом конечных
элементов, узлы между собой не связаны, то есть по существу системы не
существует. Однако теперь уже ясно, к чему надо стремиться: следует так
выполнять процесс построения алгебраической системы уравнений, чтобы
матрица по возможности содержала больше нулевых коэффициентов и была
близка к диагональной, другими словами, желательно, чтобы в каждое
уравнение входило относительно небольшое число неизвестных в соседних узлах.
\subsubsection{Ленточные матрицы}
Матрицы, близкие к диагональным, обычно имеют ленточную структуру,
когда все ненулевые и некоторые нулевые коэффициенты находятся между
двумя линиями, параллельными главной диагонали. Например,
\[
K =  \left( \begin{array}{ccccc}
\cline{2-3}
* & 0 & * & 0 & 0 \\
\multicolumn{1}{|c}{0}  & * & * & * & 0 \\
\multicolumn{1}{|c}{*}  & * & * & 0 & 0 \\     
0 & * & 0 & * & * \\
0 & 0 & 0 & * & * \\
\end{array} \right) 
 \]
где знак $*$ заменяет коэффициенты, отличные от нуля. Ленточную матрицу характеризует
ширина ленты $t = t_1 + t_2 + 1$, равная наибольшему числу коэффициентов в строке
в пределах ленты. В данном случае $t_1 = t_2 = 2$ и $t = 5$. Для диагональной матрицы
$t = 1$. При решении системы уравнений с ленточной матрицей участвуют только те коэффициенты,
которые расположены в пределах ленты. Число арифметических операций, необходимых для решения системы алгебраических уравнений с полностью заполненной матрицей методом Гаусса, при больших $n$
имеет порядок $n^3$. В то же время для ленточной матрицы при $t_1 = t_2$ и $t_1 \ll n$ он
составляет $n t_1^2$.

\subsubsection{Пример ленточной матрицы}

Для примера ленточной матрицы обратимся к задачам предыдущего
раздела, но с пятью узлами и шестью элементами на рисунке \ref{fig:Fig1}, г Аналогично (\ref{eq:eq12}) матрица $K$ будет иметь коэффициенты $f_{lt}$. По смыслу $f_{lt}$ они отличны от нуля только для тех узлов $l$, где перемещение узла $t$ вызывает отличную от нуля силу при условии, что остальные узлы, кроме $t$, неподвижны. Отсюда при нумерации узлов, показанной на рисунке \ref{fig:Fig1}, г, слева от оси x имеем:
\begin{equation}
\label{eq:eq17}
K = \begin{pmatrix}
* & * & 0 & 0 & 0 \\
* & * & * & 0 & 0 \\
0 & * & * & * & 0 \\     
0 & 0 & * & * & * \\
0 & 0 & 0 & * & * \\
\end{pmatrix}  
\end{equation}
Здесь $t = 3$ и матрица $K$ является трехдиагональной.

При применении метода конечных элементов ширина полосы ленточной
матрицы зависит от нумерации узлов. Например, если пронумеровать узлы так,
как показано на рисунке \ref{fig:Fig1},г справа от оси $x$, то $K$ примет вид (\ref{eq:eq17}). Вообще если
элементы имеют несколько узлов, то при $t_1 = t_2$ величина $t_1$ равна максимальной
по элементам величине наибольшей разности между номерами узлов в
отдельном элементе. В первом случае нумерации узлов слева на рисунке \ref{fig:Fig1},г $t_1 =1$, а при нумерации справа $t_1 = 2$.

\subsubsection{Предостережение - плохая обусловленность}

В некоторых случаях исходная постановка задачи может оказаться
настолько плохой, что даже метод конечных элементов РЅРµ может помочь. Р
надо ее менять. При этом имеет место система алгебраических уравнений, в
которой малые изменения коэффициентов или свободных членов приводят к
значительному изменению решения. Такие системы уравнений носят название
плохо обусловленных. Выясним, в чем причина плохой обусловленности на
примере системы (\ref{eq:eq15}), которую перепишем в виде
\begin{equation}
\label{eq:eq18}
\begin{matrix}
u_2 =& \dfrac{\kappa^{(1)} + \kappa^{(2)}} {\kappa^{(2)}} u_1 - \dfrac{F_1}{\kappa^{(2)}},\\
u_2 =& \dfrac{\kappa^{(2)}} {\kappa^{(2)} + \kappa^{(3) }} u_1 - 
\dfrac{F_2}{\kappa^{(2)} + \kappa^{(3) }}.\\
\end{matrix} 
\end{equation}
\begin{figure}[hbt]
 \centering
\includegraphics[scale=0.8]{./Fig3.png}
 \caption{Графическое решение системы уравнений (\ref{eq:eq18})}
 \label{fig:Fig3}
\end{figure}

В прямоугольной системе координат $u_1,\,\,\ u_2$ на рисунке \ref{fig:Fig3} уравнение прямой
будет $u_2 = u_1\tan \alpha_1 + g$, где $\alpha$ – угол между прямой и положительным направлением
оси $u_1$, $g$ – отрезок отсекаемый прямой на оси $u_2$. Уравнения (\ref{eq:eq18}) описывают две
прямые на рисунке \ref{fig:Fig3}, а решение (\ref{eq:eq18}) представляет собой координаты точки
пересечения этих прямых. Здесь
\[ \tan \alpha_1 =   \dfrac{\kappa^{(1)} + \kappa^{(2)}} {\kappa^{(2)}},\,\,\,\, 
\tan \alpha_2 = \dfrac{\kappa^{(2)}} {\kappa^{(2)} + \kappa^{(3) }}. \]
Если $\alpha_1 = \alpha_2$ и прямые параллельны, то решение системы (\ref{eq:eq18}) не
существует и она является вырожденной. Если $\alpha_1$ и $\alpha_2$ различаются мало, то система близка к вырожденной. При этом незначительные изменения углов $\alpha_1$, $\alpha_2$ сильно скажутся на координатах точки пересечения прямых, то есть на решении. Таким образом, плохая, обусловленность объясняется тем, что система является почти вырожденной.

В качестве примера обратимся к (\ref{eq:eq18}). Пусть $\kappa_1 = \kappa_3 = \kappa$ и $\kappa_2 \gg \kappa$, то eсть элемент 2 значительно более жесткий, чем элементы 1 и 3. При этом $\tan \alpha_1 \approx \tan \alpha_2$ и система (\ref{eq:eq18}) почти вырожденная. В данном случае разумно изменить постановку задачи и считать элемент 2 абсолютно жестким по сравнению с элементами 1 и 3. Это позволяет объединить узлы 1 и 2 в один узел, который обозначим 12, и приложить к нему суммарную силу $F_{12} = F_1 + F_2$. Если в (\ref{eq:eq18}) положить $u_1 = u_2 = u_{12}$, вычесть из первого уравнения второе и после преобразований пренебречь $\kappa$ по сравнению с $\kappa^{(2)}$, то задача сведется к одному уравнению 
\[ 2\kappa u_{12} = F_{12}, \]
которое и даст решние задачи в этом приближении.

\subsection{Пример вычислительной программы}

В Приложении приведен текст вычислительной программы fem2.cpp, написанной на языке С++ , в котором решается задача о стержне с закреплёнными концами составленном из однородных элементов и нагруженном в местах соединения стержней внешними силами, направленными вдоль оси стержня. В файле входных данных можно задавать число элементов, их размеры и коэффициенты жёсткости. На выходе получаются величины смещений узловых точек - мест соединения стержней. Система линейных алгебраических уравений решается методом  обратной подстановки.
 
Текст программы снабжен подробными комментариями со ссылками на формулы данного раздела.



\section{Однородный стержень с непрерывной нагрузкой }
\subsection{Континуальная задача}
Обратимся к задаче (\ref{eq:eq3}) для одного элемента. В общем случае задания
$q^{(i)}(x)$ она является континуальной задачей. Для простоты положим $c^{(i)} = 1$,
$l^{(i)} = 1$, $u_i^{(i)} = u_j^{(i)} = 0$ и опустим индекс $r$ , тогда дифференциальное уравнение в (\ref{eq:eq3}) будет иметь вид:
\begin{equation}
\label{eq:eq19}
- \dfrac{d^2 u}{d^2 x}=q(x).
\end{equation}
Для общности рассмотрим эту задачу при нулевых граничных условиях  
\begin{equation}
\label{eq:bc0}
u(0)=0,\,\,\,\,u(1)=0,
\end{equation}
и при граничных условиях общего вида, которые в дальнейшем для краткости будем называть ненулевыми граничными условиями:
\begin{equation}
\label{eq:bc}
au(0)- \dfrac{du(0)}{dx}=0,\,\,\,\,au(1) - \dfrac{du(1)}{dx}=0,\,\,\,a>0,
\end{equation}
Эти условия требуют положительного решения на границах $u>0$ и градиентов направленных внутрь. Коэффициент $a$ для простоты будем считать постоянным.

В матричной форме уравнение (\ref{eq:eq19}) c граничными условиями (\ref{eq:bc}) будет иметь вид
\begin{equation}
\label{eq:eqn}
Ku=	Q.
\end{equation}
Необходимо записать для данной задачи матрицу жёсткости $K$ и столбец $Q$ при заданной нагрузке $q(x)$.

\subsection{Решение задачи первым способом}
\subsubsection{Аппроксимация решения пробными функциями}
\begin{figure}[h]
 \centering
\includegraphics[scale=0.6]{./Fig4.png}
 \caption{Пробные функции}
 \label{fig:Fig4}
\end{figure}
Согласно схеме метода конечных элементов, разобьем интервал $[0, 1]$ на элементы, соединенные в узлах
$x_i,\,\,\, i = 1,2,\ldots, n $ (СЂРёСЃСѓРЅРѕРє \ref{fig:Fig4}). 

Будем разыскивать приближенное решение задачи (\ref{eq:eq19}), (\ref{eq:bc}) среди функций семейства с конечным числом параметров в виде:
\begin{equation}
\label{eq:yi}
u(x)\approx y(x)=y_1\varphi_1(x)+y_2\varphi_2(x)+\ldots+y_n\varphi_n(x).
\end{equation}
Здесь $u ( x )$ приближенно представлена функцией $y( x )$ - линейной комбинацией некоторых функций $\varphi_i ( x )$ с коэффициентами (параметрами) $u_i = u ( x_i )$ - неизвестными значениями искомой функции в узлах $x_i$. Для того чтобы в (\ref{eq:yi}) $y( x_i ) = y_i$ во всех узлах $x_i$, функции $\varphi_i ( x )$ должны удовлетворять условиям
\begin{equation}
\label{eq:fi}
\varphi_i ( x )=\left\lbrace
\begin{matrix}
1, & x=x_i,\\
0, & x=x_j,\,\,j\neq i.
\end{matrix}
 \right. 
\end{equation} 
В остальном функции $\varphi_i( x )$, которые носят название пробных, можно выбирать в довольно широких пределах. 

Общие требования к пробным функциям состоят в возможности выполнить процесс построения приближенного решения, т.е. на основе (\ref{eq:yi}) при $n\rightarrow\infty$ осуществить сколь угодно точно аппроксимацию любой функции, среди которых разыскивается решение задачи. 

Очевидно, выбор $\varphi( x )$ играет важнейшую роль как РІ отношении трудоёмкости расчета, так Рё точности результата. Метод конечных элементов оперирует РІ качестве $\varphi( x )$  кусочно-полиномиальными функциями, отличными РѕС‚ нуля РІ пределах небольшого числа элементов вблизи узла $x_i$. Рменно это делает метод максимально эффективным.

Поскольку $u(x)$ по своему физическому смыслу должна быть непрерывной функцией, выберем $\varphi( x )$  в виде кусочно-линейных функций-“домиков” составленных из двух половинок (рисунок \ref{fig:Fig4}). 
\begin{equation}
\label{eq:domik}
\varphi_i(x)= \varphi_i^+(x) + \varphi_i^-(x),
\end{equation}
РіРґРµ
\[
\varphi_i^-(x) = \dfrac{1}{h}(x-x_i+h) \Theta (x-x_i)\Theta (x_{i+1}-x),\]
\[
\varphi_i^+(x) =-\dfrac{1}{h}(x-x_i-h) \Theta (x-x_i)\Theta (x_{i+1}-x). 
\]
Здесь $\Theta (x)$ - ступечатая функция
\[
\Theta (x) = \left\lbrace
\begin{matrix}
1, & x \geq 0, \\
0, & x <0.
\end{matrix}\right.
\]

Каждая такая функция $\varphi_i( x ),\,\,i = 1, 2,\ldots, n$, равна единице в $x_i$ и нулю во всех остальных узлах.
При этом набор функций $\varphi_i(x)$ в (\ref{eq:yi}) будет состоять из непрерывных функций линейных в пределах элементов с изломами в узлах и определяемых своими узловыми значениями $u_i,\,\, i = 1,2,\ldots, n$. 

\subsubsection{Пример аппроксимации пробными функциями}

Аппроксимация некоторой функции $u(x)$ (\ref{eq:yi}) пробными функциями (\ref{eq:domik}) представляет собой ломаную линию, состоящую из отрезков прямых, соединяющих точки $(x_i,\,y_i)$. Проиллюстрируем это на примере функции $u=\sin(x),\,\,\,x \in [0,\pi]$ при $y_i =\sin(x_i)$. Ниже приведён текст программы на SCILAB, и на рисунке \ref{fig:Fig9} график, построенный этой программой
\begin{figure}[h]
 \centering
\includegraphics[scale=1.0]{./Fig9.png}
 \caption{\textit{Аппроксимация функции $u=sin(x)$ пробными функциями }}
 \label{fig:Fig9}
\end{figure}

Текст программы:\\
\texttt{
function v = phi\_m(x\_i,i,x) //$\varphi_i^-(x)$\\
 h = x\_i(i) - x\_i(i-1); \\
\qquad   v = 1/h*(x-x\_i(i)+h);  \\
endfunction\\
function v = phi\_p(x\_i,i,x)  //$\varphi_i^+(x)$\\
\qquad   h = x\_i(i+1) - x\_i(i);\\
\qquad   v = 1/h*(x\_i(i)-x+h);  \\
endfunction\\
x\_i = linspace(0,\%pi,11); \\
y\_i = sin(x\_i);\\
x = 0;\\
for i = 1:10\\
xi = linspace(x\_i(i),x\_i(i+1),10);\\
for j=1:10\\
  x((i-1)*10+j) = xi(j);\\
  y((i-1)*10+j) =y\_i(i)* phi\_p(x\_i,i,xi(j)) + ...\\
  y\_i(i+1)*phi\_m(x\_i,i+1,xi(j));\\
end\\
end\\
scf(1), plot(x\_i,y\_i,'+', x,y),\\
xlabel('x'), ylabel('y')\\ }
\text

\subsubsection{Переход к слабой форме }
\label{sec:dif2int}
Остаётся определить $y_i$ в аппроксимции решения (\ref{eq:yi}). Это можно сделать по-разному путем приближенного удовлетворения уравнению в (\ref{eq:eq19}). Однако, поскольку уравнение в (\ref{eq:eq19}) содержит вторую производную по $x$ , а уже первая производная по $x$ в (\ref{eq:yi}) терпит разрывы непрерывности в узлах, воспользуемся следующим приёмом. Обозначим 
\[R ( x ) = \dfrac{d^2 u(x)}{d^2 x} + q ( x )\]
невязку уравнения в (\ref{eq:eq19}). Точное решение даёт $R ( x ) = 0$, и, следовательно,
\begin{equation}
\label{eq:int}
\int\limits_0^1  \varphi (x) \left[ \dfrac{d^2 u(x)}{d^2 x} + q ( x ) \right] dx = 0
\end{equation}
для любых функций $\varphi( x )$, которые носят название пробных.

Переход от дифференциального уравнения к интегралльной формулировке той же задачи в вычислительной математике называется переходом от коэффициентной к слабой форме. Такой переход существенно расширяет класс решаемых задач, поскольку интеграл, в отличие от производной, может быть взят и от кусочно-непрерывных функций и дельта-функций.

Подставим аппроксимацию искомого решения (\ref{eq:yi}) в интегральное уравнение (\ref{eq:int}) и затем выполним в (\ref{eq:int}) интегрирование по частям с учётом граничного условия (\ref{eq:bc}).
Тогда вместо (\ref{eq:int}) получим:
\begin{equation}
\label{eq:int1}
\left. \varphi \dfrac{du}{dx}\right| _0^1 -
\int\limits_0^1\left[ \dfrac{d\varphi (x)}{dx}\dfrac{d u(x)}{d x} - q ( x )\varphi (x) \right]  dx = 0.
\end{equation}
Поскольку разыскивается приближенное решение среди функций семейства
с конечным числом параметров в форме (\ref{eq:yi}) и для него, как правило, $R ( x ) \neq 0$, то выполнение тестового условия (\ref{eq:int1}) на базе (\ref{eq:yi}) для любых пробных функций невозможно.

\subsubsection{Метод Галёркина}

Смягчим условие (\ref{eq:int1}), потребовав, чтобы оно выполнялось только для $n$ функций $\varphi_i( x )$, которые совпадают с пробными функциями, заданными выражением (\ref{eq:domik}):
\begin{equation} \label{eq:Gal}
\varphi( x ) = \varphi_i ( x ),\,\,\,i=1,2,\ldots,n.
\end{equation}
Такой приём носит название а метода Галёркина. 

В интегральное уравнение (\ref{eq:int1}) теперь входит первая производная функции $u$. Первая производная дискретной аппроксимации функции $u$ (\ref{eq:yi}) имеет вид 
\begin{equation}
\label{eq:dxi}
\frac{du}{dx}\approx\frac{dy(x)}{dx}=y_1\frac{d\varphi_1(x)}{dx}+y_2\frac{d\varphi_2(x)}{dx}+\ldots+y_n\frac{d\varphi_n(x)}{dx}.
\end{equation}

Подставим эту аппроксимацию производной искомого решения в равенство (\ref{eq:int1}) и потребуем его выполнения для каждой из $n$ пробных функций (\ref{eq:domik}).
Тогда вместо (\ref{eq:int1}) получим $n$ уравнений
\begin{equation}
\label{eq:int2}
\left. \varphi_i \dfrac{du}{dx}\right| _0^1 -
\int\limits_0^1\left[ \dfrac{d\varphi_i (x)}{dx}\sum\limits_{j=1}^n y_j \dfrac{d \varphi_j(x)}{d x} - q ( x )\varphi_i (x) \right]  dx = 0,
\,\,\,i=1,2,\ldots,n.
\end{equation}

При вычислении первого члена в левой части уравнения (\ref{eq:int1}) следует учитывать условия на границах.

\paragraph{Нулевые граничные условия}

В случае нулевых граничных условий вместо (\ref{eq:bc}) имеем
\begin{equation}
\label{eq:bc0}
u(0)=0, \,\,\, u(1)=0.
\end{equation}
Граничные точки следует исключить из системы уравнений, так как решения на границах известны. Нулевые граничные условия будут выполняться автоматически, если построить аппроксимирующую функцию так, как показано на рисунке \ref{fig:Fig4}, т.е. искать решение  (\ref{eq:yi}) только для внутренних узлов. Тогда автоматически 
\[\varphi_1(0)=0,\,\,\,\varphi_n(1)=0, \]
а также
\[\varphi_i(0)=0,\,\,\, \forall i\]
Таким образом, в случае нулевых граичных условий 
\begin{equation}
\label{eq:bc00}
\left. \varphi_i \dfrac{du}{dx}\right| _0^1 =0 
\end{equation}
для всех $i$ в (\ref{eq:int2}).

После подстановки граничных условий (\ref{eq:bc00}) в (\ref{eq:int2})
получим
\begin{equation}
\label{eq:gen}
\int\limits_0^1\left[ \dfrac{d\varphi_i (x)}{dx}\sum\limits_{j=1}^n y_j\dfrac{d\varphi_j}{dx}dx - q ( x )\varphi_i (x) \right]  dx = 0,
\,\,\,\forall i.
\end{equation}
Это даёт систему линейных алгебраических уравнений относительно 
$y_j$ вида (\ref{eq:eq16}) с коэффициентами $f_{ij}$ матрицы жёсткости
\begin{equation}
\label{eq:eq23}
f_{ij}=\int\limits_0^1  \dfrac{d \varphi_i(x)}{d x} \dfrac{d\varphi_j(x)}{dx} dx,
\end{equation}
и правую часть матричного уравнения $Q_i$
\begin{equation}
\label{eq:eqP}
Q_i= \int\limits_0^1 \varphi_i(x) q(x)dx.
\end{equation}
Здесь $f_{ij} = f_{ji}$ и матрица $K$ симметричная, что характерно для метода Галёркина.

\paragraph{Ненулевые граничные условия}

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

Как можно видеть на рисунке \ref{fig:Fig4}, пробные функции, построенные для граничных узлов, состоят из половинок "домиков": 
\begin{eqnarray}
\label{eq:domik01}
\varphi_1(x)= \varphi_1^+(x) 
=- \dfrac{1}{h}(x-h) \Theta (x)\Theta (h-x);\qquad \qquad\\
\varphi_n(x)=\varphi_n^-(x) =\dfrac{1}{h}(x-x_n+h) \Theta (x-x_{n-1})\Theta (x_n-x).
\end{eqnarray}

Для внутренних узлов "домики" \, полные, и пробные функции определяются по-прежнему выражением (\ref{eq:domik}).
  
\subsubsection{Вычисление матрицы жёсткости}
\paragraph{Нулевые граничные условия}

Для простоты примем длину элементов одинаковой и равной $h$. Согласно
рисунку \ref{fig:Fig4} и определению функции $\varphi_i $ (\ref{eq:domik}), наклон $d\varphi_i/ dx$ функции $\varphi_i$ равен $ 1/h $ на интервале $ [x_i-1, x_i] $, $ -1/h $ на интервале $ [x_i , x_i +1] $ и равен нулю для вне этих интервалов. Кроме того, произведение $(d\varphi_i/dx)(d\varphi_j/dx)$ отлично от нуля только при $j = i,\,\,\, j = i \pm 1$, когда соответствующие два элемента, которые несут на себе функции $\varphi_i$ и $\varphi_j$ , перекрываются (рисунок \ref{fig:Fig4}). В противном случае $(d\varphi_i/dx)(d\varphi_j/dx)=0$. 

Вычислим коэффиценты матрицы $K$ для $i$ - той строки.
Для узлов на главной диагонали получим
\[
f_{ii}=\int\limits_{x_{i-1}}^{x_{i+1}} \left( \dfrac{d \varphi_i(x)}{d x}\right) ^2 dx =
 \int\limits_{x_{i-1}}^{x_i} \left( \dfrac{1}{h}\right)^2  dx +
 \int\limits_{x_i}^{x_{i+1}} \left( -\dfrac{1}{h}\right)^2  dx  =\dfrac{2}{h}.
\]
Для узлов cправа от диагонали $ j=i-1 $ получим
\[
f_{i,i-1}=\int\limits_{x_{i-1}}^{x_i}\dfrac{d\varphi_i}{dx} \dfrac{d\varphi_{i-1}}{dx}  dx =
 \int\limits_{x_{i-1}}^{x_i} \dfrac{1}{h} \left( -\dfrac{1}{h}\right)   dx  = -\dfrac{1}{h}.
\]
Для узлов cлева от диагонали $ j=i+1 $ получим
\[
f_{i,i+1}=\int\limits_{x_i}^{x_{i+1}} \dfrac{d\varphi_i}{dx} \dfrac{d\varphi_{i+1}} {d x} dx =
 \int\limits_{x_i}^{x_{i+1}} \left( -\dfrac{1}{h}\right) \dfrac{1}{h}  dx  = -\dfrac{1}{h}.
\]

Таким образом, получим для внутренних узлов в $i$ - той строке 
\begin{equation}
\label{eq:eq25}
f_{ij} = \left\lbrace  
\begin{matrix}
2/h, & j=i,\\
-1/h, & j = i - 1,\,\,j=i+1,\\
0,    & j < i - 1,\,\,j>i+1.\\
\end{matrix} \right. 
\end{equation} 
Следовательно, матрица $K$ в данном случае оказывается трехдиагональной и имеет размерность $(N-2)\text{x}(N-2)$, где $N$ -число узлов, считая граничные:
\begin{equation}
\label{eq:eq26}
K = \frac{1}{h}\begin{pmatrix}
2 & -1 & 0 & \ldots & 0 & 0 \\
-1 & 2 & -1 & \ldots & 0 & 0 \\
0 & -1 & 2 & -1 &\ldots& 0 \\  
\ldots &\ldots &\ldots &\ldots &\ldots &\ldots\\   
0 & 0 &\ldots & -1 & 2 & -1 \\
0 & 0 & \ldots & 0 & -1 & 2\\
\end{pmatrix}.  
\end{equation}

\paragraph{Ненулевые граничные условия}
Р’ случае ненулевых граничных условий граничные точки следует включить РІ сетку узлов. РџСЂРё прежнем шаге дискретизации это РїСЂРёРІРѕРґРёС‚ Рє увеличению числа уравнений РЅР° РґРІР°: РІ систему уравнений Р±СѓРґСѓС‚ добавлены РґРІРµ новые неизвестные - значения смещений РІ граничных узлах. Это привед‘С‚ Рє соответствующему увеличению размерности матрицы $K$.

На границе $x=0$ в соответствии с условиями (\ref{eq:bc}) имеем
\begin{equation}
\label{eq:bc3}
\left. \varphi_i \dfrac{du}{dx}\right| _0 =
\varphi_i(0) au(0) \approx  a \varphi_i(0)\sum \limits_{j=1}^n y_j(0)\varphi_j(0)
 = \left\lbrace
 \begin{matrix}
 ay_1,& i=1,\\
 0, & i=2,3,\ldots, n,\\
\end{matrix}\right.
\end{equation}
и на границе $x=1$
\begin{equation}
\label{eq:bc4}
\left. \varphi_i \dfrac{du}{dx}\right|_1 =
\varphi_i(1) au(1) \approx  a \varphi_i(1)\sum \limits_{j=1}^n y_j(1)\varphi_j(1)
 = \left\lbrace
 \begin{matrix}
 0, & i=1,2,\ldots, n-1,\\
  ay_n,& i=n.\\
\end{matrix}\right.
\end{equation}

Перепишем систему уравнений (\ref{eq:int2}) в более удобном для дальнейщего рассмотрения в виде
\begin{equation}
\label{eq:int2new}
au_n \delta_{in} - au_1 \delta_{i1} +
\int\limits_0^1 \dfrac{d\varphi_i (x)}{dx}\sum\limits_{j=1}^n u_j \dfrac{d \varphi_j(x)}{d x} dx = \int\limits_0^1 \varphi_i(x) q(x)dx,
\,\,\, \forall i.
\end{equation}
Здесь $\delta_{ij}$ - символ Кронекера. 

После подстановки граничных условий (\ref{eq:bc3}) и (\ref{eq:bc4}) в (\ref{eq:int2new}) получим коффициенты матрицы $K$ 
\begin{equation}
\label{eq:mnz}
f_{ij}= \left\lbrace
\begin{matrix}
-au_1+\int\limits_0^1  \dfrac{d \varphi_1(x)}{d x} \dfrac{d\varphi_j(x)}{dx} dx, & i=1,\,\, \forall j;\\
\int\limits_0^1  \dfrac{d \varphi_i(x)}{d x} \dfrac{d\varphi_j(x)}{dx} dx, & i=2,3,\ldots, n-1,\,\, \forall j;\\
au_n+\int\limits_0^1  \dfrac{d \varphi_n(x)}{d x} \dfrac{d\varphi_j(x)}{dx} dx,& i=n,\,\, \forall j.\\
\end{matrix}
\right.
\end{equation}

Следовательно, матрица $K$ в данном случае имеет размерность $N\text{x}N$, где $N$ - число узлов, считая граничные. Она также оказывается трёхдиагональной, но отличается, помимо размерности, тем, что включает граничные уловия в первый и последний члены диагонали:
\begin{equation}
\label{eq:K01}
K = \frac{1}{h}\begin{pmatrix}
1-ah & -1 & 0 & \ldots & 0 & 0 \\
-1 & 2 & -1 & \ldots & 0 & 0 \\
0 & -1 & 2 & -1 &\ldots& 0 \\  
\ldots &\ldots &\ldots &\ldots &\ldots &\ldots\\   
0 & 0 &\ldots & -1 & 2 & -1 \\
0 & 0 & \ldots & 0 & -1 & 1+ah\\
\end{pmatrix}.  
\end{equation}

\subsubsection{Вычисление правой части}
Теперь займёмся вычислением правой части системы уравнений (\ref{eq:int2new}) при произвольной нагрузке $q(x)$.
 
\paragraph{Нулевые граничные условия}

Р’ этом случае РІСЃРµ узлы СЃ номерами $ i = 1$ Рё $i = n$ являются внутренними Рё имеют окрестности СЃ РѕР±РѕРёС… сторон РѕС‚ узла (СЂРёСЃСѓРЅРѕРє \ref{fig:Fig4}) правая часть матричного уравнения получается интегрированием РїРѕ окрестности внутренних узлов. Рмеем
\begin{equation}
\label{eq:bc0}
Q_i = \int\limits_{x_i-h}^{x_i} \varphi_i^-(x_i) q(x) dx +
\int\limits_{x_i}^{x_i+h} \varphi_i^+(x_i)  q(x) dx,\,\,\,\forall i.
\end{equation}

\paragraph{Ненулевые граничные условия}
Для первого и последнего узлов имеем
\begin{equation}
Q_1 = \int\limits_0^h \varphi_1^+(0) q(x) dx,
\end{equation}
\begin{equation}
Q_n = \int\limits_{x_n-h}^{x_n} \varphi_n^-(x_n)  q(x) dx.
\end{equation}
Вычисление правой части для внутренних узлов с номерми $1<i<n$ производится по формуле (\ref{eq:bc0}).

\subsubsection{Контрольный пример}
\label{ex:1}
В качестве контрольного примера решим методом конечных элементов задачу (\ref{eq:eq19}),  (\ref{eq:bc}) при $q(x)=-2$, $a_0=a_1=1$
\begin{equation}
\label{eq:ex1} \begin{matrix}
-\dfrac{d^2 u}{d^2 x}=-2,\qquad x \in [0,1],\\
u(0)=\dfrac{du}{dx}(0),\,\,\,\,u(1) = \dfrac{du}{dx}(1),
\end{matrix}
\end{equation}
имеющую точное аналитическое решение
\[u(x) = x^2+x+1.\]
Пусть шаг дискретизации $h=0.1$, тогда $n=11$. 
По формулам (\ref{eq:8}) - (\ref{eq:11}) получаем
\begin{equation}
\label{eq:exKq}
\begin{pmatrix}
1.1 & -1 & 0 & \ldots & 0 & 0 \\
-1 & 2 & -1 & \ldots & 0 & 0 \\
0 & -1 & 2 & -1 &\ldots& 0 \\  
\ldots &\ldots &\ldots &\ldots &\ldots &\ldots\\   
0 & 0 &\ldots & -1 & 2 & -1 \\
0 & 0 & \ldots & 0 & -1 & 0.9\\
\end{pmatrix}  
=\begin{pmatrix}
-0.01\\
-0.02\\
\ldots\\
\ldots\\
-0.02\\
-0.01\\
\end{pmatrix}
\end{equation}

\begin{figure}[h]
 \centering
\includegraphics[scale=1.0]{./Fig6.png}
 \caption{\textit{Точное решение - сплошная кривая, крестики - решение методом конечных элементов}}
 \label{fig:Fig7}
\end{figure}

Воспользуемся математическим пакетом SCILAB, чтобы решить систему уравнений (\ref{eq:exKq}).

Текст программы:\\
\texttt{
K = [ \\
1.1 -1 0 0 0 0 0 0 0 0 0  \\
-1 2 -1 0 0 0 0 0 0 0 0  \\
0 -1 2 -1 0 0 0 0 0 0 0  \\
0 0 -1 2 -1 0 0 0 0 0 0  \\
0 0 0 -1 2 -1 0 0 0 0 0  \\
0 0 0 0 -1 2 -1 0 0 0 0  \\
0 0 0 0 0 -1 2 -1 0 0 0  \\
0 0 0 0 0 0 -1 2 -1 0 0  \\
0 0 0 0 0 0 0 -1 2 -1 0  \\
0 0 0 0 0 0 0 0 -1 2 -1  \\
0 0 0 0 0 0 0 0 0 -1 0.9];\\
q = -0.01*[1 2 2 2 2 2 2 2 2 2 1];\\
sol = inv(K)*q'; \\
x = linspace(0,1,11); \\
u = 1 + x + x*x; \\
scf(1), plot(x,u, x,sol,'+'),\\
xlabel('x'), ylabel('u,y') \\
epsilon= (u-sol)./u } \\
\text
\\

На рисуке \label{fig:Fig7} приведены результаты работы программы, из которых видно, что решение найденное методом конечных элементов на графике совпадает с точным. Относительная погрешность в этом случае составляет\\
$\epsilon$ \texttt{ = 1e-14[    0.19 0.14 0.16 0.14 0.20 0.13 0.16 0.10 0.13 0.13 0.13]},\\

\subsection{Решение задачи вторым способом}


\subsubsection{Пробные функции нормированные на единицу}

На сетке с неравномерным шагом дискретизации на интервале $x \in [0,1]$ определим функции
\begin{equation}
\label{eq:psip}
\psi_i^+ (x) = \left\{ {\begin{matrix}
   \dfrac{2}{(h_i^+)^2}(x_i - x + h_i^+), & x \in [x_i,x_i + h_i^+],  \\
   0, & x \notin [x_i,x_i + h_i^+], \,\,\,x_i \ne 1,  \\
\end{matrix}} \right.   
\end{equation}
\begin{equation}
\label{eq:psim}
\psi_i^- (x) = \left\{ {\begin{matrix}
   \dfrac{2}{(h_i^-)^2}(x - x_i + h_i^-), & x \in [x_i-h_i^-,x_i],  \\
   0, & x \notin [x_i-h_i^-,x_i], \,\,\,x_i \ne 0.  \\
\end{matrix}} \right.   
\end{equation}
\begin{equation}
\label{eq:psim}
\psi_i^0 (x) = \left\{ {\begin{matrix}
   \dfrac{1}{2\hbar}(h_i^-\psi_i^-(x) +h_i^+\psi_i^+(x)), & x \in [x_i-h_i^-,x_i+h_i^+],  \\
   0, & x \notin [x_i-h_i^-,x_i+h_i^+], \,\,\,x_i \ne 0,1.  \\
\end{matrix}} \right.   
\end{equation}
Здесь $h_i^-$ - шаг назад из узла $x_i$, $h_i^+$ - шаг вперёд из узла $x_i$,
$\hbar= 0.5(h_i^- + h_i^+)$.
Эти функции нормированы на единицу
\begin{equation}
\int \limits_0^1\psi_i^+ (x)dx = \int \limits_0^1\psi_i^- (x)dx = 
 \int \limits_0^1\psi_i^0 (x)dx=1.
\end{equation} 

Определим пробную функцию на сетке выражением
\begin{equation}
\label{eq:psi}
\psi_i(x) = \left\lbrace \begin{matrix}
\psi_1^+ (x), & i = 1;\\
\psi_i^0(x), &  1<i<n;\\
\psi_n^- (x), & i = n.
\end{matrix}\right.
\end{equation}
Производная пробной функции даётся выражениями
\begin{equation}
\label{eq:dpsi}
\dfrac{d\psi_i(x)}{dx} = \left\lbrace \begin{matrix}
\dfrac{d\psi_1^+ (x)}{dx}, & i = 1;\\
\dfrac{d\psi_i^0(x)}{dx}, &  1<i<n;\\
\dfrac{d\psi_n^- (x)}{dx}, & i = n.
\end{matrix}\right.
\end{equation}
РіРґРµ
\begin{equation}
\label{eq:psipd}
\dfrac{d\psi_1^+}{dx} = \left\{ {\begin{matrix}
   -\dfrac{2}{(h_1^+)^2}, & x \in [x_1,x_1 + h_1^+],  \\
   0, & x \notin [x_1,x_1 + h_1^+];  \\
\end{matrix}} \right.   
\end{equation}
\begin{equation}
\label{eq:psimd}
\dfrac{d\psi_i^0}{dx} = \left\{ {\begin{matrix}
   \dfrac{1}{\hbar_i h_i^-}, & x \in [x_i-h_i^-,x_i],  \,\,\,x_i \ne x_1, \\
   -\dfrac{1}{\hbar_i h_i^+}, & x \in [x_i-h_i^+,x_i],   \,\,\,x_i \ne x_n, \\
   0, & x \notin [x_i-h_i^-,x_i+h_i^+], \,\,\,x_i \ne x_1,x_n;  \\
\end{matrix}} \right.   
\end{equation}
\begin{equation}
\label{eq:psimd}
\dfrac{d\psi_n^-}{dx} = \left\{ {\begin{matrix}
   \dfrac{2}{(h_n^-)^2}, & x \in [x_n-h_i^-,x_n],  \\
   0, & x \notin [x_n-h_i^-,x_n].   \\
\end{matrix}} \right.   
\end{equation}

\subsubsection{Аппроксимирующая функция}

Пусть $ y(x_i)$  - сеточная функция, аппроксимирующая значения $ u(x)$  в узлах $x=x_i$. В окрестности узла используем аппроксимацию
\begin{equation}
\label{eq:appr1}
 u(x) \cong y(x_i) + \sum\limits_{i = 1}^n ( x - x_i)\left[ \Theta ( x - x_i) y_x(x_i) + \Theta (x_i - x)y_{\bar{x}}(x_i)\right] 
\end{equation} 
Здесь
\[
y_x(x_i) = \dfrac{1}{h_i^+}\left[ (y(x_{i+1}) - y(x_i)\right] ,
\]
- производная сеточной функции в узле $x_i$, взятая в направлении назад,
\[
y_{\bar{x}}(x_i) = \dfrac{1}{h_i^-}\left[ y(x_i) - y(x_{i - 1})\right] ,
\]
- производная сеточной функции в узле $x_i$, взятая в направлении вперёд.

\begin{figure}[h]
 \centering
\includegraphics[scale=0.8]{./Fig8.png}
 \caption{Аппроксимирующая функция (\ref{eq:appr1}) в окрестности узла $x_i$}
 \label{fig:Fig8}
\end{figure}

Тогда аппроксимация производной решения в окрестности узла $x_i$ справа и слева от него имеет вид
\begin{equation}
\label{eq:apprdif}
\dfrac{du}{dx}(x_i,x) \cong 
\Theta ( x - x_i) y_x(x_i) + \Theta (x_i - x)y_{\bar{x}}(x_i)
\end{equation}              
Здесь $\Theta (x)$ - функция Хэвисайда.

\subsubsection{Переход к интегральной форме }
Переход к интегральной форме полностью аналогичен \ref{sec:dif2int}. 
Подставим аппроксимацию производной искомого решения (\ref{eq:apprdif}) в интегральное уравнение (\ref{eq:int1}) и потребуем его выполнения для каждой из пробных функций (\ref{eq:psi}). Тогда вместо (\ref{eq:int1}) получим $n$ уравнений
\begin{equation}
\label{eq:int3}
-\left. \psi_i \dfrac{du}{dx}\right| _0^1 +
\int\limits_0^1\dfrac{d\psi_i}{dx}(x)\dfrac{du}{dx}(x_i,x)dx
= \int\limits_0^1 q ( x )\psi_i (x)dx ,
\,\,\,i=1,2,\ldots,n.
\end{equation}
Здесь индекс $i$ функции $\psi_i(x)$ соответствует номеру строки матричного уравнения, интегрирование ведётся по окрестности узла $x_i$ с тем же номером, что и номер строки, в интервале $x \in [x_{i-1},x_{i+1}]$ для внутренних узлов $i\ne 1,n$, а для первого и последнего узлов - в интервалах $x \in [x_1,x_2]$ и  $x \in [x_{n-1},x_n]$ соответственно. 

\subsubsection{Матричные коэффициенты}

Подставим в (\ref{eq:int3}) выражения для $\psi_i$, $d\psi_i/dx$ и $du/dx$ и вычислим матричные коэффициенты построчно. Для упрощения дальнейших выкладок обозначеним $y_i \equiv y(x_i)$. 

Для первой строки имеем
\[
\psi_1^+(0) a_0 y_1 +
\int\limits_0^h \dfrac{d\psi_1^+}{dx}(x)\dfrac{du}{dx}(0,x)dx =
\dfrac{2}{h^2} a_0 y_1 +  \int\limits_0^h \left(-\dfrac{2}{h^2}\right)\dfrac{y_2 - y_1}{h}dx.
\]
Матричные коэффициенты $f_{1j}$ для первой строки не равны нулю только в перых двух столбцах:
\begin{equation}
f_{11}=\dfrac{2}{h}a_0+\dfrac{2}{h^2},\,\,\,f_{12}=-\dfrac{2}{h^2},\,\,\,f_{1j}=0,\,\,j>2.
\end{equation}

 Для последней $n$-той строки имеем
\[
-\psi_n^-(1) a_1 y_n +
\int\limits_{1-h}^1 \dfrac{d\psi_n^-}{dx}(x)\dfrac{du}{dx}(1,x)dx =
-\dfrac{2}{h^2} a_1 y_n +  \int\limits_{1-h}^1 \dfrac{2}{h^2}\dfrac{y_n - y_{n-1}}{h}dx.
\]
Матричные коэффициенты $f_{nj}$ для последней строки не равны нулю только в двух последних столбцах:
\begin{equation}
f_{nn}=-a_1\dfrac{2}{h}+\dfrac{2}{h^2},\,\,\,f_{n,n-1}=-\dfrac{2}{h^2},\,\,\,f_{nj}=0,\,\,j<n-1.
\end{equation}

 Для строк с номерами $1<i<n$ имеем
\[
\int\limits_{x_i-h}^{x_i} \dfrac{d\psi_i^0}{dx}(x) y_{\bar{x}_i}dx +
\int\limits_{x_i}^{x_i+h} \dfrac{d\psi_i^0}{dx}(x) y_{x_i}dx=
\]\[ 
\int\limits_{x_i-h}^{x_i} \dfrac{1}{h^2} \dfrac{y_i-y_{i-1}}{h}dx +
\int\limits_{x_i}^{x_i+h} \left(- \dfrac{1}{h^2}\right) \dfrac{y_{i+1}-y_i}{h}dx .
\]
Матричные коэффициенты для этих строк не равны нулю в главной диагонали и ещё двух столбцах - перед и после главной диагонали:
\begin{equation}
f_{ii}=\dfrac{2}{h^2},\,\,\,f_{i,i-1}=f_{i,i+1}-\dfrac{1}{h^2},\,\,\,f_{ij}=0,\,\,i-1<j<i+1.
\end{equation}

Следовательно, матрица $K$ в данном случае имеет размерность $n\text{x}n$, где $n$ - число узлов, считая граничные. Она оказывается трёхдиагональной и включает граничные условия в первый и последний члены диагонали:
\begin{equation}
\label{eq:K02}
K = \frac{1}{h^2}\begin{pmatrix}
2+a_0h & -1 & 0 & \ldots & 0 & 0 \\
-1 & 2 & -1 & \ldots & 0 & 0 \\
0 & -1 & 2 & -1 &\ldots& 0 \\  
\ldots &\ldots &\ldots &\ldots &\ldots &\ldots\\   
0 & 0 &\ldots & -1 & 2 & -1 \\
0 & 0 & \ldots & 0 & -1 & 2-a_1h\\
\end{pmatrix}.  
\end{equation}


\subsubsection{Правая часть матричного уравнения}

Вычислим правую часть матричного уравнения. Согласно (\ref{eq:int3}), вектор правой части даётся выражениями

\begin{equation}
\label{eq:q2} \begin{matrix}
q_1  = \int\limits_0^h q(x)\psi_1^+ (x)dx ,\,\,\, i=1;\\
q_i  = \int\limits_{x_i - h}^{x_i+h} q(x)\psi_i^0 (x)dx , \,\,\, 1<i<n;\\  
q_n  = \int\limits_{1- h}^h q(x)\psi_n^- (x)dx,\,\,\, i=n.\\
\end{matrix}
\end{equation}

\subsubsection{Тот же контрольный пример}
Снова решим контролный пример (\ref{eq:ex1}).
Пусть шаг дискретизации  и число узлов остаются прежними $h=0.1$, $n=11$. 
По формулам (\ref{eq:K02}) и (\ref{eq:q2}) получаем
\begin{equation}
\label{eq:exKq2}
\begin{pmatrix}
2.2 & -2 & 0 & \ldots & 0 & 0 \\
-1 & 2 & -1 & \ldots & 0 & 0 \\
0 & -1 & 2 & -1 &\ldots& 0 \\  
\ldots &\ldots &\ldots &\ldots &\ldots &\ldots\\   
0 & 0 &\ldots & -1 & 2 & -1 \\
0 & 0 & \ldots & 0 & -2 & 1.8\\
\end{pmatrix}  
=\begin{pmatrix}
-0.02\\
-0.02\\
\ldots\\
\ldots\\
-0.02\\
-0.02\\
\end{pmatrix}
\end{equation}

Сравнивая матричные уравнения (\ref{eq:exKq}) и (\ref{eq:exKq2}), видим, что и матрицы и правые части уравнений отличаются друг от друга. Однако отличия можно устранить, если первое и последнее уравнения разделить на 2.

\begin{figure}[h]
 \centering
\includegraphics[scale=1.0]{./Fig7.png}
 \caption{\textit{Точное решение - сплошная кривая, крестики - решение методом конечных элементов}}
 \label{fig:Fig7}
\end{figure}

Воспользуемся математическим пакетом SCILAB, чтобы решить систему уравнений (\ref{eq:exKq}).

Текст программы:\\
\texttt{
K = [ \\
2.2 -2 0 0 0 0 0 0 0 0 0  \\
-1 2 -1 0 0 0 0 0 0 0 0  \\
0 -1 2 -1 0 0 0 0 0 0 0  \\
0 0 -1 2 -1 0 0 0 0 0 0  \\
0 0 0 -1 2 -1 0 0 0 0 0  \\
0 0 0 0 -1 2 -1 0 0 0 0  \\
0 0 0 0 0 -1 2 -1 0 0 0  \\
0 0 0 0 0 0 -1 2 -1 0 0  \\
0 0 0 0 0 0 0 -1 2 -1 0  \\
0 0 0 0 0 0 0 0 -1 2 -1  \\
0 0 0 0 0 0 0 0 0 -2 1.8];\\
q = -0.01*[2 2 2 2 2 2 2 2 2 2 2];\\
sol = inv(K)*q'; \\
x = linspace(0,1,11); \\
u = 1 + x + x*x; \\
scf(1), plot(x,u, x,sol,'+'),\\
xlabel('x'), ylabel('u,y') \\
epsilon= (u-sol)./u }\\
\text
\\

На рисуке \ref{fig:Fig7} приведены результаты работы программы, из которых видно, что решение найденное методом конечных элементов на графике совпадает с точным, как и при решении первым способом. Относительная погрешность в этом случае составляет\\
$\epsilon$ \texttt{ = 1e-14[    0.19 0.14 0.16 0.14 0.20 0.13 0.16 0.10 0.13 0.13 0.13]},\\
что вдвое меньше, чем при решении этой же задачи первым способом.


\subsection{Пример вычислительной программы}

В Приложении приведен текст вычислительной программы fem3.cpp, написанной на языке С++ , в котором решается задача (\ref{eq:eq19}) об однородном стержне с закреплёнными концами нагруженном внешними силами, направленными вдоль оси стержня и непрерывно меняющимися по величине. Функцию нагрузки $q(x)$ в правой части уравнения (\ref{eq:eq19}) можно задавать в тексте программы. Число узлов при дискретизации задачи также задается в тексте программы. На выходе получаются величины смещений узловых точек. Рекомендуется протестировать программу по какому-либо точному решению $u(x)$, получив для него функцию нагрузки $q(x)$. Примеры таких точных решений приведены в тексте программы.
\paragraph{Тестирование программы}
Решим континульную задачу об однородном стержне с закреплёнными концами (\ref{eq:eq19}):
\[
- \dfrac{d^2 u}{d^2 x}=q(x),\,\,\,\,u(0)=u(1)=0.
\]
Программа, реализующая вычислительный алгоритм для этой задачи, приведена в Приложении и состоит из текста программы на С++ в файле fem3.cpp и хедерного файла fem3.h. 

Чтобы протестировать программу, решим контрольный пример. Пусть решение имеет вид
\[u(x) = x^3-x. \]
Очевидно, что это решение удовлетворяет граничным условиям задачи.
Подставив это решение в уравнение, получим правую часть этого уравнения для нашей тестовой задачи

\[q(x)=-6x.\]

В тексте программы fem2.cpp введём найденную правую часть в функцию $fun\_q()$.
В функции $main()$ зададим число узлов $knots\_N$. 
В функции $output()$ организуем вывод приближённого численного решения и точного решения для соответствующих узлов в тектовый файл с именем results.dat.

Чтобы исследовать работу программы с помощью дебаггера можно в консоли ввести команду на компилирование и сборку исполняемого модуля с записью информации для дебаггирования:

\$ g++ fem2.cpp -g -o fem2.bin 

 Сначала откройте текст программы в редакторе, например, \textit{Kate} или в каком- либо другом редакторе неформатированного текста с опцией нумерования строк. Затем включите режим дебаггирования, введя с консоли команду

\$ gdb fem2.bin

Введите точку останова на нужной строке программы, например, на функции \textit{main}  

> break main

и запустите программу на выполнение командой  

> run

Для первоначального ознакомления с процессом дебаггирования достаточно нескольких команд: 
n (next) - перейти на следующую стороку, s (step) - войти внутрь команды, если команда предполагает обращение к функциям, с (continue) - продолжить выполнение программы и q (quit) - закончить работу в дебаггере.

\subsection{Подводим итоги}

Таким образом, для континуальной задачи метод конечных элементов
осуществляет переход к дискретной задаче на основе аппроксимации искомого решения суммой кусочно-полиномиальных функций, отличных от нуля на нескольких соседних элементах, содержащих узел. 

Затем выполнятся переход от коэффицентной формы дифференциального уравнения к  интегральной - слабой форме - с помощью условия невязки. 

Метод Галёркина позволяет перейти от интегральной формы к системе алгебраических уравнений и сформировать матрицу для всей системы на базе коенечного числа пробных функций.

Все пробные функции отличны от нуля на разных интервалах, что делает их существенно различными и построенную на их основе при помощи метода Галёркина систему линейных алгебраических уравнений невырожденной. 

Более того, матрица оказывается ленточной, и каждое уравнение связывает не более трех неизвестных в соседних узлах. 


\section{Стационарная диффузия или теплопроводность в стержне с неизолированными торцами}
\subsection{Краевая задача с условиями общего вида}
Пусть теперь коэффициенты дифференциального уравнения зависят от координаты $x$, а само уравнение имеет вид
\begin{equation}
\label{eq:dif1}
- \dfrac{d}{dx}\left(  D(x)\dfrac{du}{dx}  \right)+ C(x)\dfrac{du}{dx} - A(x)u = q(x),\,\,\, x\in[0,1],
\end{equation}
с граничными условиями
\begin{equation}
\label{eq:dif1bc} 
au=D(x)\dfrac{du}{dx},\,\,\,x=0;\,\,\,\,au=-D(x)\dfrac{du}{dx},\,\,\,x=1.
\end{equation}
Такое уравнение может воникает в задачах диффузии или теплопроводности. В случае диффузии $D$ - коэффициент диффузии, $C$ - коэффициент конвекции, $A$ - коэффициент поглощения, и эти коэффициенты могут зависеть от коодинаты $x$, но не зависят от самого решения, что и делает задачу линейной.

\subsubsection{Получение интегральной формы} 
\label{week}
Умножим дифференциальное уравнение (\ref{eq:dif1}) на нормированную на единицу пробную функцию (\ref{eq:psi})и проинтегрируем по области 
\begin{equation}
\label{eq:dif12int}
\int\limits_0^1 \psi\left[  - \dfrac{d}{dx}\left(  D(x)\dfrac{du}{dx} \right) + C(x)\dfrac{du}{dx}  - A(x)u - q(x) \right] dx = 0.
\end{equation}
Затем выполним интегрирование по частям 
\begin{equation}
\label{eq:dif1int1}
\begin{matrix}
\left. \psi   D(x)\dfrac{du}{dx} \right] _0^1 +\\
\int\limits_0^1 \left[\left(  D(x)\dfrac{du}{dx}\right)\dfrac{d\psi (x)}{dx} + \psi (x) \left( C(x)\dfrac{du}{dx}  -  A(x)u - q(x)\right)  \right]  dx = 0.\\
\end{matrix}
\end{equation}
Учтём граничное условие (\ref{eq:dif1bc}) и получим окончательно интегральное уравнение эквивалентное исходному дифференциальному уравнению (\ref{eq:dif1}) c граничными условиями (\ref{eq:dif1bc})
\[\left. \psi a_0 u \right| _0 - \left. \psi a_1 u \right|_1 +\]
\begin{equation}
\label{eq:dif1int1bc}
\int\limits_0^1 \left[\left(  D(x)\dfrac{du}{dx}\right)\dfrac{d\psi (x)}{dx} + \psi (x) \left( C(x)\dfrac{du}{dx}  -  A(x)u - q(x)\right)  \right]  dx = 0.
\end{equation}

\subsubsection{Получение системы алгебраических уравнений}

Получим матричное уравнение с помощью метода Галёркина. Для этого подставим пробную функцию (\ref{eq:psi}) и её производную (\ref{eq:psi}), а также аппроксимацию искомого решения (\ref{eq:appr1}) и её производную  (\ref{eq:apprdif}) в интегральное уравнение (\ref{eq:dif1int1bc}). Затем умножим это уравнение на пробную функцию (\ref{eq:psi}), $i=1,2,\ldots,n$ - $n$ раз и вычислим интегралы. В результате и получим систему алгебраических уравнений размерности $n\text{x}n$, $i$ -тая строка которого имеет вид 
\begin{equation}
\label{eq:dif1int20} 
\begin{matrix}
\psi_1^+(x_1) a_0 y(x_1) - \psi_n^-(x_n) a_1 y(x_n) + \\
\int\limits_{e(x_{ij})} \dfrac{d\psi_i}{dx} D(x)
 \sum\limits_{j=1}^n [ \Theta ( x_j - x) y_{\bar{x}}(x_j) +  \Theta (x - x_j)y_x(x_j)] dx +\\
\int\limits_{e(x_{ij})}   \psi_i(x)  C(x) [ \Theta ( x_j - x) y_{\bar{x}}(x_j) +  \Theta (x - x_j)y_x(x_j)] dx - \\ 
\int\limits_{e(x_{ij})}  \psi_i(x) A(x) \left[y(x_i) + 
\sum\limits_{i = 1}^n ( x - x_i)[\Theta ( x_j - x) y_{\bar{x}}(x_j) +  \Theta (x -x_j) y_x(x_j) ]\right] dx  \\
=\int\limits_{e(x_{ij})}  \psi_i(x) q(x) dx.\\
\end{matrix}
\end{equation}
Здесь вычисление интегралов производится по окрестности $j$ - того узла $i$ - той строки $e(x_{ij})$, причём шаги назад из первого узла и вперёд из последнего узла не делаются (рисунок \ref{fig:Fig4}), поэтому окрестности узлов с ненулевыми матричными коэффициентами находятся в узле на диагонали и примыкающими к ней справа и слева узлами, т.е. для всех строк $i$ 
\[e(x_{ij}) \in \left\lbrace 
\begin{matrix}
[x_1, x_1 + h_1^+],& j=1,\\
[x_j-h_j^- ,x_j + h_j^+ ],& 1<j<n,\\
[x_n - h_n^-, x_n ],& j=n.\\
\end{matrix}\right. 
\] 

\subsubsection{Представление матричных коэффициентов в удобном для вычислений виде}
\label{matr_coeff}
Перепишем систему алгебраических уравнений (\ref{eq:dif1int20} ) в удобном для дальнейших вычислений виде
\begin{equation}
\label{eq:dif1int2} 
\begin{matrix}
\dfrac{2}{(h_1^+)^2} a_0 y_1  - \dfrac{2}{(h_n^-)^2} a_1 y_n  + \\
\int\limits_{e(x_{ij})} \dfrac{d\psi_i}{dx} D(x)
\left(  \Theta ( x_i-x) \dfrac{y_i-y_{i-1}}{h_i^-} +  \Theta (x-x_i)\dfrac{y_{i+1}-y_i}{h_i^+}\right)  dx +\\
\int\limits_{e(x_{ij})}   \psi_i(x)  C(x) \left(  \Theta ( x_i-x) \dfrac{y_i-y_{i-1}}{h_i^-} +  \Theta (x-x_i)\dfrac{y_{i+1}-y_i}{h_i^+}\right) dx - \\ 
\int\limits_{e(x_{ij})}  \psi_i(x) A(x) \left[y_i + 
 ( x - x_i)\left( \Theta ( x_i-x) \dfrac{y_i-y_{i-1}}{h_i^-} +  \Theta (x-x_i)\dfrac{y_{i+1}-y_i}{h_i^+} \right) \right]  dx  \\
=\int\limits_{e(x_{ij})}  \psi_i(x) q(x) dx.\\
\end{matrix}
\end{equation}
РџСЂРё интегрировании РїРѕ окрестности  $i$ - того узла учтём, что сетка узлов может быть адаптирована Рє задаче, Рё шаги вправо $h_i^-$ Рё влево $h_i^+$ РѕС‚ $i$ - того узла РјРѕРіСѓС‚ быть разными. Вычислим матричные коэффициенты построчно. РџСЂРё вычислении коэффициентов СѓРґРѕР±РЅРѕ пользоваться для наглядности СЂРёСЃСѓРЅРєРѕРј \ref{fig:Fig4}. РР· (\ref{eq:dif1int2}) РІРёРґРЅРѕ, что матрица трёхдиагональная.

\subsubsection{Первая строка}
Получим отличные от нуля коэффициенты первой строки матрицы $f_{1j}$. Вклад в  $f_{1j}$ дают только столбцы с $j=1$ и $j=2$ (рисунок \ref{fig:Fig4} (а)). Для упрощения записи выкладок введём новые обозначения
\[
 y_{\bar{xi}} \equiv y_{\bar{x}}(x_j),\qquad  y_{xi} \equiv y_{x}(x_j).
\]

Выпишем первое уравненние системы уравнений (\ref{eq:dif1int2}): 
\[
\dfrac{2}{(h_1^+)^2} a_0 y_1 + 
\int \limits_0^{h_1^+} \left( - \dfrac{2}{(h_1^+)^2}\right)  D(x) \dfrac{y_2-y_1}{h_1^+}dx + \\
\int \limits_0^{h_1^+} \psi_1^+(x) C(x) \dfrac{y_2-y_1}{h_1^+}dx -\]
\begin{equation}
\label{eq:i1}
\int \limits_0^{h_1^+} \psi_1^+(x) A(x) \left[y_1 + (x-x_1) \dfrac{y_2-y_1}{h_1^+}\right] dx.
\end{equation}
Обозначим
\[
D_i^- =  \int \limits_{x_i-h_i^-}^{x_i} \dfrac{2}{(h_i^-)^3} D(x) dx, \,\,\,
D_i^+ =  \int \limits_{x_i}^{x_i+h_i^+}  \dfrac{2}{(h_i^+)^3} D(x) dx,  
\]
\[
C_i^- = \int \limits_{x_i-h_i^-}^{x_i} \dfrac{1}{h_i^-} \psi_i^+(x) C(x) dx, \,\,\,
C_i^+ = \int \limits_{x_i}^{x_i+h_i^+} \dfrac{1}{h_i^+} \psi_i^+(x) C(x) dx, 
\] 
\[
A_i^- = \int \limits_{x_i-h_i^-}^{x_i} \psi_i^-(x) A(x) dx, \,\,\,
A_i^+ = \int \limits_{x_i}^{x_i+h_i^+} \psi_i^+(x) A(x) dx,
\]
\[
A_{ix}^- = \int \limits_{x_i-h_i^-}^{x_i} \dfrac{1}{h_i^-} \psi_i^-(x) A(x)(x-x_i) dx, \,\,\,
A_{ix}^+ = \int \limits_{x_i}^{x_i+h_i^+} \dfrac{1}{h_i^+} \psi_i^+(x) A(x)(x-x_i) dx.
\]
Перепишем (\ref{eq:i1}) в этих обозначениях
\[
\dfrac{2}{(h_1^+)^2} a_0 y_1 - D_1^+(y_2-y_1) + C_1^+(y_2-y_1) - A_1^+y_1 - A_{1x}^+(y_2-y_1).
\]

Таким образом, отличные от нуля коэффициенты первой строки выражаются через интегралы по окрестности первого узла $[0,h_1^+]$ и имеют вид
\begin{equation}
\label{eq:ij11}
f_{11}=\dfrac{2}{(h_1^+)^2} a_0  +  D_1^+ - C_1^+ - A_1^+ + A_{1x}^+,
\end{equation}
\begin{equation}
\label{eq:ij12}
f_{12}= - D_1^+ + C_1^+ - A_{1x}^+.
\end{equation}

\subsubsection{Последняя строка}
Получим отличные от нуля коэффициенты первой строки матрицы $f_{nj}$. Вклад в  $f_{nj}$ дают только столбцы с $j=n-1$ и $j=n$ (рисунок \ref{fig:Fig5}).

Граничные условия дают вклад только в коэффицент $f_{nn}$: 
\[-\dfrac{2}{(h_n^-)^2} a_1 y_n. \] 
Выполним интегрирование в (\ref{eq:dif1int2}) для последней строки: 
\[
\int \limits_{x_n-h_n^-}^{x_n} \dfrac{2}{(h_n^-)^2}  D(x) \dfrac{y_n-y_{n-1}}{h_n^-}dx + \\
\int \limits_{x_n-h_n^-}^{x_n} \psi_n^-(x) C(x) \dfrac{y_n-y_{n-1}}{h_n^-}dx - \\
\]
\begin{equation}
\label{eq:in}
\int \limits_{x_n-h_n^-}^{x_n}  \psi_n^-(x) A(x) \left[y_n + (x-x_n) \dfrac{y_n-y_{n-1}}{h_n^-}\right] dx.
\end{equation}

Таким образом, отличные от нуля коэффициенты последней строки выражаются через интегралы по окрестности последнего узла $[x_n-h_n^-, x_n]$ и имеют вид
\begin{equation}
\label{eq:ijnn}
f_{nn}= - \dfrac{2}{(h_n^-)^2} a_1  +  D_n^- + C_n^- + A_n^- + A_{nx}^-,
\end{equation}
\begin{equation}
\label{eq:ijn1}
f_{n,n-1}= - D_n^- + C_n^- - A_{nx}^-.
\end{equation}

\subsubsection{Остальные строки}
Граничные условия не дают вкладов в эти коэффициенты. Вклад в  $f_{ij}$ для $i=2,3,\ldots,n-1$ дают только столбцы с $j=i-1$, $j=i$ и $j=i+1$  (рисунок \ref{fig:Fig4} (б)).  Коэффициенты вычисляются интегрированием по отрезкам $[x_{i−1},x_i]$ и $[x_i, x_{i+1} ]$. Чтобы подчеркнуть, что вычисляются коэффициенты $i$ - той стоки, пределы в интегралах обозначены как шаг назад или шаг вперёд из $i$ - того узла.

Выполним интегрирование в (\ref{eq:dif1int2}) для этих строк: 
\[
\dfrac{h_i^-}{2\hbar_i}\int \limits_{x_i-h_n^-}^{x_i} \dfrac{2}{(h_i^-)^2}  D(x) \dfrac{y_i-y_{i-1}}{h_n^-}dx + \\
\dfrac{h_i^+}{2\hbar_i}\int \limits_{x_i}^{x_i+h_1^+} \left( - \dfrac{2}{(h_i^+)^2}\right)  D(x) \dfrac{y_{i+1}-y_i}{h_i^+}dx +
\]\[
\dfrac{h_i^-}{2\hbar_i}\int \limits_{x_i-h_i^-}^{x_i} \psi_i^-(x) C(x) \dfrac{y_i-y_{i-1}}{h_i^-}dx + \\
\dfrac{h_i^+}{2\hbar_i}\int \limits_{x_i}^{x_i+h_1^+}  \psi_i^+(x) C(x) \dfrac{y_{i+1}-y_i}{h_i^+}dx -\]
\[
\dfrac{h_i^-}{2\hbar_i}\int \limits_{x_i-h_i^-}^{x_i}  \psi_i^-(x) A(x) \left[y_i + (x-x_i) \dfrac{y_i-y_{i-1}}{h_i^-}\right] dx - \]
\[
\dfrac{h_i^+}{2\hbar_i}\int \limits_{x_i}^{x_i+h_1^+}  \psi_1^+(x) A(x) \left[y_i + (x-x_i) \dfrac{y_{i+1}-y_i}{h_i^+}\right] dx.
\]

Перепишем это выражение в новых обозначениях
\[
\dfrac{h_i^-}{2\hbar_i} D_i^-(y_i-y_{i-1}) - \dfrac{h_i^+}{2\hbar_i} D_i^+(y_{i+1}-y_i)+ 
\dfrac{h_i^-}{2\hbar_i} C_i^-(y_i-y_{i-1}) + \dfrac{h_i^+}{2\hbar_i} C_i^+(y_{i+1}-y_i) 
\]
\[
-\left( \dfrac{h_i^-}{2\hbar_i} A_i^- + \dfrac{h_i^+}{2\hbar_i} A_i^+ 
+ \dfrac{h_i^-}{2\hbar_i} A_{ix}^- - \dfrac{h_i^+}{2\hbar_i} A_{ix}^+ \right)  y_i
+\dfrac{h_i^-}{2\hbar_i} A_{ix}^- y_{i-1} - \dfrac{h_i^+}{2\hbar_i} A_{ix}^+ y_{i+1} .
\]
Группируя слагаемые этого выражения с общими множителями $y_i$, $y_{i-1}$ и $y_{i+1}$, получим коэффициенты главной диагонали для $i=2,3,\ldots,n-1$ 
\[f_{ii}= \dfrac{h_i^-}{2\hbar_i} D_i^- + \dfrac{h_i^+}{2\hbar_i} D_i^+
+ \dfrac{h_i^-}{2\hbar_i} C_i^- - \dfrac{h_i^+}{2\hbar_i} C_i^+\]

\begin{equation}
\label{eq:ii}
-  \dfrac{h_i^-}{2\hbar_i} A_i^- - \dfrac{h_i^+}{2\hbar_i} A_i^+ -
\dfrac{h_i^-}{2\hbar_i} A_{ix}^- + \dfrac{h_i^+}{2\hbar_i} A_{ix}^+;
\end{equation}
коэффициенты под главной диагональю для строк $i=2,3,\ldots,n-1$ :
\begin{equation}
\label{eq:im}
f_{i,i-1} = -  \dfrac{h_i^-}{2\hbar_i} D_i^- - \dfrac{h_i^-}{2\hbar_i} C_i^- +
\dfrac{h_i^-}{2\hbar_i} A_{ix}^- ;
\end{equation}
коэффициенты над главной диагональю для строк $i=2,3,\ldots,n-1$ получаем:
\begin{equation}
\label{eq:ip}
f_{i,i+1} = -  \dfrac{h_i^+}{2\hbar_i} D_i^+ - \dfrac{h_i^+}{2\hbar_i} C_i^+ +
\dfrac{h_i^+}{2\hbar_i} A_{ix}^+ ;
\end{equation}

\subsubsection{Правая часть}

Правая часть системы уравнений (\ref{eq:dif1int2}) при произвольной нагрузке $q(x)$ и c меняющимся шагом дискретизации для первого и последнего узлов даётся интегралами
\begin{equation}
\label{eq:r1}
Q_1 = \int\limits_0^{h_1^+} \varphi_1^+(x) q(x) dx,
\end{equation}
\begin{equation}
\label{eq:rn}
Q_n = \int\limits_{x_n-h_n^-}^{x_n} \varphi_n^-(x)  q(x) dx.
\end{equation}
Правая часть для внутренних узлов с номерми $1<i<n$ даётся интегралами 
\begin{equation}
\label{eq:difq}
Q_i = \dfrac{h_i^-}{2\hbar_i}\int\limits_{x_i-h_i^-}^{x_i} \psi_i^-(x) q(x) dx +
\dfrac{h_i^+}{2\hbar_i}\int\limits_{x_i}^{x_i+h_i^+} \psi_i^+(x)  q(x) dx.
\end{equation}

\subsubsection{Подводим итоги}
В линейном дифференциальном уравнении коэффициенты уравнения зависят от координаты $x$, но не от самого искомого решения. В слабой форме матричные коэффициенты в этом случае находятся инегрированием  функциональных коэффициентов уравнения по окрестности узлов, и таким образом, коэффициенты усредняются по окрестности узла. Это расширяет класс решаемых задач по сравненнию с коэффициентной формой, поскольку теперь коэффициенты могут быть кусочно непрерывными.

Такое интегрирование можно выполнить аналитически, если коэффициенты заданы в аналитическом виде, или численно. В первом случае программа будет предназначена для конретной задачи и будет работать быстро, так как интегрировать функциональные коэффициенты в окрестности каждого узла не потребуется. Во втором случае функциональные коэффициенты уравнения можно задавать на входе программы, но время счёта будет значительно большим, чем в первом случае.

Матрица по-прежнему оказывается ленточной, и каждое уравнение связывает не более трех неизвестных в соседних узлах. Для неравномерной сетки с изменяющимся шагом дискретизации матрица получается несимметричной, в отличие от случая равномерной сетки с постоянным шагом дискретизации. 

\subsection{Пример вычислительной программы}

Р’ Приложении приведен текст вычислительной программы fem4.cpp, написанной РЅР° языке РЎ++ , РІ котором решается задача (\ref{eq:dif1}), (\ref{eq:dif1bc}) Рѕ стационарной одномерной диффузии (теплопроводности) РІ составном стержне. Функциональные коэффициенты задаются кусочно постоянными функциями Рё скачком меняются РЅР° границах раздела. Рсточник частиц (тепла) - линейная функция. Р’ программе использован решатель системы линейных алгебраических уравнений методом разложения РЅР° нижнюю Рё верхнюю треугольные матрицы СЃ выбором главного элемента для уменьшения ошибки. 

Рекомендуется экспериментировать с программой, задавая различные функциональные коэффициенты и источники. Проверку решения можно выполнить, написав программу, в которой полученное решение подставляется в исходное уравнение и выполнятся его численное дифференцирование.  

 

\section{Общий вывод}
Задачи, решение которых описывается непрерывными функциями, удовлетворяющими дифференциалльным уравнениям, РЅРѕСЃСЏС‚ название континуальных. Метод конечных элементов, так же как Рё РґСЂСѓРіРёРµ численные методы, РїРѕ существу приближенно заменяет континуальную задачу РЅР° дискретную. РџРѕРјРёРјРѕ континуальных задач схема метода конечных СЌР
Соседние файлы в папке TEX