МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего образования «Самарский национальный исследовательский университет имени академика С.П. Королева» (Самарский университет)
Институт информатики, математики и электроники Факультет информатики Кафедра технической кибернетики
Отчет по курсовой работе Дисциплина: «Уравнения математической физики»
Аналитическое решение краевых задач математической физики
Вариант №8
Студенты группы 6407	Анурин А.С. Гринина В.С. Попов Д.С.
Проверил	Дегтярев А.А.

че как

Стили

В этом документе много всяких полезных стилей, которые начинаются с _. Этот документ использует только эти стили и выглядит збс.

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

Потыкай на разные части этого дока и посмотри, какие стили что юзает.

Можно скопировать стили в существующий док через «Style Organizer», а можно открыть этот файл и потом сохранить уже как обычный docx.

Рисунок 1 — Иллюстрация-хуелюстрация, которая не просто текст, а «Caption» к картинке, и поэтому сама пронумеровалась

Рисунок 2

Референсы

Рисунок 1 <- это вордовский cross-reference, который магическим образом отсылается к картинке, автоматически перенумеровывается, етц.

То же самое можно делать с табличками.

Формулы

— это найс формула сторонней проги MathType, которая ставится в комбо к ворду. Формулы выглядят найс, прога ест тех, все автоматически нумеруется, можно ссылаться из текста, красота.

Библиография

Самый сок. [1] – это вордовское цитирование. В конце дока есть библиография, которая генерится полностью сама. Она почти соответствует сухановским примерам. Сухановские примеры друг другу не соответствуют, поэтому хз. Если есть желание пофиксить Можно пилить источники типов «Book» и «Web Site», остальное я не трогал.

Челик сделал почти все, почитай:

https://det-random.livejournal.com/28819.html

Рисунок 3

Есть геморрой с установкой этого добра. https://gitea.abra.me/svxf/TIS-100/src/branch/master/%d0%be%d0%b1%d1%89%d0%b5%d0%b5/tomsk3.XSL -- это ссылка на файл со стилем библиографии в репе. Ты качаешь его себе и кладешь в правильную директорию. На маке для свежих вордов это «/Applications/Microsoft Word.app/Contents/Resources/Style/»

для Word 2010 — в директорию [System Volume]:\Program Files\Microsoft Office\Office 14\Bibliography\Style;

для Word 2013 — в [System Volume]:\Users\[User Name]\AppData\Roaming\Microsoft\Bibliography\Style

рестартишь ворд. В списке стилей появляется томск стайл

Содержимому библиографии ты ставишь стиль «Bibliography,_Библиография», радуешься, все должно работать.

Вариант 8

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

В цилиндре конечной длины находится диффундирующее вещество, концентрация частиц которого в момент времени описывается функцией:

где — числовая ось, направленная вдоль оси цилиндра.

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

где — концентрация вещества во внешней по отношению к цилиндру среде, — мембранный коэффициент диффузии.

Боковая поверхность цилиндра является непроницаемой.

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

Концентрацию вещества считать одинаковой во всех точках поперечного сечения цилиндра в любой момент времени.

При проведении расчетов использовать значения параметров и выражение функции, указанные преподавателем:

м,

м2/с,

кг/м3,

м2/с,

с,

,

кг/м3.

Реферат

Отчет по курсовой работе: 35 c., 5 рисунков, 2 таблицы, 5 источников, 3 приложения.

УРАВНЕНИЯ МАТЕМАТИЧЕСКОЙ ФИЗИКИ, КРАЕВАЯ ЗАДАЧА, УРАВНЕНИЕ ДИФФУЗИИ, МЕТОД РАЗДЕЛЕНИЯ ПЕРЕМЕННЫХ, СОБСТВЕННЫЕ ФУНКЦИИ ОПЕРАТОРА ЛАПЛАСА, РЯД ФУРЬЕ, ОЦЕНКА ОСТАТКА РЯДА.

