Uploaded by Mort Dast

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

advertisement
СОДЕРЖАНИЕ
ВВЕДЕНИЕ……………………………………………………………..……..5
1.Постановка задачи……………………………………………………….….8
1.1 Постановка краевых задач для обыкновенных дифференциальных
уравнений………………………………………………………………………...…..8
1.2 Постановка краевой задачи для уравнения теплопроводности...........9
2.Описание
методов
решения
краевых
задач………..………………………………………………………………....….….11
2.1
Метод
конечных
разностей
решения
краевых
задач
для
обыкновенного дифференциального уравнения……………………………..…...11
2.2
Метод
решения
краевой
задачи
для
уравнения
теплопроводности ………………………………………………………………….14
3. Решение тестовых задач……………………………………....…………..18
3.1 Аналитическое решение модельной задачи………………………...18
3.2 Проверка метода прогонки модельной задачи……………………...19
3.3 Проверка метода прогонки для основной задачи…………………...20
3.4
Составление
модельной
краевой
задачи
для
уравнения
теплопроводности.………………………………………………………………….22
4. Результаты численных экспериментов……….........................................24
4.1 Решение краевых задач для обыкновенного дифференциального
уравнения.……………………………………………………….………….….…...24
4.2 Решение краевых задач для уравнения теплопроводности…...…....28
ЗАКЛЮЧЕНИЕ.…………………………..…………………………………35
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ………………………..36
ПРИЛОЖЕНИЕ А.…………………………………………………………..37
ПРИЛОЖЕНИЕ Б………………………...……………………………….…40
1
ВВЕДЕНИЕ
Появление
и
непрерывное
совершенствование
электронных
вычислительных машин (ЭВМ) привело к революционному преобразованию
науки,
в
особенности
математики.
Изменилась
технология
научных
исследований, колоссально увеличились возможности теоретического изучения,
прогноза сложных процессов, проектирования инженерных конструкций.
Решение крупных научно-технических проблем, примерами которых могут
служить проблемы овладения ядерной энергией и освоения космоса, стало
возможным лишь благодаря применению математического моделирования и
новых численных методов, предназначенных для ЭВМ.
В настоящее время можно говорить, что появился новый способ
теоретического
исследования
сложных
процессов,
допускающих
математическое описание ̶ вычислительный эксперимент, т.е. исследование
естественнонаучных проблем средствами вычислительной математики.
Вычислительную математику определяют в широком смысле этого
термина как раздел математики, включающий круг вопросов, связанных с
использованием ЭВМ, и в узком смысле ̶ как теорию численных методов и
алгоритмов решения поставленных математических задач.
Общим для всех численных методов является сведение математической
задачи к конечномерной. Это чаще всего достигается дискретизацией исходной
задачи, т. е. переходом от функций непрерывного аргумента к функциям
дискретного аргумента. После дискретизации исходной задачи надо построить
вычислительный алгоритм, т. е. указать последовательность арифметических и
логических действий, выполняемых па ЭВМ и дающих за конечное число
действий решение дискретной задачи. Полученное решение дискретной задачи
принимается за приближенное решение исходной математической задачи.
При решении задачи на ЭВМ мы всегда получаем не точное решение
исходной задачи, а некоторое приближенное решение. Чем же обусловлена
2
возникающая
погрешность?
Можно
выделить
три
основные
причины
возникновения погрешности при численном решении исходной математической
задачи. Прежде всего, входные данные исходной задачи (начальные и граничные
условия, коэффициенты и правые части уравнений) всегда задаются с некоторой
погрешностью. Погрешность численного метода, обусловленную неточным
заданием входных данных, принято называть неустранимой погрешностью.
Далее, при замене исходной задачи дискретной задачей возникает погрешность,
называемая погрешностью дискретизации или, иначе, погрешностью метода.
Наконец, конечная разрядность чисел, представляемых в ЭВМ, приводит к
ошибкам округления, которые могут нарастать в процессе вычислений
Численные методы дают приближенное решение задачи. Это значит, что
вместо точного решения и (функции или функционала) некоторой задачи мы
находим решение у другой задачи, близкое в некотором смысле (например, по
норме) к искомому. Основная идея всех методов
̶
дискретизация или
аппроксимация (замена, приближение) исходной задачи другой задачей, более
удобной для решения на ЭВМ, причем решение аппроксимирующей задачи
зависит от некоторых параметров, управляя которыми, можно определить
решение с требуемой точностью [1].
Известные и хорошо зарекомендовавшие себя методы численного решения
задач Коши, такие как методы Эйлера, Рунге-Кутта, сформулированы
соответственно на основе квадратурных формул прямоугольников, трапеций,
Симпсона,
что
позволяет
использовать
для
оценки
погрешности
соответствующие оценки для квадратурных формул [2].
Численные методы решения краевых задач (КЗ) можно разделить на три
основных класса:
̶ конечно-разностные методы;
̶ методы стрельбы;
̶ вариационные методы, метод коллокаций и прочие.
3
В последний класс входят аналитические методы решения обыкновенных
дифференциальных уравнений (ОДУ).
Мы рассмотрим численные методы решения краевых задач для
обыкновенных
дифференциальных
уравнений
теплопроводности.
4
и
для
уравнения
1
Постановка задач
1.1
Постановка
краевых
задач
для
обыкновенных
дифференциальных уравнений
Методом конечных разностей(МКР) найти численное решение краевой
задачи на отрезке [a, b] в которой a=0, b=1:
𝑦 ′′ + 𝑝(𝑥)𝑦 ′ + 𝑞(𝑥)𝑦 = 𝑓(𝑥),
(1.1)
𝜇1 𝑦 ′ (𝑎) + 𝜇2 𝑦(𝑎) = 𝜇3 ,
(1.2)
𝜈1 𝑦 ′ (𝑏) + 𝜈2 𝑦(𝑏) = 𝜈3 .
(1.3)
Нужно решить аналитически модельную задачу на отрезке [0; 1],
записанной для линейного однородного дифференциального уравнения с
постоянными коэффициентами, заданными по третьему варианту из учебнометодического пособия [2]:
𝑚 = 0, 𝑛 = 3,
𝑝(𝑥) = 0, 𝑞(𝑥) = 3, 𝜇1 = ν1 , 𝜇2 = ν2 = 1, 𝜇3 = −0,2, ν3 = 0,6 .
Модельная краевая задача будет иметь вид:
𝑦 ′′ + 3𝑦 = 0 ,
y(0) = −0,2 ,
(1.4)
y(1) = 0,6 .
Необходимо решить задачу (1.4) аналитическим методом и методом
конечных разностей, а также построить графики функций. Они будут
использоваться для проверки данного метода. В программе должны выводится
близкие по точности графики разных методов.
Потом на отрезке [0;1] нужно решить основную задачу в которой:
5
𝑝(𝑥) =
𝛼1 +𝛼2 𝑥
𝑥 2 +1
, 𝑞(𝑥) =
𝛼3
√1−𝑥 2
, 𝜇1 = ν1 , 𝜇2 = ν2 = 1,
(1.5)
где 𝛼1 , 𝛼2 , 𝛼3 , 𝜇3 , ν3 имеют следующие значения [2]:
𝜇3 = −0,2, 𝜈3 = 0,6, 𝛼1 = 1 , 𝛼2 = 4 , 𝛼3 = 15.
Тогда основная задача примет вид:
𝑦 ′′ +
1+4𝑥
15
1+𝑥
√1−𝑥 2
𝑦′ +
2
𝑦 = 0,
y(0) = −0,2,
(1.6)
y(1) = 0,6.
Задачу (1.6) необходимо решить методом конечных разностей.
Постановка краевой задачи для уравнения теплопроводности
1.2
Дана краевая задача для одномерного уравнения теплопроводности вида
𝜕𝑢
𝜕𝑡
𝜇1
ν1
=𝑎
𝜕2 𝑢
𝜕𝑥 2
𝜕𝑢(𝑡,0)
𝜕𝑡
∂u(t,l)
∂t
, 𝑥 ∈ (0, 𝑙), 𝑡 > 0,
+ ν2 𝑢(𝑡, 0) = 𝜇3 ,
+ ν2 u(t, l) = ν3 ,
𝑢(𝑥, 0) = 𝜑(𝑥),
где
𝑎 = 1, 𝑙 = 1, 𝜑(𝑥) = u1 при 𝑥 ≤ 𝑙1 и 𝜑(𝑥) = u2 при 𝑥 > 𝑙1 . Согласно 3-
му варианту 𝑚 = 0, 𝑛 = 3,
𝑙1 = 0, u1 = 10, u2 = 60 , 𝜇1 = 1, 𝜇2 = 0, 𝜇3 = 0, ν1 = 0, ν2 = 1, ν3 = 10.
Тогда основная краевая задача (1.7) с данными значениями примет вид
𝜕𝑢
𝜕𝑡
=
𝜕2 𝑢
𝜕𝑥 2
, 𝑥 ∈ (0,1), 𝑡 > 0 ,
𝑢(0, 𝑥) = {
𝜕𝑢
𝜕𝑥
10,
60,
𝑥 ∈ [0],
𝑥 ∈ (0,1],
(𝑡, 0) = 0,
𝑢(𝑡, 1) = 10.
6
Данную краевую задачу необходимо решить методом конечных разностей
и построить графики распределения температуры в заданные моменты времени.
В качестве критерия окончание работы программы примем условие
max|𝑢𝑘𝑖+1 − 𝑢𝑘𝑖 | ≤ 0,00001.
𝑘
Для отладки программы, реализующий метод конечных разностей, нужно
рассматривать модельную задачу, составленную таким образом, чтобы её
решением являлась функция
2
𝑢̂(𝑡, 𝑥) = (𝑛 + 1)[cos(𝑚 + 1) 𝑥 + sin(𝑚 + 1) 𝑥]𝑒 −(𝑚+1) 𝑡 + 𝑚 + 𝑛
Согласно номеру варианта (3), значения параметров равны m = 0, n = 3[2].
Подставляя значения m и n в функцию, мы получили
𝑢̂(𝑥, 𝑡) = 4(𝑐𝑜𝑠(𝑥) + 𝑠𝑖𝑛(𝑥)) 𝑒 −𝑡 + 3.
2 Описание методов решения задач
2.1 Метод конечных разностей решения задач для ОДУ
Пусть на отрезке [a,b] необходимо найти численное решение линейного
дифференциального уравнения [3].
𝑦 ′′ + 𝑝(𝑥)𝑦 ′ + 𝑞(𝑥)𝑦 = 𝑓(𝑥),
(2.1)
удовлетворяющего краевым условиям
𝜇1 𝑦 ′ (𝑎) + 𝜇2 𝑦(𝑎) = 𝜇3 ,
(2.2)
𝜈1 𝑦 ′ (𝑏) + 𝜈2 𝑦(𝑏) = 𝜈3 .
(2.3)
причем µ12 + µ22 ≠ 0 и ν12 + ν22 ≠ 0.
Численное решение задач (2.1)-(2.3) состоит в нахождении приближенных
значений 𝑦0 , 𝑦1 , 𝑦2 … 𝑦𝑛 искомого решения y(x) в узлах разбиения отрезка [a,b]:
𝑥0 = 𝑎, 𝑥1 , 𝑥2 … 𝑥𝑛 = 𝑏.
Рассмотрим разбиение отрезка [a,b] равноотстоящем узлами
𝑥0 = 𝑎, 𝑥1 , 𝑥2 … 𝑥𝑛 = 𝑏,
с постоянным шагом ℎ =
𝑏−𝑎
𝑛
по формулам
7
𝑥𝑘 = 𝑥0 + 𝑘ℎ,
где 𝑘 = 1,2,3 … 𝑛.
Обозначим 𝑝𝑘 = 𝑝(𝑥𝑘 ), 𝑞𝑘 = 𝑞(𝑥𝑘 ),
𝑓𝑘 = 𝑓(𝑥𝑘 ). Производные искомой
функции 𝑦(𝑥) в каждом внутреннем узле 𝑥𝑘 методом конечных разностей(МКР)
можно аппроксимировать центрально – разностным соотношениями в
погрешностями аппроксимации порядка ℎ2 (формула Тейлора):
1
𝑦 ′ (𝑥𝑘 ) =
2ℎ
𝑦 ′′ (𝑥𝑘 ) =
=
1
ℎ2
(𝑦𝑘+1 − 𝑦𝑘−1 ) + 𝑂(ℎ2 ),
𝑦𝑘+1 −𝑦𝑘−1 𝑦𝑘 −𝑦𝑘−1
−
ℎ
ℎ
ℎ
(2.4)
+ 𝑂(ℎ2 ) =
(𝑦𝑘+1 − 2𝑦𝑘 + 𝑦𝑘−1 ) + 𝑂(ℎ2 ).
(2.5)
На концах отрезка [a,b] первые производные аппроксимируют с
погрешностью 𝑂(ℎ):
1
1
𝑦 ′ (𝑥0 ) = (𝑦1 − 𝑦0 ) + 𝑂(ℎ),
𝑦 ′ (𝑥𝑛 ) = (𝑦𝑛 − 𝑦𝑛−1 ) + 𝑂(ℎ),
ℎ
ℎ
(2.6)
Аппроксимация первой производной с погрешностью 𝑂(ℎ2 ) в узле 𝑥𝑖
имеет вид:
𝑦 ′ (𝑥𝑖 ) =
1
2ℎ
(−3𝑦𝑖 + 4𝑦𝑖+1− 𝑦𝑖+2 ),
Подстановка соотношений (2.4)-(2.6) в краевую задачу (2.1)-(2.3) приводит
ее к системе линейных алгебраических уравнений, которая называется
разностной схемой [4]:
1
𝑝𝑘
(𝑦
)
(𝑦
−
2𝑦
+
𝑦
+
− 𝑦𝑘−1 ) + 𝑝𝑘 𝑦𝑘 = 𝑓𝑘 ,
𝑘+1
𝑘
𝑘−1
ℎ2
ℎ2 𝑘+1
𝑘 = 1,2,3, … 𝑛 − 1,
µ1
ℎ
ν1
ℎ
(𝑦1 − 𝑦0 ) + µ2 𝑦0 = µ3 ,
(𝑦1 − 𝑦0 ) + ν2 𝑦0 = ν3 ,
В стандартном виде эта система следующим образом:
𝑏0 𝑦0 + 𝑐0 𝑦1 = 𝑑0 ,
{ 𝑎𝑘 𝑦𝑘−1 + 𝑏𝑘 𝑦𝑘 + 𝑐𝑘 𝑦𝑘+1 = 𝑑𝑘 , 𝑘 = 1,2,3, … 𝑛 − 1 ,
𝑎𝑛 𝑦𝑛−1 + 𝑏𝑛 𝑦𝑛 = 𝑑𝑛 ,
8
(2.7)
Причем 𝑎𝑘 ≠ 0, 𝑐𝑘 ≠ 0, для всех k = 1,2,3,…n-1. Здесь
𝑏0 = 𝜇2 ℎ − 𝜇1 , 𝑐0 = 𝜇1 , 𝑑0 = 𝜇3 ℎ ,
𝑝 ℎ
𝑝 ℎ
2
2
𝑎𝑘 = 1 − 𝑘 , 𝑏𝑘 = 𝑞𝑘 ℎ2 − 2, 𝑐𝑘 = 1 + 𝑘 , 𝑑𝑘 = 𝑓𝑘 ℎ2 ,
𝑎𝑛 = −ν1 , 𝑏𝑛 = ν2 ℎ + ν1 , 𝑑𝑛 = ν3 ℎ .
Чтобы найти приближенные значения 𝑦0 , 𝑦1 , 𝑦2 ,…, 𝑦𝑛 искомого решения,
необходимо решить систему 𝑛 + 1 линейных уравнений (2.7) c 𝑛 + 1 неизвестным.
Такую систему можно решить одним из стандартных методов решения линейных
систем, например, метод Гаусса. Однако, матрица системы трехдиагональная, то
есть в ней отличны от нуля только элементы, стоящие на главной и двух побочных
диагоналях поэтому для ее решения применяют метод прогонки. Согласно этому
методу решение системы (2.7) ищется в виде
𝑦𝑘 = 𝛼𝑘+1 + 𝛽𝑘+1 𝑦𝑘+1
(2.8)
с неизвестными коэффициентами 𝛼𝑘+1 , 𝛽𝑘+1 , которые подлежат определению.
После подстановки выражения (2.8) в (2.7) и сравнение полученного равенства с
(1.8), получают рекуррентные соотношения для коэффициентов 𝛼𝑘+1 , 𝛽𝑘+1
которые называются прогоночными коэффициентами.
𝛼𝑘+1 =
𝑑𝑘 −𝛼𝑘 𝑞𝑘
𝑏𝑘 +𝛽𝑘 𝑞𝑘
, 𝛽𝑘+1 =
𝑐𝑘
𝑏𝑘 +𝛽𝑘 𝑞𝑘
, 𝑘 = 1,2,3, … 𝑛 − 1.
Алгоритм решения разностной системы методов прогонки следующий. Из
граничного условия на левой границе находят:
𝑦0 =
𝑑0
𝑏0
𝑐
− 0 𝑦1 .
𝑏0
Следовательно 𝛼1 =
𝑑0
𝑏0
𝑐
, 𝛽1 = 0 . Далее, по формулам (2.9) при
𝑏0
𝑘 = 1,2,3,…𝑛 − 1 определяют прогоночные коэффициенты 𝛼𝑘+1 , 𝛽𝑘+1 (прямой
ход прогонки). Используя граничное условие на правом конце интервала [a,b] и
вид решения (2.8) при 𝑘 = 𝑛, из решения системы уравнений
𝑎 𝑦
+ 𝑏𝑛 𝑦𝑛 = 𝑑𝑛 ,
{ 𝑛 𝑛−1
𝑦𝑛−1 = 𝛼𝑛 + 𝛽𝑛 𝑦𝑛 ,
определяют 𝑦𝑛 :
9
𝑦𝑛 =
𝑑𝑛 −𝑎𝑛 𝛼𝑛
𝑏𝑛 +𝑎𝑛 𝛽𝑛
,
Теперь искомые значения 𝑦𝑛−1 , 𝑦𝑛−2 , 𝑦𝑛−3 , … 𝑦0 вычисляют последовательно
по формуле (1.8) при 𝑘 = 𝑛 − 1, 𝑛 − 2, … 3,2,1 (обратный ход прогонки).
Необходимое условие устойчивости решения формулам прогонки имеет вид
𝛽𝑘 < 1,
Достаточным условием по устойчивости решения формулам прогонки
является “преобладание диагональных элементов”, то есть выполнение
неравенств
|𝑏𝑘 | ≥ |𝑎𝑘 | + |𝑐𝑘 |, 𝑘 = 1,2,3, … 𝑛 − 1,
|𝑏0 | ≥ |𝑐0 |,
Метод прогонки позволяет найти точное решение системы (2.7), значит
погрешность
решения
краевой
задачи
(2.1)-(2.3)
определяется
только
погрешностью разностной аппроксимации и равна O(h). Выбирая n достаточно
большим можно добиться уменьшения погрешности ценой увеличения объема
вычислений. При практической оценке погрешности найденного решения часто
используют двойной пересчет и правило Рунге.
Если 𝑦(𝑥𝑘 ) — точное решение в узле 𝑥𝑘 , а 𝑦𝑘 (ℎ) и 𝑦𝑘 (𝑟ℎ), ( 𝑟 > 1 )
приближенные значения численного решения в том же узле, полученные
соответственно при шагах ℎ и 𝑟ℎ сетки, то погрешность в этом узле
определяется по формуле
𝑦 (ℎ)−𝑦𝑘 (𝑟ℎ)
Δ𝑘 = | 𝑘
𝑟 𝑝 −1
|,
где 𝑝 – порядок аппроксимации. В рассмотренной разностной схеме порядок
аппроксимации 𝑝 = 1 , если граничные условия содержат производную. В
случае граничных условий первого рода 𝑝 = 2.
10
2.2 Метод решения краевой задачи для уравнения теплопроводности
Пусть в области Ω = {(𝑡, 𝑥): 𝑡 > 0, 𝑥 ∈ (0, 𝑙)} требуется найти решение
𝑢(𝑡, 𝑥) линейного уравнения теплопроводности параболического типа с
постоянными коэффициентами[5]
𝜕𝑢
𝜕𝑡
=𝑎
𝜕2 𝑢
𝜕𝑥 2
,
(2.10)
удовлетворяющее начальному
𝑢(0, 𝑥) = 𝜑(𝑥),
(2.11)
и граничными условиями на концах отрезка [0, 𝑙]
𝜇1
ν1
𝜕𝑢(𝑡,0)
𝜕𝑡
∂u(t,l)
∂t
+ ν2 𝑢(𝑡, 0) = 𝜇3 ,
(2.12)
+ ν2 𝑢(𝑡, 𝑙),
(2.13)
Рассмотрим разбиение отрезка [0, 𝑙] узлами 𝑥0 = 0 < 𝑥1 < 𝑥2 < ⋯ < 𝑥𝑛 =
𝑙 с постоянным шагом ℎ =
𝑙
𝑛
по формулам 𝑥𝑘 = 𝑘ℎ , где k = 1,2,3… 𝑛 . Для
численного решения краевой задачи (2.10-2.13) методом конечных разностей
построим в области Ω два семейства параллельных прямых
𝑥 = 𝑘ℎ, 𝑘 = 1,2,3, … 𝑛 − 1, 𝑡 = 𝑖𝜏, 𝑖 = 1,2,3, …
где τ − некоторый шаг по переменной t. Точки, лежащие на пересечении прямых,
образуют множество узлов с координатами (𝑡𝑖 , 𝑥𝑘 ), где
𝑡𝑖 = (𝑖 − 1)τ, i = 1,2,3, … , 𝑥𝑘 = 𝑘ℎ, 𝑘 = ̅̅̅̅̅
0, 𝑛.
Узлы расположенные на прямых линиях 𝑥 = 0 , 𝑥 = 𝑙 , 𝑡 = 0 называются
граничными, а все остальные узлы называются внутренними. Множество всех
̅ называется сеткой [6]:
узлов в области Ω
̅ 𝜏ℎ = {(𝑡𝑖 , 𝑥𝑘 ): 𝑡𝑖 = 𝑖𝜏, 𝑖 = 0,1,2,3 … ; 𝑥𝑘 = 𝑘ℎ, 𝑘 = 0,1,2,3 … 𝑛}.
Ω
Обозначим приближение значения искомой функции 𝑢(𝑡, 𝑥) в узле (𝑡𝑖 , 𝑥𝑘 )
через
𝑢𝑘𝑖 .
Аппроксимируя
производную
по
времени
соотношениями с первым порядком аппроксимации по времени:
11
разностными
(𝑢𝑖 )𝑖𝑘 =
𝑖+1
𝑖
𝑢𝑘
−𝑢𝑘
𝜏
+ 𝑂(𝜏),
(2.14)
Вторую производную по координате x
можно аппроксимировать на
временном слое 𝑖 или на временном слое 𝑖 + 1 со вторым порядком
аппроксимации по координате x:
𝑖
𝑖
𝑖
𝑢
−2𝑢 +2𝑢
(𝑢𝑥𝑥 )𝑖𝑘 = 𝑘+1 𝑘2 𝑘−1 + 𝑂(ℎ2 ),
ℎ
(𝑢𝑥𝑥 )𝑖+1
=
𝑘
Обобщая,
𝑖+1
𝑖
𝑖
𝑢𝑘+1
−2𝑢𝑘
+2𝑢𝑘−1
ℎ2
(2.15)
+ 𝑂(ℎ2 ),
производную
(2.16)
во
𝑢𝑥𝑥
внутренних
узлах
можно
аппроксимировать линейной комбинацией (2.15) и (2.16).
𝑖
𝑖
𝑢𝑖+1 −2𝑢𝑘
+2𝑢𝑘−1
𝑘+1
(𝑢)𝑖+1
𝑥𝑥 = 𝜎
Обобщая
λ=
ℎ2
𝑎𝜏
ℎ2
𝑢𝑖
+ (1 − 𝜎) 𝑘+1
𝑖
𝑖
−2𝑢𝑘
+2𝑢𝑘−1
ℎ2
,
(2.17)
, после подстановки соотношений (2.14),(2.15) в
уравнение (2.13) и несложные преобразования получается следующие три вида
разностных аппроксимаций уравнения теплопроводности (2.10):
𝑖
𝑖
𝑢𝑘𝑖+1 = (1 − 2λ)𝑢𝑘𝑖 + λ(𝑢𝑘−1
− 𝑢𝑘+1
),
(2.18)
𝑖+1
𝑖+1
−λ𝑢𝑘+1
+ (1 + 2λ)𝑢𝑘𝑖+1 − λ𝑢𝑘−1
= 𝑢𝑘𝑖 ,
(2.19)
𝑖+1
𝑖+1
−λσ𝑢𝑘+1
+ (1 + 2σλ)𝑢𝑘𝑖+1 − σλ𝑢𝑘−1
,
𝑖
𝑖
= 𝑢𝑘𝑖 + λ(1 − σ)(𝑢𝑘+1
− 2𝑢𝑘𝑖 − 𝑢𝑘−1
),
(2.20)
где 𝑘 = 1,2,3, … 𝑛 − 1.
Соотношения (2.17), (2.18) представляют собой три системы линейных
алгебраических уравнений относительно искомых значений 𝑢1𝑖+1 и 𝑢𝑛𝑖+1 . Они
определяются из разностной аппроксимации граничных условий (2.12), (2.13):
𝑢𝑖+1 −𝑢1𝑖+1
𝜇1 2
ℎ
+ 𝜇2 𝑢1𝑖+1 = 𝜇3
𝑖+1
𝑢𝑖+1 −𝑢𝑛−1
𝜈1 𝑛
,
ℎ
+ 𝜈2 𝑢𝑛𝑖+1 = 𝜈3
,
(2.21)
Каждая из систем уравнения (2.18)-(2.20) относительно 𝑢𝑘𝑖+1 для
внутренних узлов вместе с разностной аппроксимацией граничных условий (2.21)
образуют разностную схему краевой задачи (2.10)-(2.13). Разностная схема,
соответствующая системе уравнений (2.18), называется явной, так как искомые
12
значения 𝑢𝑘𝑖+1 на (𝑖 + 1)-м временном слое вычисляются непосредственно по
известным значениям 𝑢𝑘𝑖 на предыдущем 𝑖 − м слое (𝑖 = 1,2,3 … ). Разностные
схемы (2.19) и (2.20) называются неявными, поскольку для определения
значений 𝑢𝑘𝑖 (𝑘 = 1,2, … 𝑛) надо решить системы алгебраических уравнений.
Матрицы таких систем трехдиагональные, поэтому для решения таких систем
можно применять метод прогонки. Решая системы линейных уравнений в
каждый момент времени, получают значения 𝑢1𝑖+1 , 𝑢2𝑖+1 , 𝑢3𝑖+1 , … 𝑢𝑛𝑖+1 , которые
являются приближенным решением исходной краевой задачи в узлах сетки в
этот (𝑖 + 1) -й момент времени. Разностная схема (2.19) получается из
разностной схемы (2.20) при 𝜎 = 1 и называется “чисто неявной” схемой.
Система (2.11) представляет собой однопараметрическое семейство разностных
1
схем. При значении параметра 𝜎 = разностная схема (2.20) называется схемой
2
Кранка – Николсона или симметричной разностной схемой[7].
Выберем явную схему для вычисления распределения температуры в
нашем численном решении краевых задач
𝑖−1
𝑖−1
𝑢𝑘𝑖 = 𝑢𝑘𝑖−1 + 𝜆(𝑢𝑘−1
− 2𝑢𝑘𝑖−1 + 𝑢𝑘+1
).
При
использовании
явной
схемы,
должно
выполняться
условие
устойчивости
𝜏<
1
2𝑎ℎ2
.
(2.22)
Для наших задач будет использоваться формула по нахождению τ в
зависимости от выбранного количества отрезков разбиения функции
таком выборе 𝜏 для ℎ < 1 условие (2.22) выполняется:
ℎ2
3𝑎
<
ℎ2
2𝑎
<
1
2𝑎
<
1
3𝑎ℎ2
.
13
3
𝑎ℎ2
. При
3 Решение тестовых задач и проверка условий
3.1 Аналитическое решения модельной задачи
Модельная краевая задача для ОДУ имеет вид
𝑦 ′′ + 3𝑦 = 0
𝑦(0) = −0,2,
𝑦(1) = 0,6.
Сначала
нашел
решение
соответствующего
однородного
дифференциального уравнения
𝑦 ′′ + 3𝑦 = 0,
Для этого составлю характеристическое уравнение, подставив 𝜆𝑘 вместо
производных 𝑦 𝑘 :
𝜆2 + 3 = 0.
Так как 𝐷 < 0, характеристическое уравнение имеет два мнимых корня
𝜆1 = −√3𝑖, 𝜆2 = √3𝑖,
а однородное уравнение – два линейно независимых решения
𝑦1 (𝑥) = 𝑐𝑜𝑠√3𝑥, 𝑦2 (𝑥) = 𝑠𝑖𝑛√3𝑥.
Общее решение однородного уравнения имеет вид:
𝑦(𝑥) = 𝐶1 ∙ 𝑐𝑜𝑠√3𝑥 + 𝐶2 ∙ 𝑠𝑖𝑛√3𝑥,
где 𝐶1 и 𝐶2 – произвольные константы.
Нашел их исходи из краевых условий
{
𝐶1 = −0.2,
𝐶1 ∙ 𝑐𝑜𝑠√3 ∙ 1 + 𝐶2 ∙ 𝑠𝑖𝑛√3 ∙ 1 = −0,8.
Решил данную систему и получил 𝐶1 = −0,50 , 𝐶2 ≈ −0,58.
Подставил полученные коэффициенты в найденное ранее уравнение:
𝑦(𝑥) = 0,5 ∙ 𝑐𝑜𝑠√3𝑥 − 0,58 ∙ 𝑠𝑖𝑛√3𝑥 .
Сделал проверку, подставив полученное уравнение в модельную задачу:
𝑦 ′ (𝑥) = −
√3 sin(√3𝑥)
2
−
29√3 𝑐𝑜𝑠(√3𝑥)
50
,
14
𝑦 ′′ (𝑥) =
87 sin(√3𝑥)
50
87 sin(√3𝑥)
50
−
−
3 𝑐𝑜𝑠(√3𝑥)
3 𝑐𝑜𝑠(√3𝑥)
2
2
,
+ 3 ∙ (0,5 ∙ 𝑐𝑜𝑠√3𝑥 − 0,58 ∙ 𝑠𝑖𝑛√3𝑥 ) = 0.
Подсчитав всё, получил 0 = 0. Это означает, что решение найдено верно
𝑦(𝑥) = 0,5 ∙ 𝑐𝑜𝑠√3𝑥 − 0,58 ∙ 𝑠𝑖𝑛√3𝑥 .
3.2 Проверка условий метода прогонки для модельной задачи
Необходимое условие устойчивости решения формулам прогонки
имеющее следующий вид
𝛽𝑘 < 1.
Оно выполняется так как 𝛽𝑘+1 =
𝑐𝑘
𝑏𝑘 +𝛽𝑘 𝑞𝑘
всегда меньше 1 из-за большего
порядка значения ℎ в знаменателе.
Проверил достаточное условие подстановкой собственных значений по
варианту
𝑏𝑘 = 3ℎ2 − 2, 𝑎𝑘 = 1 −
0∙ℎ
2
, 𝑐𝑘 = 1 +
0∙ℎ
2
,
тогда условие принимает вид
|3ℎ2 − 2| ≥ |1| + |1|,
так как в выражении следует рассмотреть все случаи как могут раскрываться
модули
на
√6
√6 √6
различных
отрезках.
Выбрал
отрезки
√6
(−∞; − 3 ) ; [− 3 ; 3 ] ; ( 3 ; +∞), они были получены исходя из точек в которых
значения в модуле принимают 0. Для упрощения решения, принял ℎ > 0, тогда
отрезок (−∞; −
√6
) можно убрать из рассмотрения.
3
Теперь необходимо рассмотреть какие знаки принимают значения 𝑏𝑘 , 𝑎𝑘
и 𝑐𝑘 (таблица 1).
Таблица 1 — Знаки, которые принимают значения 𝑏𝑘 , 𝑎𝑘 и 𝑐𝑘 .
15
[−
√6 √6
; ]
3 3
√6
( ; +∞)
3
-
+
|3ℎ2 − 2|
Теперь рассмотрим 3 случая для того чтобы определить при каких
значениях h, условие выполняется.
−
√6
√6
≤ℎ≤
3
3
ℎ>
√6
3
−3ℎ2 + 2 ≥ 2
3ℎ2 − 2 ≥ 2
−ℎ2 ≥ 0
3ℎ2 − 4 ≥ 0
ℎ ∈ [0]
ℎ ∈ (−∞; −
ℎ ∈ [0]
2 √3
2 √3
; +∞)
)∩(
3
3
ℎ∈(
2 √3
; +∞)
3
Объединяя полученные отрезки, получаем что условие выполняется при
2 √3
ℎ∈(
3
; +∞) ∩ [0].
3.3 Проверка условий метода прогонки для основной задачи
1+4𝑥
Так как в данном случае 𝑝(𝑥) =
𝑥 2 +1
, 𝑞(𝑥) =
15
√1−𝑥 2
не константы, то для
упрощения вычислений выберем 𝑥 = 0. Тогда 𝑝(𝑥) = 1, 𝑞(𝑥) = 15
Необходимое условие устойчивости решения формулам прогонки
имеющее следующий вид
𝛽𝑘 < 1.
Оно выполняется так как 𝛽𝑘+1 =
𝑐𝑘
𝑏𝑘 +𝛽𝑘 𝑞𝑘
всегда меньше 1 из за большего
порядка значения h в знаменателе.
Проверил достаточное условие подстановкой собственных значений по
варианту
16
ℎ
ℎ
2
2
𝑏𝑘 = 15ℎ2 − 2, 𝑎𝑘 = 1 − , 𝑐𝑘 = 1 + ,
тогда условие принимает вид
ℎ
ℎ
2
2
|15ℎ2 − 2| ≥ |1 − | + |1 + |,
так как в выражении следует рассмотреть все случаи как могут раскрываться
модули
на
(−∞; −2), (−2; −
различных
отрезках.
√30
√30 √30
, [−
; ],
)
15
15
15
Выбрал
√30
( 15 ; 2) ; (2; +∞) они
отрезки
были
получены
исходя из точек в которых значения в модуле принимают 0. Для упрощения
решения, принял ℎ > 0, тогда отрезки (−∞; −2), (−2; −
√30
)можно убрать из
15
рассмотрения.
Теперь необходимо рассмотреть какие знаки принимают значения 𝑏𝑘 , 𝑎𝑘
и 𝑐𝑘 (таблица 2).
Таблица 2 — Знаки, которые принимают значения 𝑏𝑘 , 𝑎𝑘 и 𝑐𝑘
[−
15ℎ2 − 2
ℎ
2
ℎ
1+
2
1−
√30 √30
;
]
15 15
√30
; 2)
(
15
(2; +∞)
-
+
+
+
+
-
+
+
+
Теперь рассмотрим 2 случая, для того чтобы определить при каких
значениях h, условие выполняется.
√30
√30
≤ℎ≤
15
15
√30
<ℎ<2
15
−15ℎ2 + 2 ≥ 1 + 1
15ℎ2 + 2 ≥ 1 + 1
−15ℎ2 ≥ 0
20ℎ2 ≥ 0
−
17
ℎ≥2
15ℎ2 + 2 ≥
ℎ ℎ
+
2 2
5ℎ2 − ℎ + 2 ≥ 0
ℎ=0
ℎ ∈ (−∞; +∞)
ℎ ∈ (−∞; +∞)
ℎ ∈ [0]
ℎ∈(
√30
;2 )
15
ℎ ∈ [2; +∞)
Объединяя полученные отрезки, получаем что условие выполняется при
√30
; 2 ) ∩ [0] ∩ [2; +∞)
15
ℎ∈(
Так как при 𝑥 ∈ (0; 1), 𝑝(𝑥) > 0, 𝑞(𝑥) > 0 , поэтому значения h останутся
прежними.
3.4
Составление
модельной
краевой
задачи
для
уравнения
теплопроводности
Составим модельную краевую задачу, решением которой является
функция
𝑢̂(𝑡, 𝑥) = 4[𝑐𝑜𝑠𝑥 + 𝑠𝑖𝑛𝑥]𝑒 −𝑡 + 3 .
Сначала
убедимся,
что
𝑢̂(𝑡, 𝑥)
удовлетворяет
уравнению
теплопроводности. Для доказательства мы найдем частные производные
𝜕𝑢
𝜕𝑡
𝜕𝑢
𝜕𝑥
= (−4𝑠𝑖𝑛2𝑥 − 4𝑐𝑜𝑠2𝑥)𝑒 −𝑡 ,
= (4𝑐𝑜𝑠2𝑥 − 4𝑠𝑖𝑛2𝑥)𝑒 −𝑡 ,
𝜕2 𝑢
𝜕𝑥 2
= (−4𝑠𝑖𝑛𝑥 − 4𝑐𝑜𝑠2𝑥)𝑒 −𝑡 .
Подставим
найденные
частные
производные
в
уравнение
теплопроводности:
𝜕𝑢
𝜕𝑡
=𝑎
𝜕2 𝑢
𝜕𝑥 2
,
(−4𝑠𝑖𝑛2𝑥 − 4𝑐𝑜𝑠2𝑥)𝑒 −𝑡 = 𝑎(−4𝑠𝑖𝑛2𝑥 − 4𝑐𝑜𝑠2𝑥)𝑒 −𝑡 ,
𝑎=1.
Получили, что функция 𝑢̂(𝑡, 𝑥) удовлетворяем уравнению
𝜕𝑢
𝜕𝑡
=
𝜕2 𝑢
𝜕𝑥 2
.
Доказав, что наша функция удовлетворяет уравнению теплопроводности, и
вычислив a, можно перейти к составлению краевой задачи. За начальное условие
18
возьмем 𝑢(𝑥, 𝑡) в момент времени 𝑡 = 0, а также запишем граничные условия в
точках 𝑙 = 0 и 𝑙 = 1:
𝑢(0, 𝑥) = 4(𝑐𝑜𝑠𝑥 + 𝑠𝑖𝑛𝑥) + 3 ,
𝜕𝑢
𝜕𝑥
(𝑡, 0) = 4𝑒 −𝑡 ,
𝑢(𝑡, 1) = (4𝑐𝑜𝑠1 − 4𝑠𝑖𝑛1)𝑒 −𝑡 + 3.
Получили краевую задачу:
𝜕𝑢
𝜕𝑡
=
𝜕2 𝑢
𝜕𝑥 2
;
𝑢(0, 𝑥) = 4(𝑐𝑜𝑠𝑥 + 𝑠𝑖𝑛𝑥) + 3 ,
𝜕𝑢
𝜕𝑥
(𝑡, 0) = 4𝑒 −𝑡 ,
𝑢(𝑡, 1) = (4𝑐𝑜𝑠1 − 4𝑠𝑖𝑛1)𝑒 −𝑡 . .
Записанную краевую задачу мы можем решать методом конечных
разностей.
4 Результаты численных экспериментов
4.1 Решение краевых задач для обыкновенного дифференциального
уравнения
Была разработана программа на языке программирования C# в среде
разработки Microsoft Visual Studio 2019 (рисунок 1), реализующая решение
краевой задачи для обыкновенного дифференциального уравнения методом
конечных разностей и аналитически. Она позволяет выбрать метод решения, тип
задачи и количество точек разбиения. Код программы приведен в приложении А.
19
Рисунок 1 – Интерфейс программы, реализующей решение КЗ для ОДУ методом
конечных разностей
Модельная краевая задача для ОДУ имеет вид:
𝑦 ′′ + 3𝑦 = 0,
𝑦(0) = −0,2,
𝑦(1) = 0,6.
Также было получено аналитическое решение
𝑦(𝑥) = 0,5 ∙ 𝑐𝑜𝑠√3𝑥 − 0,58 ∙ 𝑠𝑖𝑛√3𝑥 .
На рисунках 2-6 приведены графики аналитического и численного
решения при разбиении отрезка [0; 1] на 𝑁 частей. Также на этих графиках была
найдена
погрешность
метода
конечных
разностей,
по
отношению
к
аналитическому решению. Погрешность была вычислена по формуле
𝜀=
𝑚𝑎𝑥|𝑓(𝑥𝑘 )−𝛾(𝑥𝑘 )|
|𝑓(𝑥𝑘 )|
∙ 100%, ,
где 𝑓(𝑥𝑘 ) – значение аналитической функции в точке 𝑥𝑘 , 𝛾(𝑥𝑘 ) –значение
функции полученной численным методом в точке 𝑥𝑘 .
приведены в таблице 3.
20
Все зависимости
Рисунок 2 – Аналитическое решение модельной задачи для ОДУ
Рисунок 3 – Сравнение аналитического решения с МКР модельной задачи для ОДУ при
количестве разбиений равном 10
21
Рисунок 4 – Сравнение аналитического решения с МКР модельной задачи для ОДУ при
количестве разбиений равном 100
Рисунок 5 – Сравнение аналитического решения с МКР модельной задачи для ОДУ
при количестве разбиений равном 1000
22
Рисунок 6 – Сравнение аналитического решения с МКР модельной задачи для ОДУ при
количестве разбиений равном 100000
Таблица 3 – Сравнение погрешности в зависимости от количества
разбиений.
Количество
разбиений (𝑁)
Относительная
погрешность (𝜀)
10
100
1000
100000
9%
1%
0,05%
0,08%
В итоге получил, что при увеличении 𝑁 погрешность уменьшается, что
означает повышении точности МКР.
Основная краевая задача имеет вид:
𝑦 ′′ +
1+4𝑥
15
1+𝑥
√1−𝑥 2
𝑦′ +
2
𝑦 = 0,
y(0) = −0,2,
y(1) = 0,6 .
Решив данную задачу численно, методом конечных разностей, получили
график изображенный на рисунке 7, при разбиении отрезка [0; 1] на 100000
частей, для наибольшей точности.
23
Рисунок 7 – Решение основной КЗ для ОДУ методом конечных разностей
4.2 Решение краевых задач для уравнения теплопроводности
Была разработана программа на языке программирования C# в среде
разработки Microsoft Visual Studio 2019 (рисунок 8), которая решает одномерную
краевую задачу для уравнения теплопроводности. Пользователь может выбрать
количество точек разбиения заданного отрезка, а также время для отображения
графика в этот момент времени. Код программы приведен в приложении Б.
24
Рисунок 8 – Интерфейс программы, реализующей решение КЗ для уравнения
теплопроводности
Модельная краевая задача для уравнения теплопроводности:
𝜕𝑢
𝜕𝑡
=
𝜕2 𝑢
𝜕𝑥 2
;
𝑢(0, 𝑥) = 4(𝑐𝑜𝑠𝑥 + 𝑠𝑖𝑛𝑥) + 3 ,
𝜕𝑢
𝜕𝑥
(𝑡, 0) = 4𝑒 −𝑡 ,
𝑢(𝑡, 1) = (4𝑐𝑜𝑠1 − 4𝑠𝑖𝑛1)𝑒 −𝑡 .
По условию задачи нужно реализовать программу, которая методом
конечных разностей может определить нестационарное температурное поле
пластины толщиной l, τ рассчитывается автоматически в зависимости от
введенного значения для точек разбиения пластины. Графики аналитического и
численного
решений
модельной
краевой
задачи
для
уравнения
теплопроводности в моменты времени 0, 50,100𝑡 представлены на рисунках 911, при разбиении отрезка [0; 1] на n = 50 равных частей и шаге временного слоя
𝜏 = 0,0008333.
25
Рисунок 9 – Численное решение модельной КЗ для уравнения теплопроводности в
момент времени 0
Рисунок 10 – Численное решение модельной КЗ для уравнения теплопроводности в
момент времени 50
26
Рисунок 11 – Численное решение модельной КЗ для уравнения теплопроводности
задачи в момент времени 100
Основная краевая задача для уравнения теплопроводности имеет вид:
𝜕𝑢
𝜕𝑡
=
𝜕2 𝑢
𝜕𝑥 2
, 𝑥 ∈ (0,1), 𝑡 > 0 ,
𝑢(0, 𝑥) = {
𝜕𝑢
𝜕𝑥
10,
60,
𝑥 ∈ [0],
𝑥 ∈ (0,1],
(𝑡, 0) = 0,
𝑢(𝑡, 1) = 10.
Для
основной
краевой
задачи
нам
требуется
вывести
график
распределения температуры в пластине [0,1] в заданные моменты времени.
Графики численного решения основной краевой задачи для уравнения
теплопроводности в моменты времени 0 , 10𝜏 , 50𝜏, 100𝜏 , 1000𝜏 , 10000𝜏
представлены на рисунках 12-17, при разбиении отрезка [0; 1] на 𝑛 = 50 равных
частей и шаге временного слоя τ = 0,0008333.
27
Рисунок 12 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 0
Рисунок 13 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 10
28
Рисунок 14 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 50
Рисунок 15 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 100
29
Рисунок 16 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 1000
Рисунок 17 – Численное решение основной КЗ для уравнения теплопроводности в
момент времени 100000
30
ЗАКЛЮЧЕНИЕ
В ходе выполнения данного задания были изучены и реализованы
следующие задачи:
̶
изучены методы решения краевых задач для обыкновенных
дифференциальных уравнений;
̶
найдено
аналитическое
решение
модельной
задачи
для
дифференциального уравнения с постоянными коэффициентами;
̶
для
разработана программа, предназначенная для решения краевой задачи
обыкновенного
дифференциального
уравнения
методом
конечных
разностей;
̶
составлена краевая задача для заданной функции и показано, что она
удовлетворяет уравнению теплопроводности;
̶
разработана программа, строящая график решения краевой задачи для
уравнения теплопроводности в заданный момент времени;
̶
разработанные программы были отлажены на модельных задачах,
результаты были сравнены с аналитическим решением;
̶
с помощью разработанных программ были решены краевые задачи и
построены графики численных решений.
̶
при решении краевых задач для обыкновенных дифференциальных
задач, была замечена зависимость между количеством разбиений (𝑁) и
точностью численного метода: чем больше 𝑁 , тем меньше относительная
погрешность между точным решением и численным.
̶
при решении краевых задач для уравнения теплопроводности, была
замечена зависимость между значением 𝑡 и тем, как ведет себя график: чем
больше 𝑡, тем он больше похож на прямую, но не становится ей.
31
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1
Формалев В.Ф., Ревизников Д.Л. Численные методы(2-е издание) //
изд., испр. и доп. – М.:Физматлит, 2006 – 400с.
2
Никифоров А.Н., Денисов П.А. Численные методы: учебно-
методическое пособие по выполнению курсовой работы. Новочеркасск:
ЮРГПУ (НПИ). – 2016. – 20 с.
3
Березин И.С., Жидков Н.П. Методы вычислений, Т.2. М.: ГИФМЛ,
1959. - 620 с.
4
Копченова, Н.В. Вычислительная математика в примерах и задачах /
Н.В. Копченова, И.А. Марон // Главная редакция физико- математической
литературы изд-ва «Наука», М. – 1972. – 368 с.
5
Костецкая Г.С., Радченко Т.Н. Методы матфизики. Уравнение
теплопроводности для студентов высших учебных заведений, обучающихся по
естественнонаучным специальностям и направлениям подготовки Ростов– на–
Дону 2016 – 47с.
6
Турчак, Л.И. Основы численных методов: Учеб. пособие / Л.И.
Турчак // М.: Наука. Гл. ред. физ.-мат. лит. – 1987. – 320 с.
7
Бахвалов, Н.С. Численные методы: Учеб. пособие / Н.С. Бахвалов,
Н.П. Жидков, Г.М. Кобельков // М.: Наука. Гл. ред. физ.-мат. лит. – 1987. – 600с.
32
ПРИЛОЖЕНИЕ А
Листинг метода решения краевой задачи для обыкновенного
дифференциального уравнения
namespace KaragishievAT.NM
{
public partial class Form1 : Form
{
int n;
static double a = 0, b = 1, y_a = -0.2, y_b = 0.6;
private double fAnaliticForM(double x)
{
return 0.575 * Math.Sin(Math.Sqrt(3) * x) - 0.2 * Math.Cos(Math.Sqrt(3) * x);
}
private double PofXForM(double x)
{
return 0;
}
private double QofXForM(double x)
{
return 3;
}
private double PofXForO(double x)
{
return (1+4*x)/(x*x+1);
}
private double QofXForO(double x)
{
return 15/(Math.Sqrt(1-x*x));
}
private void CountAnswer_Click(object sender, EventArgs e)
{
n = Int32.Parse(this.setN.Text.ToString());
if ((string)this.type.SelectedItem == "Модельная")
{
if ((string)this.algorithm.SelectedItem == "Аналитическое решение модельной
задачи")
{
List<PointF> points = CauchyProblem.AnalitcАiniteВifferences(a, b, y_a,
fAnaliticForM, n);
this.plot1.UpdateItem("Аналитическое решение модельной задачи", Color.Brown,
points);
this.plot1.Draw();
}
33
if ((string)this.algorithm.SelectedItem == "Численное решение кроевой зачи методом
конечных разностей")
{
List<PointF> points = BoundaryValueProblem1D.FiniteDiffMethod(a, b, y_a, y_b, n,
Zero, PofXForM, QofXForM);
this.plot1.UpdateItem("Численное решение краевой зачи методом конечных
разностей", Color.Red, points);
this.plot1.Draw();
}
else
{
if ((string)this.algorithm.SelectedItem == "Аналитическое решение модельной
задачи")
{
List<PointF> points = CauchyProblem.AnalitcАiniteВifferences(a, b, y_a,
fAnaliticForO, n);
this.plot1.UpdateItem("Аналитическое решение модельной задачи", Color.Brown,
points);
this.plot1.Draw();
}
if ((string)this.algorithm.SelectedItem == "Численное решение кроевой зачи методом
конечных разностей")
{
List<PointF> points = BoundaryValueProblem1D.FiniteDiffMethod(a, b, y_a, y_b, n,
Zero, PofXForO, QofXForO);
this.plot1.UpdateItem("Численное решение кроевой зачи методом конечных
разностей", Color.Red, points);
this.plot1.Draw();
}
}
}
public static List<PointF> AnalitcАiniteВifferences(double A, double B, double Y, Func<double,
double> F, int N)
{
// Проверка корректности исходных данных
if (A >= B)
{
throw new Exception("Координата правой точки должна быть больше координаты
левой");
}
if (N <= 0)
{
throw new Exception("Количество элементов разбиения должно быть
положительным");
}
// Получение регулярной сетки
double[] x = CauchyProblem.Discretization(A, B, N);
34
// double[] y = new double[N + 2];
PointF[] points = new PointF[N + 1];
for (int i = 0; i < N + 1; i++)
{
points[i].X = (float)x[i];
points[i].Y = (float)F(x[i]);
}
return new List<PointF>(points);
}
public static List<PointF> FiniteDiffMethod(double a, double b, double Ya, double Yn, int N,
Func<double, double> F, Func<double, double> p, Func<double, double> q)
{
PointF[] points = new PointF[N + 4];
double[] y = new double[N + 4];
double[] x = Discretization(a, b, N + 3);
double h = (b - a) / N;
y[0] = Ya;
y[N + 3] = Yn;
double[] A = new double[N + 4];
double[] B = new double[N + 4];
double[] C = new double[N + 4];
double[] Fu = new double[N + 4];
C[0] = 1;
B[0] = 0;
Fu[0] = Ya;
A[N + 3] = 0;
C[N + 3] = 1;
Fu[N + 3] = Yn;
for (int i = 1; i < N + 4; i++)
{
A[i] = (1 / (h ∙ h)) - (p(x[i]) / (2 ∙ h));
C[i] = (2 / (h ∙ h)) - q(x[i]);
B[i] = (1 / (h ∙ h)) + (p(x[i]) / (2 ∙ h));
Fu[i] = -F(x[i]);
}
y = ThomasAlgorithm(A, B, C, Fu, 0, 0, Ya, Yn);
y[0] = Ya;
y[N + 3] = Yn;
for (int i = 0; i < N + 4; i++)
{
points[i].X = (float)x[i];
points[i].Y = (float)y[i];
}
return new List<PointF>(points);
}
35
ПРИЛОЖЕНИЕ Б
Листинг метода решения краевой задачи для уравнения
теплопроводности
namespace KaragishievAT.NM
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
double l1 = 0, l = 1, t, tao;
int n, layer;
double y_a;
List<double[]> Y;
double[] X;
double fAnaliticM1(double x, double y)
{
return (4 * (Math.Cos(1) + Math.Sin(1)) * Math.Pow(Math.E, -1* t) + 3);
}
double fAnaliticO1(double x, double y)
{
return (4 * (Math.Cos(0) + Math.Sin(0)) * Math.Pow(Math.E, -1 * t) + 3);
}
double fAnaliticFunc1(double x,double t)
{
return (4 * (Math.Cos(x) + Math.Sin(x)) * Math.Pow(Math.E,- 1 * t) + 3);
}
double fAnaliticM2(double x, double y)
{
return 10;
}
private void CalculateAnswer_Click(object sender, EventArgs e)
{
n = Int32.Parse(this.setN.Text.ToString());
layer = Int32.Parse(this.setLayer.Text.ToString());
double h = l / n;
tao = Math.Pow(h, 2) / 2;
if ((string)this.type.SelectedItem == "Модельное")
{
if ((string)this.algorithm.SelectedItem == "Аналитическое решение краевой
задачи(t=0)")
{
List<PointF> points = CauchyProblem.AnaliticCourse2(l1, l, y_a, fAnaliticFunc1, n,
0);
36
this.plot1.UpdateItem("Аналитическое решение краевой задачи(t=0)", Color.Brown,
points);
this.plot1.Draw();
}
if ((string)this.algorithm.SelectedItem == "Численное решение кроевой задачи
уравнения теплоправодности методом конечных раз.(t=0)")
{
List<PointF> points = CauchyProblem.ModelZt0(l1, n, l, fAnaliticFunc1, 0);
this.plot1.UpdateItem("Аналитическое решение краевой задачи(t=0)", Color.Green,
points);
this.plot1.Draw();
}
if ((string)this.algorithm.SelectedItem == "Аналитическое решение краевой
задачи(t!=0)")
{
t = tao ∙ layer;
List<PointF> points = CauchyProblem.AnalitKoshiZ2(l1, n, l, fAnaliticFunc1, t);
this.plot1.UpdateItem("Аналитическое решение краевой задачи(t=0)", Color.Black,
points);
this.plot1.Draw();
}
if ((string)this.algorithm.SelectedItem == "Численное решение кроевой задачи
уравнения теплоправодности методом конечных раз.(t!=0)")
{
t = tao ∙ layer;
List<PointF> points = new List<PointF>();
Y = BoundaryValueProblem1D.ThermalConductivity(0, l, n, fAnaliticO1,
fAnaliticM1, fAnaliticFunc1, tao, 1);
X = BoundaryValueProblem1D.Discretization(0, l, n);
if (int.Parse(setLayer.Text) <= Y.Count)
{
points = Point(Y[int.Parse(setLayer.Text)], X);
this.plot1.UpdateItem("Модел.задач.t=" + t, Color.Green, points);
this.plot1.Draw();
}
else
{
MessageBox.Show("Выбрано число превышающее конечное значение");
}
this.plot1.UpdateItem("Численное решение кроевой задачи уравнения
теплоправодности методом конечных разностей(t!=0)", Color.Gray, points);
this.plot1.Draw();
}
}
else
{
if ((string)this.algorithm.SelectedItem == "Аналитическое решение краевой
задачи(t!=0)")
{
37
List<PointF> points = CauchyProblem.MainZt0(l1, fAnaliticFunc1, n, l, 0);
this.plot1.UpdateItem("Аналитическое решение краевой задачи(t!=0)",
Color.BlueViolet, points);
this.plot1.Draw();
}
if ((string)this.algorithm.SelectedItem == "Численное решение кроевой задачи
уравнения теплоправодности методом конечных раз.(t!=0)")
{
t = tao ∙ layer;
List<PointF> points = new List<PointF>();
Y = BoundaryValueProblem1D.ThermalConductivity(0, l, n, fAnaliticO1,
fAnaliticM1, fAnaliticFunc1, tao, 1);
X = BoundaryValueProblem1D.Discretization(0, l, n);
if (int.Parse(setLayer.Text) <= Y.Count)
{
points = Point(Y[int.Parse(setLayer.Text)], X);
this.plot1.UpdateItem("Модел.задач.t=" + t, Color.Green, points);
this.plot1.Draw();
}
else
{
MessageBox.Show("Выбрано число превышающее конечное значение");
}
this.plot1.UpdateItem("Численное решение кроевой задачи уравнения
теплоправодности методом конечных разностей(t!=0)", Color.Gray, points);
this.plot1.Draw();
}
}
}
double fAnaliticFunc2(double X)
{
if (X <= 0.4)
{
return 50;
}
else
{
return 100;
}
}
double fAnalicticO2(double x, double y)
{
return 100;
}
private List<PointF> Point(double[] y, double[] x)
{
PointF[] p = new PointF[y.Length];
38
for (int i = 0; i < y.Length; i++)
{
p[i].X = (float)x[i];
p[i].Y = (float)y[i];
}
return new List<PointF>(p);
}
public static List<PointF> AnaliticCourse2(double A, double B, double Y,
Func<double, double, double> F, int N,double t)
{
// Проверка корректности исходных данных
if (A >= B)
{
throw new Exception("Координата правой точки должна быть больше координаты
левой");
}
if (N <= 0)
{
throw new Exception("Количество элементов разбиения должно быть
положительным");
}
// Получение регулярной сетки
double[] x = CauchyProblem.Discretization(A, B, N);
// double[] y = new double[N + 2];
PointF[] points = new PointF[N + 1];
for (int i = 0; i < N + 1; i++)
{
points[i].X = (float)x[i];
points[i].Y = (float)F(x[i],t);
}
return new List<PointF>(points);
}
public static List<PointF> ModelZt0(double A, int n,double B, Func<double, double, double>
F,double t)
{
// Проверка корректности исходных данных
if (A >= B)
{
throw new Exception("Координата правой точки должна быть больше координаты
левой");
}
if (n <= 0)
{
throw new Exception("Количество элементов разбиения должно быть
положительным");
}
// Получение регулярной сетки
39
double[] x = CauchyProblem.Discretization(A, B, n);
double[] y = new double[n + 2];
// Алгоритм
PointF[] points = new PointF[n + 1];
for (int i = 0; i < points.Length; i++)
{
y[i] = (float)F(x[i], t);
points[i].X = (float)x[i];
points[i].Y = (float)y[i];
}
return new List<PointF>(points);
}
public static List<PointF> AnalitKoshiZ2(double A,int n, double B, Func<double, double,
double> F,double t)
{
// Проверка корректности исходных данных
if (A >= B)
{
throw new Exception("Координата правой точки должна быть больше координаты
левой");
}
if (n <= 0)
{
throw new Exception("Количество элементов разбиения должно быть
положительным");
}
// Получение регулярной сетки
double[] x = CauchyProblem.Discretization(A, B, n);
double[] y = new double[n + 1];
// Алгоритм
PointF[] points = new PointF[n + 1];
for (int i = 0; i < points.Length; i++)
{
y[i] = (float)F(x[i], t);
points[i].X = (float)x[i];
points[i].Y = (float)y[i];
}
return new List<PointF>(points);
}
public static List<PointF> MainZt0(double A, Func<double, double, double> F,int N,double
B,double t)
{
// Проверка корректности исходных данных
if (A >= B)
{
throw new Exception("Координата правой точки должна быть больше координаты
левой");
40
}
if (N <= 0)
{
throw new Exception("Количество элементов разбиения должно быть
положительным");
}
// Получение регулярной сетки
double[] x = CauchyProblem.Discretization(A, B, N);
double[] y = new double[N + 2];
// Алгоритм
PointF[] points = new PointF[N + 1];
for (int i = 0; i < points.Length; i++)
{
y[i] = (float)F(x[i], t);
points[i].X = (float)x[i];
points[i].Y = (float)y[i];
}
return new List<PointF>(points);
}
41
Download