-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathODE_transformace.py
More file actions
377 lines (305 loc) · 19.9 KB
/
ODE_transformace.py
File metadata and controls
377 lines (305 loc) · 19.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
from tkinter import CENTER
from turtle import fillcolor
from manim import *
from matplotlib.pyplot import title
from scipy.integrate import solve_ivp # řešení diferenciálních rovnic
import colorsys
import random
import os
from manim_editor import PresentationSectionType
from common_definitions import *
template = TexTemplate(preamble=r'\usepackage{url}\usepackage[czech]{babel}\usepackage{amsmath}\usepackage{amssymb}')
class Intro(Scene):
def construct(self):
self.next_section("Nadpis")
title = Title(r"Transformace diferenciálních rovnic (změnou jednotek)")
autor = VGroup(Tex("Robert Mařík"),Tex("Mendel University")).arrange(DOWN).next_to(title,DOWN)
self.play(GrowFromCenter(title))
self.play(GrowFromCenter(autor[0]))
self.play(GrowFromCenter(autor[1]))
self.wait()
self.play(FadeOut(autor))
def MujTex(text):
return(Tex(r"$\bullet$\quad\begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9).set_color(BLUE))
k = VGroup(
#MujTex(r"Ujasníme si, jak se mění numerická hodnota fyzkální veličiny při změně jednotek."),
MujTex(r"Ukážeme si, že vhodnou volnou fyzikálních jednotek je možné zredukovat počet parametrů v matematickém modelu. Nejprve fyzikálně intuitivním způsobem."),
MujTex(r"Pro přesný matematický popis odvodíme formální vztahy udávající, jak se mění derivace a diferenicální rovnice při lineární transformaci veličin."),
MujTex(r"Uplatníme odvozené vztahy na příkladě rovnice ochlazování a rovnice logistického růstu s lovem."),
MujTex(r"Redukce parametrů je důležitá pro numerické modelování, kdy měníme hodnoty parametrů a sledujeme odezvu systému. Menší počet parametrů je dramatickou výhodou."),
).arrange(DOWN).next_to(title,DOWN)
k[-1].set_color(RED)
for i in k:
self.play(GrowFromCenter(i))
self.wait()
class TransformaceJednotek(MovingCameraScene):
def construct(self):
def MujTex(text):
return(Tex(r"$\bullet$ \quad \begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
self.next_section("Fyzikalni pristup k transformaci jednotek")
title = Title(r"Transformace jednotek a jejich vliv na číselnou hodnotu")
self.add(title)
text = VGroup(
MujTex(r"Pokud zvětšíme jednotku veličiny, její numerická hodnota se zmenší stejným násobkem. Například $2400\,\mathrm m = 2{,}4\mathrm{km}.$"),
MujTex(r"Pokud zvětšíme jednotku derivované veličiny, numerická hodnota derivace se zmenší stejným násobkem. Například $2400\,\mathrm m \,\mathrm{min}^{-1}= 2{,}4\,\mathrm{km}\,\mathrm{min}^{-1}.$"),
MujTex(r"Pokud zmenšíme jednotku veličiny podle níž derivujeme, numerická hodnota derivace se zmenší stejným násobkem. Například $2400\,\mathrm m \,\mathrm{min}^{-1}= 40\,\mathrm{m}\,\mathrm{s}^{-1}.$"),
MujTex(r"Změnou jednotek dokážeme měnit hodnoty veličin. Většinou chceme mít standardizované jednotky, aby se daly sdílet měřící přístroje a porovnávat hodnoty. Někdy se ale hodí mít jednotky vlastní související třeba jen s jedním konkrétním problémem.")
).arrange(DOWN, aligned_edge=LEFT).next_to(title,DOWN)
for i in text:
if i != text[0]:
self.next_section("")
if i == text[-1]:
self.play(self.camera.frame.animate.move_to(text[-1],aligned_edge=DOWN).shift(DOWN))
self.play(GrowFromCenter(i))
self.wait()
title.move_to
class Teplota(MovingCameraScene):
def construct(self):
self.next_section("Transformace postupnymi zmenami")
self.camera.frame.shift(1.3*UP)
title = Title(r"Volba jednotek v rovnici ochlazování").shift(1.3*UP)
self.add(title)
merak = VGroup()
merak.add(Dot(
radius=0.1,
stroke_color=WHITE,
stroke_width=4,
fill_color=RED,
fill_opacity=1
))
merak.add(
Line(
start = (0,0,0),
end = 3*UP
).set_z_index(-1).set_stroke(width=10)
)
merak.add(
Line(
start = (0,0,0),
end = 2.6*UP,
color=RED
).set_stroke(width=6)
)
merak.shift(0.2*DOWN)
carka = Line(start = RIGHT*0, end=LEFT*0.13, buff=0)
carka_delsi = Line(start = RIGHT*0, end=LEFT*0.18, buff=0)
stupnice = VGroup()
for i in range(27):
if (i-3)%10 == 0:
carka_stupnice = carka_delsi
else:
carka_stupnice = carka
stupnice.add(carka_stupnice.copy().shift(-0.1*RIGHT+i/10*UP) )
stupnice[3].set_color(ORANGE)
nova_stupnice=stupnice.copy()
# nova_stupnice[-3].set_color(WHITE)
# nova_stupnice[6].set_color(WHITE)
stupnice[-3].set_color(YELLOW).set_stroke(width=7).add_tip(at_start=True, tip_length=0.08)
stupnice[6].set_color(YELLOW).set_stroke(width=7).add_tip(at_start=True, tip_length=0.08)
nova_stupnice.flip()
nova_stupnice.shift(0.35*RIGHT)
merak.add(
MathTex("T/^{\circ} \mathrm C").scale(0.5).next_to(stupnice, UP, aligned_edge=RIGHT)
)
merak2 = VGroup(
MathTex(r"\tau").scale(0.5).next_to(nova_stupnice, UP, aligned_edge=LEFT)
)
teplomer = VDict([("merak",merak),("stupnice",stupnice),("nova_stupnice",nova_stupnice),("merak2",merak2)])
stupnice.add(Tex(r"$0$").scale(0.5).next_to(stupnice[3],LEFT, buff=0.1).set_color(ORANGE))
stupnice.add(Tex(r"$T_0$").scale(0.5).next_to(stupnice[-4],LEFT, buff=0.1).set_color(YELLOW))
stupnice.add(Tex(r"$T_\infty$").scale(0.5).next_to(stupnice[6],LEFT, buff=0.1).set_color(YELLOW))
teplomer.scale(2)
teplomer.to_corner(UL)
nova_stupnice_popisek=VGroup(
Tex(r"0").scale(1).next_to(nova_stupnice[3],RIGHT, buff=0.1).set_color(ORANGE)
)
uloha = VGroup(
Tex("Základní model v libovolných jednotkách:"),
MathTex(r"\frac{\mathrm dT}{\mathrm dt}=-k(T-T_\infty), \quad T(0)=T_0"),
Tex("V nových jednotkách teploty,"),
MathTex(r"{{\frac{\mathrm d\tau}{\mathrm dt}=}}{{-k}}{{(\tau-0),}} \quad \tau(0)={{\tau_0}}"),
Tex(r"V nových jednotkách teploty a času, $\theta=kt$:"),
MathTex(r"{{\frac{\mathrm d\tau}{\mathrm d\theta}=}}{{-}}{{\tau,}} \quad \tau(0)={{1}}"),
Tex(r"Trojparametrická úloha je redukována na úlohu bez parametru.")
).arrange(DOWN, aligned_edge=LEFT).next_to(teplomer, aligned_edge=UP, buff=2)
for i in [0,2,4]:
uloha[i].shift(LEFT)
self.play(FadeIn(uloha[0],uloha[1]))
def MujTex(text):
return(Tex(r"\begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
temp = MujTex(r"Rovnice modeluje ochlazování tělesa o počáteční teplotě $T_0$ v~prostředí s teplotou $T_\infty$ podle Newtonova zákona ochlazování, kdy rychlost změny teploty je úměrná teplotnímu rozdílu.").set_color(BLUE).to_edge(DOWN, buff=3)
self.play(FadeIn(temp))
self.wait()
self.next_section()
self.remove(temp)
self.play(self.camera.frame.animate.shift(1.3*DOWN))
self.play(*[Create(i) for i in
[teplomer['merak'], teplomer['stupnice'], teplomer['nova_stupnice'], nova_stupnice_popisek]])
self.wait()
self.next_section()
# stupnice.add(Tex(r"1").scale(0.5).next_to(nova_stupnice[22],RIGHT, buff=0.1).set_color(ORANGE))
komentar = Tex(r"Posuneme stupnici. Bude začínat na teplotě okolí.").next_to(teplomer, aligned_edge=DOWN).set_color(BLUE)
self.play(FadeIn(komentar))
self.play(VGroup(nova_stupnice,nova_stupnice_popisek).animate().shift(3/10*2*UP))
self.play(FadeIn(teplomer["merak2"].add_background_rectangle()))
temp = Tex(r"$\tau_0$").scale(1).next_to(nova_stupnice[21],RIGHT,buff=0.1)
self.play(FadeIn(temp))
prevod = Tex(r"$\tau = T - T_\infty$:").next_to(uloha[2],RIGHT)
self.play(FadeIn(uloha[2],uloha[3],prevod))
self.wait()
self.play(Transform(uloha[3][2],MathTex(r"\tau,").next_to(uloha[3][1], aligned_edge=DOWN).shift(0.07*DOWN)))
self.wait()
self.next_section()
self.remove(komentar)
komentar = Tex(r"Změníme dílek stupnice. Počáteční teplota bude 1.").next_to(teplomer, aligned_edge=DOWN).set_color(BLUE)
self.play(FadeIn(komentar))
self.play(
FadeOut(temp),
*[FadeOut(nova_stupnice[i]) for i in range(len(nova_stupnice)) if (i!=3) and (i!= 4)]
)
self.play(nova_stupnice[4].animate().move_to(nova_stupnice[21]))
zacatek = nova_stupnice[3].get_center()[1]
konec = nova_stupnice[21].get_center()[1]
print (str(zacatek)+" po "+str(konec))
delta = (konec-zacatek)/10
dilky = VGroup()
for i in [1,2,3,4,5,6,7,8,9,-1,-2]:
dilky.add(
Line(start=RIGHT*0, end=RIGHT*0.2).set_stroke(width=2).move_to(
nova_stupnice[3], aligned_edge=LEFT).shift(delta*UP*i)
)
dilky[4].set_stroke(width=5)
self.play(Create(dilky), FadeIn(Tex(r"$1$").scale(1).next_to(nova_stupnice[21],RIGHT,buff=0.1)))
self.play(Transform(uloha[3][-1],MathTex(r"1").next_to(uloha[3][-2])))
self.play(Transform(prevod,Tex(r"$\tau = \frac{T - T_\infty}{T_0-T_\infty}$:").next_to(uloha[2],RIGHT)))
self.wait()
self.next_section()
self.remove(komentar)
self.play(FadeIn(uloha[4],uloha[5]))
self.play(FadeIn(uloha[6].scale(0.75).shift(3*LEFT).set_color(RED)))
self.wait()
class TeplotaFormalne(MovingCameraScene):
def construct(self):
self.next_section()
title = Title(r"Formální transformace v rovnici ochlazování")
self.add(title)
eq = VGroup()
eq.add(MathTex(r"{{\frac{\mathrm dT}{\mathrm dt} }} {{= - }} {{k}} {{(T-T_\infty)}}, \qquad {{T(0)=T_0}} "))
eq.add(MathTex(r"{{\frac{\mathrm d(T-T_\infty)}{\mathrm dt} }} {{= - }} {{k}} {{(T-T_\infty)}}, \qquad {{T(0)-T_\infty=T_0-T_\infty}} "))
eq.add(MathTex(r"{{\frac{1}{T_0-T_\infty}\frac{\mathrm d(T-T_\infty)}{\mathrm dt} }} {{= - }} {{k}} {{\frac{T-T_\infty}{T_0-T_\infty}}}, \qquad {{\frac{T(0)-T_\infty}{T_0-T_\infty}=1}} "))
eq.add(MathTex(r"{{\frac{\mathrm d\frac{T-T_\infty}{T_0-T_\infty} }{\mathrm dt} }} {{= - }} {{k}} {{\frac{T-T_\infty}{T_0-T_\infty}}}, \qquad {{\frac{T(0)-T_\infty}{T_0-T_\infty}=1}} "))
eq.add(MathTex(r"{{\frac 1k \frac{\mathrm d\frac{T-T_\infty}{T_0-T_\infty} }{\mathrm dt} }} {{= - }} {{}} {{\frac{T-T_\infty}{T_0-T_\infty}}}, \qquad {{\frac{T(0)-T_\infty}{T_0-T_\infty}=1}} "))
eq.add(MathTex(r"{{\frac{\mathrm d\frac{T-T_\infty}{T_0-T_\infty} }{\mathrm d(kt)} }} {{= - }} {{}} {{\frac{T-T_\infty}{T_0-T_\infty}}}, \qquad {{\frac{T(0)-T_\infty}{T_0-T_\infty}=1}} "))
eq.add(MathTex(r"{{\frac{\mathrm d\tau }{\mathrm d \theta} }} {{= - }} {{}} {{\tau}}, \qquad {{\tau(0)=1}} "))
eq.arrange(DOWN, buff=.5).next_to(title,DOWN, buff=.5)
def MujTex(text):
return(Tex(r"\begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
k = VGroup(
MujTex(r"Toto je základní rovnice pro ochlazování tělesa o počáteční teplotě $T_0$ v~prostředí o teplotě $T_\infty$. Rovnice obsahuje tři parametry. Dva z~nich ($T_0$ a $T_\infty$) souvisí s teplotou. Třetí parametr ($k$) souvisí s intenzitou předávání tepla. Například s tím, jestli máme kafe v~plechovém nebo polystyrenovém hrníčku."),
MujTex(r"Posuneme teplotu o $T_\infty.$ Protože derivace konstanty je nulová a derivace rozdílu je rozdíl derivací, platí $$\frac{\mathrm d(T-T_\infty)}{\mathrm dt}=\frac{\mathrm dT}{\mathrm dt}-\frac{\mathrm dT_\infty}{\mathrm dt}=\frac{\mathrm dT}{\mathrm dt}.$$ U počáteční podmínky odečteme z obou stran konstantu $T_\infty$."),
MujTex(r"Vydělíme rovnici i počáteční podmínku výrazem $T_0-T_\infty$."),
MujTex(r"Začleníme násobení konstantou před zlomkem do derivované veličiny. Podle pravidla pro derivaci konstantního násobku platí $$k\frac{\mathrm dy}{\mathrm dx}=\frac{\mathrm d(ky)}{\mathrm dx}.$$"),
MujTex(r"Vydělíme konstantou $k$."),
MujTex(r"Začleníme konstantu před derivací do veličiny, podle které derivujeme. Podle pravidla pro derivaci složené funkce platí $$\frac{\mathrm dy}{\mathrm dx} = \frac{\mathrm dy}{\mathrm d(kx)} \frac{\mathrm d(kx)}{\mathrm dx} = \frac{\mathrm dy}{\mathrm d(kx)}k\quad\text{ a odsud }\quad\frac 1k\frac{\mathrm dy}{\mathrm dx} = \frac{\mathrm dy}{\mathrm d(kx)}. $$"),
MujTex(r"Zavedeme bezrozměrnou teplotu a bezrozměrný čas pomocí vztahů $\tau=\frac{T-T_\infty}{T_0-T_\infty}$, a $\theta = kt.$ Nová rovnice neobsahuje žádný parametr. Řešení bude vypadat pořád stejně. (Těleso vychladne na teplotu okolí.)"),
)
for i in k:
i.set_color(BLUE)# add_background_rectangle(buff=0.2, color=DARK_GRAY)
k[0].next_to(eq[0],DOWN, buff=0.5)
self.add(eq[0],k[0])
self.wait()
for i in range(len(eq)-1):
self.next_section()
self.remove(*k)
# temp = eq[i].copy()
# next_to(eq[i],DOWN,buff=0.5)
k[i+1].next_to(eq[i+1],DOWN, buff=0.5)
self.play(self.camera.frame.animate.move_to(eq[i+1]).shift(DOWN))
self.play(TransformMatchingTex(eq[i].copy(),eq[i+1]),FadeIn(k[i+1]))
# self.play(eq.animate().shift(eq[i+1].get_center()[1]*DOWN))
self.wait()
class Logisticka(Scene):
def construct(self):
self.next_section()
title = Title(r"Logistická rovnice s lovem")
self.add(title)
def MujTex(text):
return(Tex(r"\begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
eq0 = MathTex(r"{{\frac{\mathrm dx}{\mathrm dt} }} {{=}} {{r}} {{x}} {{\left(1-\frac xK\right)}} {{-}} {{h}}")
eq1 = MathTex(r"{{\frac 1K\frac{\mathrm dx}{\mathrm dt} }} {{=}} {{r}} {{\frac xK}} {{\left(1-\frac xK\right)}} {{-}} {{\frac hK}}")
eq2 = MathTex(r"{{ \frac{1}{rK} \frac{\mathrm dx}{\mathrm dt} }} {{=}} {{}} {{ \frac{x}{K} }} {{\left(1-\frac xK\right)}} {{-}} {{ {h\over rK} }}")
eq3 = MathTex(r"{{\frac{\mathrm d \frac xK}{\mathrm d(rt)} }} {{=}} {{}} {{\frac xK}} {{\left(1-\frac xK\right)}} {{-}} {{\frac {h}{rK}}}")
eq4 = MathTex(r"{{\frac{\mathrm d X}{\mathrm dT} }} {{=}} {{}} {{X}} {{\left(1-X\right)}} {{-}} {{H}}")
eq = VGroup(eq0,eq1,eq2,eq3,eq4).arrange(DOWN).next_to(title,DOWN).to_edge(LEFT, buff=.5)
k = VGroup(
Tex(r"vydělit rovnici parametrem $K$"),
Tex(r"vydělit rovnici parametrem $r$"),
Tex(r"začlenit konstanty do derivace"),
Tex(r"přeznačit proměnné"),
Tex(r"$X=\frac xK$, $T=rt$, $H=\frac {h}{rK}$"),
)
self.add(eq[0])
temp = MujTex(r"Toto je základní rovnice pro popis populací rostlin nebo živočichů vystavených lovu. Rovnice obsahuje tři parametry. Podle vzájemných relací mezi těmito parametry může a nemusí populace přežít. Vhodná volba jednotek (vhodná transformace rovnice) ukáže, že ve skutečnosti chování rovnice řídí jediný parametr, kombinující vhodným způsobem $r$, $K$ a $h$.").shift(DOWN).set_color(BLUE)
self.add(temp)
self.wait()
self.next_section()
self.remove(temp)
for i in range(len(k)-1):
k[i].next_to(eq[i],RIGHT, buff=0.5).to_edge(RIGHT)
self.play(GrowFromCenter(k[i]))
self.play(
*[Transform(j.copy(),jj) for j,jj in zip(eq[i],eq[i+1])]
)
if i!=len(k)-2:
self.wait()
self.next_section()
k[-1].next_to(eq[-1],RIGHT, buff=1.5).to_edge(RIGHT)
self.play(GrowFromCenter(k[-1]))
self.wait()
self.next_section()
self.remove(*[i for i in self.mobjects])
self.add(eq,k,title)
self.play(*[FadeOut(i) for i in [eq1,eq2,eq3,*k[:-1 ]]])
self.play(eq4.animate().next_to(eq0).to_edge(RIGHT).set_color(YELLOW))
self.play(k[4].animate().next_to(eq4,DOWN).to_edge(RIGHT))
temp = MujTex(r"Model obsahuje tři parametry. Vhodnou transformací je umíme redukovat na jediný parametr, $\displaystyle H=\frac h{rK}.$ Pokud se například lov $h$ i nosná kapacita $K$ zvětší stejným násobkem (například o~stejné procento), chová se rovnice pořád stejně. Dokud vychází bezrozměrný parametr $H$ stále stejný, chová se rovnice stále stejně ve smyslu persistence populace.").to_edge(DOWN, buff=1).set_color(BLUE)
self.add(temp)
self.wait()
class TransformaceDerivace(MovingCameraScene):
def construct(self):
def MujTex(text):
return(Tex(r"$\bullet$ \quad \begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
self.next_section()
title = Title(r"Transformace v derivaci")
self.add(title)
text = VGroup(
MujTex(r"Derivace součtu je součet derivací a derivace konstanty je nula. Proto pro funkce vzniklá posunutím má stejnou derivaci jako původní funkce. Pro funkci $y(x)$ a konstantu $y_0$ platí $$\frac{\mathrm d(y+y_0)}{\mathrm dx}=\frac{\mathrm dy}{\mathrm dx}.$$" ),
MujTex(r"Derivace konstantního násobku je násobek derivace, tedy pro funkci funkci $y(x)$ a konstantu $k$ platí $$\frac{\mathrm d(ky)}{\mathrm dx}=k\frac{\mathrm dy}{\mathrm dx}.$$"),
MujTex(r"Podobně jako v předchozím, pokud derivujeme podle $k$-násobku původní proměnné, platí $$\frac{\mathrm dy}{\mathrm d(kx)}=\frac 1k \frac{\mathrm dy}{\mathrm dx}.$$")
).arrange(DOWN, aligned_edge=LEFT).next_to(title,DOWN)
for i in text:
if i == text[-1]:
self.play(self.camera.frame.animate.move_to(text[-1],aligned_edge=DOWN).shift(DOWN))
self.play(GrowFromCenter(i))
self.wait()
self.next_section()
class Cile(Scene):
def construct(self):
text = [
r"Po transformaci obsahuje rovnice v nových veličinách menší množství parametrů.",
r"Nové veličiny jsou bez fyzikální jednotky a tudíž vhodné pro numerické simulace, kdy se zpravidla o jednotky nestaráme.",
r"Nové veličiny zpravidla nabývají hodnot řádově srovnatelných s~jedničkou. Nejedná se ani o tisíce ani o tisícíny."
]
def MujTex(text):
return(Tex(r"$\bullet$ \quad \begin{minipage}[t]{10cm}"+text+"\end{minipage}", tex_template=template).scale(.9))
textTex = VGroup(
*[MujTex(_) for _ in text]
).arrange(DOWN, buff=0.5)
self.next_section()
title = Title(r"Výhody práce s transformovanými diferenciálními rovnicemi")
self.add(title)
textTex.next_to(title,DOWN, buff=1)
for i in textTex:
self.play(GrowFromCenter(i))
self.wait()
self.next_section()