Целью курсовой работы является получение решения краевой задачи диффузии для цилиндра конечной длины в виде разложения в ряд Фурье по собственным функциям оператора Лапласа и создание компьютерной программы для расчета функции-решения с заданной точностью.

Для получения аналитического решения краевой задачи использован метод разделения переменных (метод Фурье). Решение задачи получено в виде бесконечного ряда Фурье-Бесселя. Получена оценка остатка ряда.

Разработана компьютерная программа, обеспечивающая расчет и графическую визуализацию концентрации вещества в цилиндре на временном промежутке. Для контроля погрешности усечения бесконечного ряда использована оценка остатка ряда.

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

Программа написана на языке Python 3.7 в среде разработки Pycharm 2018, операционная система macOS Mojave.

СОДЕРЖАНИЕ

Введение	3

1 Математическая постановка задачи	3

2 Аналитическое решение краевой задачи диффузии методом разделения переменных	3

3 Расчет собственных чисел оператора Лапласа	3

4 Расчет интегральных коэффициентов ряда Фурье	3

5 Исследование сходимости ряда Фурье. Оценка остатка ряда	3

6 Исследование практической пригодности оценки остатка ряда с помощью вычислительных экспериментов	3

7 Сценарий использования программы	3

Заключение	3

Список использованных источников	3

Приложение А Код интерфейса оконного приложения	3

Приложение Б Код вычислительного модуля	3

Приложение В Код модуля символьного исчисления	3

Введение

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

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

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

Суть метода разделения переменных состоит в факторизации по каждой независимой переменной функции, определяющей решение уравнения математической физики. Далее осуществляется переход к так называемой задаче Штурма-Лиувилля, решение которой приводит к получению собственных функций и соответствующих им собственных чисел оператора Лапласа. Затем решение исходной задачи ищется в виде ряда Фурье по этим собственным функциям.

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

Математическая постановка задачи

Рассмотрим цилиндр конечной длины, концентрация вещества которого в точке пространства в момент времени определяется функцией .

Математическая модель будет выглядеть следующим образом:

Сделаем замену [2] так, чтобы граничные условия задачи стали однородными относительно .

Очевидно, мы можем взять .

Тогда после замены итоговая математическая модель будет иметь вид:

Аналитическое решение краевой задачи диффузии методом разделения переменных

Поиском аналитического решения занимался студент Гринина В.С.

Ищем решение задачи в виде ряда по собственным функциям задачи Штурма-Лиувилля [3]:

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

Тогда первое уравнение модели примет вид:

Разделяя переменные, получим:

где , так как левая часть зависит только от , а правая — от .

Заметим, что решение нашей задачи относительно сводится к решению задачи Штурма-Лиувилля:

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

Из характеристического уравнения задачи получим:

Найдем общий вид решения и его первой производной:

Подставим уравнения и в краевые условия и получим:

Решив данную систему, получим уравнение:

Введем две замены:

Упростив уравнение , получим:

Уравнение не решается аналитически. Его численное решение представлено в разделе 3.

Подставим в найденные численно собственные числа и получим выражение для собственных функций:

Теперь рассмотрим уравнение относительно функции . Получим следующее уравнение:

Решим это уравнение методом разделения переменных:

где — интегральный коэффициент ряда Фурье. Нахождение этих коэффициентов представлено в разделе 4.

Итоговая формула расчета концентрации вещества:

Расчет собственных чисел оператора Лапласа

Расчетом собственных чисел оператора Лапласа занимался студент Гринина В.С.

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

Рисунок 4 показывает решения этого уравнения с заданными параметрами.

Рисунок 4 — Решения уравнения

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

Проверим условия сходимости метода Ньютона [4], если мы задаем начальное приближение на отрезке :

не меняет своего знака на ;

;

.

Для уравнения все эти условия выполняются. Решение уравнения будем искать следующим итеративным методом:

Начальное приближение для поиска -го значения будем выбирать слева от полюсов с учетом погрешности следующим образом:

