МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ М.В. ЛОМОНОСОВА Механико-математический факультет Отчёт №3 Численное решение краевой задачи для уравнения в частных производных Студент: Преподаватель: Бузин Алексей Безяев В.И. Группа: 406 Москва 2023 1 Содержание 1 Условие 2 2 построение проекционно сеточной схемы 3 3 Метод Рунге-Кутты 4 порядка 5 4 Тестирование явного метода 4.1 a=0,ν = 1,u = sin(πx)exp(−tν 2 π 2 ),f=0 . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 принцип продолжения по параметру . . . . . . . . . . . . . . . . . . . . . . 4.1.2 границы сходимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 расходимость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 a=0,ν = 1,u = sin(2πx)exp(−4tν 2 π 2 ),f=0 . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 принцип продолжения по параметру . . . . . . . . . . . . . . . . . . . . . . 4.3 a=1,ν = 1,u = x(1 − x)(t − 1)2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 a=1,ν = π 3 ,u = sin(πx) cos(νt/π 2 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6 6 7 7 9 9 10 11 5 неявный метод 11 6 Тестирование неявного метода 12 6.1 a=0,ν = 1,u = sin(πx)exp(−tν 2 π 2 ),f=0 . . . . . . . . . . . . . . . . . . . . . . . . . 12 6.1.1 непрерывность по параметру . . . . . . . . . . . . . . . . . . . . . . . . . . 13 6.2 a=0,ν = 1,u = sin(2πx)exp(−4tν 2 π 2 ),f=0 . . . . . . . . . . . . . . . . . . . . . . . . 13 6.2.1 непрерывность по параметру . . . . . . . . . . . . . . . . . . . . . . . . . . 14 7 Заключение 14 8 Листинг программы 15 1 Условие 2. Для задачи: ∂2u ∂u = ν 2 − au3 + f (t, x), ∂t ∂x u(0, x) = u0 (x), u(t, 0) = u(t, 1) = 0 a, ν ≥ 0 найти и исследовать полудискретное приближение Галеркина с помощью кусочно-линейных базисных функций. Из теории известно, что решение существет и единственно для достаточно гладких f, u0 2 2 построение проекционно сеточной схемы на сетке:0 = x0 < x1 < · · · < xN = 1 xi+1 − xi = h x − xi−1 x ∈ [xi−1 , xi ] h φi (x) = 1 − x − xi x ∈ [xi , xi+1 ] h - базис кусочно линейных функций с носителями на 0 = x0 < x1 < · · · < xN = 1 соответсвено. j = 1, . . . , N − 1 NP −1 uh = bj (t)φj (x) j=1 Z1 ZT 0 ∂uh ∂ 2 uh + au3h )φj (x)dtdx = ( −ν ∂t ∂x2 Z1 ZT f (t, x)φj (x)dtdx 0 0 0 2 интегрируя по частям ∂∂xu2h φj по x получаем: ZT Z1 0 ∂uh ∂uh ′ φj (x) + ν φ (x) + au3h φj (x)dxdt = ∂t ∂x j 0 ZT Z1 f (t, x)φj (x)dxdt 0 0 так как тождество выполнено ∀T > 0 подинтегральные выражения равны. И подставляя uh получаем: Z1 N −1 X b′j (t)φj (x)φi (x) + νbj (t)φ′j (x)φ′i (x) + a j=1 0 N −1 X 3 Z1 bj (t)φj (x) φi (x)dx = j=1 f (t, x)φi (x)dx 0 учитывая, что φj (x)φj+2 (x) = 0 и φj (x) = 0 ∀x ∈ / [xj−1 , xj+1 ]: x Zi+1 xi−1 i+1 X i+1 X 3 b′j (t)φj (x)φi (x) + νbj (t)φ′j (x)φ′i (x)+a bj (t)φj (x) j=i−1 j=i−1 x Zi+1 φi (x)dx = f (t, x)φi (x)dx xi−1 тогда: i+1 X b′j (t)⟨φj , φi ⟩ + νbj (t)⟨φ′j , φ′i ⟩ +a bi (t)3 ⟨φ3i , φi ⟩ + b3i−1 (t)⟨φ3i−1 , φi ⟩ + 3b2i−1 (t)bi (t)⟨φ2i−1 , φ2i ⟩+ j=i−1 2 +3bi−1 (t)bi (t) ⟨φi−1 , φ3i ⟩ + b3i+1 (t)⟨φ3i+1 , φi ⟩ + 3b2i+1 (t)bi (t)⟨φ2i+1 , φ2i ⟩ + 3bi+1 (t)bi (t)2 ⟨φi+1 , φ3i ⟩ x Zi+1 = f (t, x)φi (x)dx xi−1 3 где для простоты доопределим b0 (t) = bN (t) = 0 и φ0 (x) = φN (x) = 0 учитывая, что: ⟨φ′i , φ′i ⟩ = 2 h ⟨φ′i , φ′i+1 ⟩ = − 1 h Zh x(1 − x) 1 1 h dx = h( − ) = 2 h 2 3 6 ⟨φi , φi+1 ⟩ = 0 Zh ⟨φi , φi ⟩ = 2 x2 2h dx = 2 h 3 0 ⟨φ3i , φi ⟩ = 2 Zh x4 2h dx = h4 5 0 ⟨φ3i , φi+1 ⟩ = Zh 1 1 h x3 x (1 − )dx = h( − ) = h3 h 4 5 20 0 ⟨φ2i , φ2i+1 ⟩ = Zh x x2 1 1 1 h x2 (1 − 2 + 2 )dx = h( − + ) = 2 h h h 3 2 5 30 0 и приближая интерал формулой Симпсона 2h ′ b′i−1 + b′i+1 1 (b + )−ν (bi−1 −2bi +bi+1 )+ha 3 i 4 h 2 1 1 3 bi (t)3 + b3i−1 (t) + b2i−1 (t)bi (t) + bi−1 (t)b2i (t)+ 5 20 10 20 1 1 3 + b3i+1 (t) + b2i+1 (t)bi (t) + bi+1 (t)b2i (t) = 20 10 20 = h (f (t, xi−1 )φi (xi−1 ) + 4f (t, xi−1 + h/2)φi (xi−1 + h/2) + 2f (t, xi )φi (xi ) + 4f (t, xi + h/2)φi (xi + h/2) + f (t, xi+1 )φi ( 6 h = (4f (t, xi−1 + h/2)φi (xi−1 + h/2) + 2f (t, xi )φi (xi ) + 4f (t, xi + h/2)φi (xi + h/2)) = 6 h = (f (t, xi−1 + h/2) + f (t, xi ) + f (t, xi + h/2)) 3 ′ тогда система на b1 , . . . , b′N −1 имеет вид: ′ 1 1 0 0 ... 0 b1 4 1 1 b′2 1 0 . . . 0 4 4 1 0 ... = ... . . . . . . . . . . . . 4 1 . . . . . . . . . . . . . . . ... 4 1 b′N −1 0 ... ... 0 1 4 4 ⃗b(0) находим из условий: ⟨uh , φj ⟩ = ⟨u0 , φj ⟩ j = 1, . . . , N − 1, где интеграл по u0 считаем по формуле Симпсона (3 порядо аппроксимации) то есть: 1 1 4 2h 0 3 ... 0 1 4 1 1 4 ... ... 0 1 4 ... ... ... 0 0 ... ... 0 ... ... ... ... 1 4 0 b1 (0) 0 b2 (0) h (u0 (xi−1 + h/2) + u0 (xi ) + u0 (xi + h/2)) ... = . . . 3 i = 1, . . . , N − 1 1 ... 4 bN −1 (0) 1 получаем дифференциальное уравнение на ⃗b(t), которое будем решать методом РунгеКутты 4 порядка, на каждом шаге ищя решение слу методом прогонки. асимптотика решения O(Nt Nx ) Z1 ||u − uh ||2 dt ≤ ch2 0 NT2 ≈ Nx 3 Метод Рунге-Кутты 4 порядка Стоит ( задача: найти приближенное решение следующей задачи Коши ⃗z˙ = f (t, ⃗z) ⃗z(a) = α на N + 1 равноотстоящих узла на отрезке [a, b]. Тогда приближенное значение в последующих точках вычисляется по формуле: zi (n + 1) = zi (n) + h (k1 (i, n) + 2k2 (i, n) + 2k3 (i, n) + k4 (i, n)) 6 И каждая kj (i, n), i = 1, ..., ищется так: k1 (i, n) = fi (tn , ⃗z(n)) −−→ k (i, n) = f (t + h , ⃗z(n) + h − 2 i n 2 2 k1 (n)) −−−→ k3 (i, n) = fi (tn + h2 , ⃗z + h2 k2 (n)) −−−→ k4 (i, n) = fi (tn + h, ⃗z(n) + hk3 (n)) где h - шаг разбиения на отрезке [0,1]. В нашем случае: z = ⃗b 4 Тестирование явного метода (описанный ранее) 5 4.1 a=0,ν = 1,u = sin(πx)exp(−tν 2 π 2 ),f=0 близость численного решения к настоящему ищем решение на t ∈ [0, 0.015]. Nt = 106 , Nx = 100 max|uh − u| = 8.224839406922868e − 05 4.1.1 принцип продолжения по параметру выполняется: для ν = 1, t ∈ [0, 0.1], Nt = 1000, Nx = 25 с теми же начальными условиями видно, что при увеличении a решение уменьшется по модулю, что соответствует физической аналогии уравнения теплопроводности с уходом тепла из системы пропорционально кубу температуры 6 4.1.2 границы сходимости запуская с разными T, Nx ,при Nt = 1000 эмпирически получилось, что для сходимости требуется примерно: τ ≥ h2.3 , и τ = h2 недостаточно (а при h < 100 степень h еще больше), где расходимость понимаем, как: при таких начальных условиях происходило переполнение переменных, то есть появлялось b такое что |b| > 10300 ( у "не расходящихся"решение отличалось от настоящего не более чем на 0.1) 4.1.3 расходимость пример границы начинания расходимости: Nt = 1000, Nx = 100, T = 0.02345 видно, что решение начинает осцилировать с возрастающей по t амплитуде 7 8 4.2 a=0,ν = 1,u = sin(2πx)exp(−4tν 2 π 2 ),f=0 близость численного решения к настоящему ищем решение на t ∈ [0, 0.01]. Nt = 10000, Nx = 100 max|uh − u| = 8.224839406922868e − 05 4.2.1 принцип продолжения по параметру выполняется: для ν = 1, t ∈ [0, 0.01], Nt = 1000, Nx = 50 с теми же начальными условиями видно, что при увеличении a решение уменьшется по модулю, что соответствует физической аналогии уравнения теплопроводности с уходом тепла из системы пропорционально кубу температуры 9 4.3 a=1,ν = 1,u = x(1 − x)(t − 1)2 из вида уравнения подставляя f, такое что решение u(t, x) = x(1 − x)(t − 1)2 . Ищем решение на [0, 0.01] c Nx = 200, Nt = 100 получаем. Видим что метод решения не является устойчивым и за несколько шагов (около 5) происходит переполнение переменных 10 4.4 a=1,ν = π 3 ,u = sin(πx) cos(νt/π 2 ) из вида уравнения подставляя f, такое что решение u(t, x) = sin(πx) cos(νt/π 2 ). Ищем решение на [0, 0.01] c Nx = 200, Nt = 100 получаем. Видим что метод решения не является устойчивым 5 неявный метод Построим неявный метод первого порядка по τ = 1/Nt : В системе будем аппроксимировать b′i ≈ bi (t+ττ)−bi (t) , b2i ≈ bi (t+τ )bi (t), b3i ≈ bi (t+τ )bi (t)2 , bi (t)+bi (t+τ ) 1 , hbi ≈ hbi (t), и в правой части вместо F⃗ (t, b) (правая часть) поставим h bi ≈ 2h ⃗ (t,b)+F ⃗ (t+τ,b) F 2 2h ′ b′i−1 + b′i+1 1 (bi + ) − ν (bi−1 − 2bi + bi+1 ) + ha 3 4 h 2 1 1 3 bi (t)3 + b3i−1 + b2i−1 bi + bi−1 b2i + 5 20 10 20 1 1 3 + b3i+1 + b2i+1 bi + bi+1 b2i = 20 10 20 = h (f (t, xi−1 + h/2) + f (t, xi ) + f (t, xi + h/2)) 3 11 таким образом получаем разностную схему: 2h bi−1 (t + τ ) − bi−1 (t) + bi+1 (t + τ ) − bi+1 (t) ν bi−1 (t) + bi−1 (t + τ ) bi (t + τ ) − bi (t) + − − (bi (t) + bi (t + τ ))+ 3τ 4 h 2 bi+1 (t) + bi+1 (t + τ ) 2 1 1 + + ha bi (t + τ )bi (t)2 + bi−1 (t + τ )bi−1 (t)2 + bi−1 (t + τ )bi−1 (t)bi (t)+ 2 5 20 10 3 1 1 3 + bi−1 (t)bi (t + τ )bi (t) + bi+1 (t + τ )bi+1 (t)2 + bi+1 (t + τ )bi+1 (t)bi (t) + bi+1 (t)bi (t + τ )bi (t) = 20 20 10 20 h = (f (t, xi−1 + h/2) + f (t, xi ) + f (t, xi + h/2) + f (t + τ, xi−1 + h/2) + f (t + τ, xi ) + f (t + τ, xi + h/2)) 6 откуда получается система линейных алгебраических уравнений с трехдиагональной марицей на ⃗b(t + τ ) через ⃗b(t): 2 3 3 2h ν + + ha bi (t)2 + ha bi−1 (t)bi (t) + ha bi+1 (t)bi (t) + 3τ h 5 20 20 h ν 1 1 +bi−1 (t + τ ) − + ha bi−1 (t)2 + ha bi−1 (t)bi (t) + 6τ 2h 20 10 ν 1 1 h − + ha bi+1 (t)2 + ha bi+1 (t)bi (t) + +bi+1 (t + τ ) 6τ 2h 20 10 2h bi+1 (t) −bi−1 (t) − bi+1 (t) ν bi−1 (t) + − bi (t) + −bi (t) + − = 3τ 4 h 2 2 h = (f (t, xi−1 + h/2) + f (t, xi ) + f (t, xi + h/2) + f (t + τ, xi−1 + h/2) + f (t + τ, xi ) + f (t + τ, xi + h/2)) 6 bi (t + τ ) 3 эта матрица с диагональным преобладанием, при hτ > 6 max{ 10 bi bi+1 , 1} на каждом шаге по t будем решать слу методом прогонки 6 Тестирование неявного метода 6.1 a=0,ν = 1,u = sin(πx)exp(−tν 2 π 2 ),f=0 близость численного решения к настоящему ищем решение на t ∈ [0, 0.25]. Nt = 1000, Nx = 1000 max|uh − u| = 8.224672023438018e − 07 12 ab2i ; i = 1, . . . , N − 6.1.1 непрерывность по параметру ищем решение на t ∈ [0, 0.25]. Nt = 1000, Nx = 1000 наблюдаем непрерывную зависимость от параметра с убыванием по модулю, что соответствует физической интерпретации 6.2 a=0,ν = 1,u = sin(2πx)exp(−4tν 2 π 2 ),f=0 близость численного решения к настоящему ищем решение на t ∈ [0, 0.25]. Nt = 1000, Nx = 1000 max|uh − u| = 3.2898708397510745e − 06 13 6.2.1 непрерывность по параметру ищем решение на t ∈ [0, 0.25]. Nt = 1000, Nx = 1000 наблюдаем непрерывную зависимость от параметра с убыванием по модулю, что соответствует физической интерпретации 7 Заключение В реализованном явном методе основаная погрешность возникает за счет сходимости uh к u порядка O(h2 ) по L2 норме. При этом τ надо выбирать порядка около h2.5 . и получается время работы алгоритма O(Nx Nt ) = O(Nx3.5 ) Неявный метод работает без проблем с жесткостью рассматриваемой системы и намного быстрее: погрешность порядка O(τ + h2 ), а время работы O(Nt Nx ) (= O(Nx3 ), если брать 14 τ ≈ h2 ). И получается существенно быстрее, как минимум есть возможность не так зависимо подбирать шаги по разным координатам 8 Листинг программы import math import s e a b o r n a s sb import m a t p l o t l i b . p y p l o t a s p l t import numpy a s np import s c i p y import s c i p y . s t a t s a s s t from random import r a n d i n t import random import pandas a s pd import s e a b o r n a s sb from math import s q r t from random import random from math import exp from math import l o g import o s from numpy import l i n a l g from tqdm import tqdm import j s o n """ Ax=F a[0][1] a[0][2] 0 .. a[1][0] a[1][1] a[1][2] A= ... """ def s o l u t i o n (A, F ) : n = len (F) x = [ 0 f o r k in range ( n ) ] v = [ 0 f o r k in range ( 0 , n ) ] u = [ 0 f o r k in range ( 0 , n ) ] v [ 0 ] = A [ 0 ] [ 2 ] / (−A [ 0 ] [ 1 ] ) u [ 0 ] = ( − F [ 0 ] ) / (−A [ 0 ] [ 1 ] ) f o r i in range ( 1 , n − 1 ) : v [ i ] = A[ i ] [ 2 ] / ( −A[ i ] [ 1 ] − A[ i ] [ 0 ] ∗ v [ i −1] ) u [ i ] = ( A[ i ] [ 0 ] ∗ u [ i −1] − F [ i ] ) / ( −A[ i ] [ 1 ] − A[ i ] [ 0 ] ∗ v [ i −1] ) v [ n−1] = 0 15 u [ n−1] = (A[ n − 1 ] [ 0 ] ∗ u [ n−2] − F [ n −1]) / (−A[ n − 1 ] [ 1 ] − A[ n − 1 ] [ 0 ] ∗ v [ n −2]) x [ n−1] = u [ n−1] f o r i in range ( n−1, 0 , −1): x [ i −1] = v [ i −1] ∗ x [ i ] + u [ i −1] return np . a r r a y ( x ) def _b0( u0 , Nx ) : x=[ i /Nx f o r i in range (Nx+1)] h=1/Nx A=[ [ ( 0 . 2 5 i f i >0 e l s e 0 ) , 1 , ( 0 . 2 5 i f i <Nx−1 e l s e 0 ) ] f o r i in range (Nx−1)] return s o l u t i o n (A , [ ( u0 ( x [ i −1]+h/2)+u0 ( x [ i ])+ u0 ( x [ i ]+h / 2 ) ) / 2 f o r i in range ( 1 , Nx ) def turn_A ( b , f , a , Nx , Nt ) : tau=T/Nt h=1/Nx A= [ [ 0 f o r i in range ( 3 ) ] f o r j in range (Nx−1)] f o r i in range (Nx−1): A[ i ] [ 1 ] = 2 ∗ h / ( 3 ∗ tau )+nu/h+h∗a ∗ ( ( 2 / 5 ) ∗ b [ i ] ∗ b [ i ] + 3∗b [ i ] ∗ ( b [ i −1] i f i >0 e l s e 0 3∗b [ i ] ∗ ( b [ i +1] i f i <Nx−2 e l s e 0 ) / 2 0 i f i >0: A[ i ] [ 0 ] = h / ( 6 ∗ tau)−nu / ( 2 ∗ h)+h∗a∗b [ i −1]∗b [ i −1]/20 + h∗a∗b [ i ] ∗ b [ i −1]/10 i f i <Nx−2: A[ i ] [ 2 ] = h / ( 6 ∗ tau)−nu / ( 2 ∗ h)+h∗a∗b [ i +1]∗b [ i +1]/20 + h∗a∗b [ i ] ∗ b [ i +1]/10 return A def find_u ( u0 , f , a , Nx , Nt ) : tau=T/Nt h=1/Nx x=[ i /Nx f o r i in range (Nx+1)] u = [ [ 0 f o r i in range ( 1 , Nx ) ] f o r j in range ( Nt +1)] u [ 0 ] = _b0( u0 , Nx) f o r i in range ( Nt ) : F=(h / 6 ) ∗ np . a r r a y ( [ f ( tau ∗ i , x [ j −1]+h)+ f ( tau ∗ i , x [ j ])+ f ( tau ∗ i , x [ j ]+h)+ f ( tau ∗ ( i +1) , f o r j in range ( 1 , Nx ) ] ) F+=np . a r r a y ( [ ( 2 ∗ h / ( 3 ∗ tau ) ) ∗ ( u [ i ] [ j ]+( u [ i ] [ j −1] i f j >0 e l s e 0)/4+( u [ i ] [ j +1] i f o r j in range (Nx− 1 ) ] ) F+=np . a r r a y ( [ −(nu/h ) ∗ ( u [ i ] [ j ] −(u [ i ] [ j −1] i f j >0 e l s e 0)/2 −(u [ i ] [ j +1] i f j <Nx−2 u [ i +1]= s o l u t i o n ( A=turn_A ( b=u [ i ] , f=f , a=a , Nx=Nx , Nt=Nt ) , F=F ) return np . a r r a y ( u ) Nt=1000 16 Nx=100 T=2 nu=1 a=0 tau=T/Nt k=1 real_u=lambda t , x : x∗(1−x ) ∗pow( t +1 ,2) lambda t , x : np . s i n ( k∗math . p i ∗x ) ∗ exp(− t ∗nu∗k∗k∗math . p i ∗math . p i ) f=lambda t , x : a ∗pow( real_u ( t , x ) ,3)+ x∗(1−x ) ∗ 2 ∗ ( t +1) + nu ∗2∗pow( t +1 ,2) lambda t , x : a∗pow( real_u ( t , x ) , 3 ) u=find_u ( u0=lambda x : real_u ( 0 , x ) , a=a , f=f , Nx=Nx , Nt=Nt ) print ( f " | | u−real_u | | = {max ( [ ␣ ␣max ( [ ␣ abs ( u [ t ] [ i ]− real_u (T∗ t /Nt , ( i +1)/Nx) ␣ ) ␣ f o r ␣ t ␣ i n ␣ r a n g e 17