Uploaded by alexey903572

эвм задание 3

advertisement
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМЕНИ М.В. ЛОМОНОСОВА
Механико-математический факультет
Отчёт №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
Download