Рисунок 5 показывает график функции с отмеченными корнями и асимптотами.

Рисунок 5 — График функции

Таблица 1 показывает результаты использования метода Ньютона для нахождения коэффициентов .

Таблица 1 — Значения корней функции

0	1.532502	10	32.307315	20	63.394732	30	94.647633
1	4.597943	11	35.403797	21	66.514871	31	97.777691
2	7.664660	12	38.503570	22	69.636431	32	100.908363
3	10.733415	13	41.606420	23	72.759288	33	104.039604
4	13.804845	14	44.712127	24	75.883335	34	107.171372
5	16.879445	15	47.820472	25	79.008471	35	110.303630
6	19.957554	16	50.931240	26	82.134607	36	113.436343
7	23.039371	17	54.044232	27	85.261661	37	116.569481
8	26.124969	18	57.159259	28	88.389560	38	119.703016
9	29.214319	19	60.276146	29	91.518238	39	122.836920

Расчет интегральных коэффициентов ряда Фурье

Расчетом интегральных коэффициентов ряда Фурье занимался студент Анурин А.С.

Для множества ортогональных базисных функций найдем норму -го члена как:

Используя этот результат, выразим интегральный коэффициент ряда Фурье через и краевое условие:

Исследование сходимости ряда Фурье. Оценка остатка ряда

Сходимость ряда Фурье исследовал студент Попов Д.С.

Попробуем найти верхнюю оценку на сумму ряда . Вспомним найденное значение последовательности функций из :

Так как при , оценим:

Из уравнения :

Оценим сверху:

Из уравнения :

Заметим, что:

Тогда:

Учитывая, что из :

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

воспользуемся тождествами и и распишем :

Оценим получившееся выражение сверху:

то есть:

Пользуясь :

оценим:

Отсюда получается, что:

Так как в пределе , мы можем оценить и:

Подставив исходные значения и , оценим:

В итоге получаем:

Исследование практической пригодности оценки остатка ряда с помощью вычислительных экспериментов

Исследованием практической пригодности оценки ряда занимался студент Анурин А.С.

Получив оценку ряда, проведем исследование ее качества, сравнив теоретически предсказанное количество членов ряда , необходимое для достижения необходимой точности , с практически найденным количеством членов . Так как оценка ряда не зависит от координат и , нам придется посчитать ее только один раз. Напротив, практическое количество членов мы посчитаем в нескольких точках диапазона . Таблица 2 показывает найденные значения.

Таблица 2 — Количество членов в различных оценках остатка ряда

1	7	85	848	8476	84753
1	2	2	3	3	4
1	2	2	3	3	4
1	1	2	2	3	3
1	2	4	6	7	9
1	2	3	5	7	9
1	1	3	5	7	9
1	2	4	8	13	19
1	2	3	5	7	7
1	2	5	10	16	22
1	2	4	9	16	27
1	2	3	5	7	25
1	2	6	15	28	44

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

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

Сценарий использования программы

Реализацией программного решения занимался студент Анурин А.С.

В данной работе активно использовались программные инструменты на основе языка программирования Python 3. С помощью библиотеки символьного исчисления Sympy [5] был верифицирован процесс нахождения аналитического решения задачи. С помощью библиотеки Matplotlib [6] были созданы графики и иллюстрации. Была реализована программа численного моделирования процесса диффузии вещества в цилиндре с полунепроницаемыми мембранами.

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

Рисунок 6 — Интерфейс оконного приложения

Рисунок 6 иллюстрирует оконное приложение. Видно, что концентрация в нулевой момент времени совпадает с начальным условием из . Программа позволяет пользователю ввести желаемые начальные параметры и получить график поля концентрации вещества. Присутствует обработчик ошибок на случай, если пользователь введет некорректные данные. Рисунок 7 иллюстрирует такую ситуацию.

Рисунок 7 — Ввод некорректного значения

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

Рисунок 8 — Иллюстрация частного случая

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

Заключение

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

Была установлена сходимость ряда и найдена аналитическая оценка остатка ряда. Был произведен анализ соответствия этой оценки численным результатам.

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

Список использованных источников

1 Христос И. Библия [Текст] / Христос И., Искариот И. – Иерусалим: Римская империя, 33. – 123456 с.
2 Владимиров В.С. Уравнения математической физики: учебник для вузов [Текст] / Владимиров В.С., Жаринов В.В. – М.: Физико-математическая литература, 2000. – 399 с.
3 Тихонов А.Н. Уравнения математической физики: учебное пособие для университетов [Текст] / Тихонов А.Н., Самарский А.А. – М.: Наука, 1972. – 736 с.
4 Бахвалов Н.С. Численные методы: учебное пособие для физ.-мат. специальностей вузов [Текст] / Бахвалов Н.С., Жидков Н.П., Кобельков Н.М. – М.: Бином. Лаб. знаний, 2007. – 636 с.
5 SymPy: a Python library for symbolic mathematics. [Электронный ресурс] – 2018. – URL: https:/​/​docs.sympy.org/​latest/​index.html (дата обращения: 22.12.2018).
6 Matplotlib: a plotting library for the Python programming language [Электронный ресурс] – 2018. – URL: https:/​/​matplotlib.org/ (дата обращения: 22.12.2018).

Приложение А
Код интерфейса оконного приложения

import sys

from PyQt5.QtWidgets import QApplication, QGridLayout, QGroupBox, QLabel, QLineEdit, QMessageBox, QPushButton, \

QSizePolicy, QVBoxLayout, QWidget

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure

import solver

class App(QWidget):

def __init__(self):

super().__init__()

self.solver = solver.Solver()

self.grid = QGridLayout()

self.setLayout(self.grid)

self.resize(1200, 600)

self.plot = PlotCanvas(width=10, height=4)

self.grid.addWidget(self.plot, 1, 1, 1, 1)

param_box = QGroupBox()

param_vbox = QVBoxLayout()

param_vbox.addWidget(QLabel('Длина цилиндра l'))

self.l_field = QLineEdit('20')

self.l_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.l_field)

param_vbox.addWidget(QLabel('Коэффициент диффузии D'))

self.D_field = QLineEdit('0.6')

self.D_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.D_field)

param_vbox.addWidget(QLabel('Мембранный коэффициент диффузии H'))

self.H_field = QLineEdit('4')

self.H_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.H_field)

param_vbox.addWidget(QLabel('Момент времени t'))

self.t_field = QLineEdit('0')

self.t_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.t_field)

param_vbox.addWidget(QLabel('Точность поиска собственных значений'))

self.eps_field = QLineEdit('1e-9')

self.eps_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.eps_field)

param_vbox.addWidget(QLabel('Количество членов ряда в суммировании'))

self.sum_count_field = QLineEdit('100')

self.sum_count_field.setStyleSheet("color: black;")

param_vbox.addWidget(self.sum_count_field)

calc_button = QPushButton('Рассчитать')

calc_button.pressed.connect(self.calc)

param_vbox.addWidget(calc_button)

param_vbox.addStretch(1)

param_box.setLayout(param_vbox)

self.grid.addWidget(param_box, 1, 2, 1, 1)

self.calc()

def show_error(self, text):

msg = QMessageBox()

msg.setIcon(QMessageBox.Information)

msg.setText(text)

msg.setWindowTitle("Ошибка расчетов")

msg.setStandardButtons(QMessageBox.Ok)

msg.exec_()

def calc(self):

try:

l_str = self.l_field.text()

l_val = float(l_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {l_str}')

return

try:

D_str = self.D_field.text()

D_val = float(D_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {D_str}')

return

try:

H_str = self.H_field.text()

H_val = float(H_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {H_str}')

return

try:

t_str = self.t_field.text()

t_val = float(t_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {t_str}')

return

try:

eps_str = self.eps_field.text()

eps_val = float(eps_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {eps_str}')

return

try:

sum_count_str = self.sum_count_field.text()

sum_count_val = int(sum_count_str)

except Exception as e:

self.show_error(f'Некорректный формат числа: {sum_count_str}')

return

if not (

1e-3 <= l_val <= 1e+3 and

1e-3 <= D_val <= 1e+3 and

1e-3 <= H_val <= 1e+3 and

0 <= t_val <= 1e+3 and

1e-20 <= eps_val <= 1e+3 and

1 <= sum_count_val <= 1e+3

):

self.show_error(f'Некорректные входные данные')

return

self.solver.set_params(l_val, D_val, H_val, t_val, eps_val, sum_count_val)

plot_x, plot_y = self.solver.calc()

self.plot.plot(plot_x, plot_y)

class PlotCanvas(FigureCanvas):

def __init__(self, parent=None, width=4, height=4, dpi=100):

fig = Figure(figsize=(width, height), dpi=dpi)

self.axes = fig.add_subplot(111)

FigureCanvas.__init__(self, fig)

self.setParent(parent)

FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)

FigureCanvas.updateGeometry(self)

def plot(self, plot_x, plot_y):

self.axes.clear()

self.axes.plot(plot_x, plot_y)

self.axes.set_xlabel('$x, \\mathrm{м}$')

self.axes.set_ylabel('$u$')

self.axes.set_title('Поле концентрации вещества в цилиндре, $\\frac{\\mathrm{кг}}{\\mathrm{м}^3}$')

self.axes.set_ylim(0, None)

self.axes.grid(True)

self.draw()

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = App()

ex.show()

sys.exit(app.exec_())

Приложение Б
Код вычислительного модуля

import datetime

import pickle

import numpy as np

class Solver:

def __init__(self):

self.l = None

self.D = None

self.H = None

self.t = None

self.eps = 1e-9

self.sum_count = 100

self.alphas = np.zeros(0)

def find_root(self, index):

C = self.H * self.l / 2

l = np.pi * index + self.eps

r = np.pi * index + np.pi / 2 - self.eps

while True:

m = (l + r) / 2

val = np.tan(m) - C / m

if abs(val) < self.eps or abs(r - l) < self.eps:

return m

if val > 0:

r = m

else:

l = m

def set_params(self, l, D, H, t, eps, sum_count):

self.l = l

self.D = D

self.H = H

self.t = t

self.eps = eps

self.sum_count = sum_count

self.alphas = np.array([self.find_root(i) for i in range(self.sum_count)])

def calc(self):

plot_x = np.linspace(0, self.l, 1000)

start_dt = datetime.datetime.utcnow()

plot_y = np.array([self.calc_single(x) for x in plot_x])

end_dt = datetime.datetime.utcnow()

print((end_dt - start_dt) / 1000)

return plot_x, plot_y

# noinspection PyTypeChecker

def calc_single(self, x: float) -> float:

if self.l is None:

raise ValueError('Not initialized')

# @formatter:off

return np.sum(

(

-4 * np.pi ** 2 * (

self.H * self.l * np.sin(2 * self.alphas * x / self.l)

+ 2 * self.alphas * np.cos(2 * self.alphas * x / self.l)

) * (

-self.H * self.l * np.cos(2 * self.alphas)

+ self.H * self.l

+ 2 * self.alphas * np.sin(2 * self.alphas)

) * np.exp(

-4 * self.D * self.alphas ** 2 * self.t / self.l ** 2

) / (

5 * (

self.alphas ** 2

- np.pi ** 2

) * (

4 * self.H ** 2 * self.alphas * self.l ** 2

- self.H ** 2 * self.l ** 2 * np.sin(4 * self.alphas)

- 4 * self.H * self.alphas * self.l * (np.cos(4 * self.alphas) - 1)

+ 4 * self.alphas ** 2 * (

4 * self.alphas

+ np.sin(4 * self.alphas)

)

)

)

)

)

# @formatter:on

Приложение В
Код модуля символьного исчисления