mirror of
https://github.com/3b1b/manim.git
synced 2025-08-21 05:44:04 +00:00
A few follow-ons to the t^3 example in eoc/chapter2
This commit is contained in:
parent
7cc8af025f
commit
4772acf779
1 changed files with 251 additions and 12 deletions
263
eoc/chapter2.py
263
eoc/chapter2.py
|
@ -1557,8 +1557,10 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
"x_labeled_nums" : range(1, 5),
|
"x_labeled_nums" : range(1, 5),
|
||||||
"graph_origin" : 2.5*DOWN + 6*LEFT,
|
"graph_origin" : 2.5*DOWN + 6*LEFT,
|
||||||
"start_time" : 2,
|
"start_time" : 2,
|
||||||
|
"end_time" : 0.5,
|
||||||
"start_dt" : 0.25,
|
"start_dt" : 0.25,
|
||||||
"secant_line_length" : 0,
|
"end_dt" : 0.001,
|
||||||
|
"secant_line_length" : 0.01,
|
||||||
}
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
self.draw_graph()
|
self.draw_graph()
|
||||||
|
@ -1567,6 +1569,7 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
self.add_ds_dt_group()
|
self.add_ds_dt_group()
|
||||||
self.brace_for_details()
|
self.brace_for_details()
|
||||||
self.show_expansion()
|
self.show_expansion()
|
||||||
|
self.react_to_simplicity()
|
||||||
|
|
||||||
def draw_graph(self):
|
def draw_graph(self):
|
||||||
self.setup_axes(animate = False)
|
self.setup_axes(animate = False)
|
||||||
|
@ -1663,13 +1666,18 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
self.play(ShowCreation(v_lines[0]))
|
self.play(ShowCreation(v_lines[0]))
|
||||||
self.dither()
|
self.dither()
|
||||||
self.play(
|
self.play(
|
||||||
dt.target.scale_in_place, 1.2,
|
dt.scale_in_place, 1.2,
|
||||||
rate_func = there_and_back
|
rate_func = there_and_back
|
||||||
)
|
)
|
||||||
self.dither(2)
|
self.dither(2)
|
||||||
self.play(Write(numerator))
|
self.play(Write(numerator))
|
||||||
self.play(ShowCreation(v_lines[1]))
|
self.play(ShowCreation(v_lines[1]))
|
||||||
self.dither()
|
self.dither()
|
||||||
|
self.play(
|
||||||
|
v_lines[0].highlight, YELLOW,
|
||||||
|
rate_func = there_and_back
|
||||||
|
)
|
||||||
|
self.dither()
|
||||||
self.play(Write(non_numerator))
|
self.play(Write(non_numerator))
|
||||||
self.dither(2)
|
self.dither(2)
|
||||||
self.play(
|
self.play(
|
||||||
|
@ -1716,8 +1724,8 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
expression = TexMobject("""
|
expression = TexMobject("""
|
||||||
\\frac{
|
\\frac{
|
||||||
2^3 +
|
2^3 +
|
||||||
3 (2)^2 dt +
|
3 (2)^2 dt
|
||||||
3 (2)(dt)^2 +
|
+ 3 (2)(dt)^2 +
|
||||||
(dt)^3
|
(dt)^3
|
||||||
- 2^3
|
- 2^3
|
||||||
}{dt}
|
}{dt}
|
||||||
|
@ -1732,8 +1740,8 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
)
|
)
|
||||||
term_lens = [
|
term_lens = [
|
||||||
len("23+"),
|
len("23+"),
|
||||||
len("3(2)2dt+"),
|
len("3(2)2dt"),
|
||||||
len("3(2)(dt)2+"),
|
len("+3(2)(dt)2+"),
|
||||||
len("(dt)3"),
|
len("(dt)3"),
|
||||||
len("-23"),
|
len("-23"),
|
||||||
len("_"),#frac bar
|
len("_"),#frac bar
|
||||||
|
@ -1748,8 +1756,8 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
]
|
]
|
||||||
|
|
||||||
dts = [
|
dts = [
|
||||||
VGroup(*terms[1][-3:-1]),
|
VGroup(*terms[1][-2:]),
|
||||||
VGroup(*terms[2][5:7]),
|
VGroup(*terms[2][6:8]),
|
||||||
VGroup(*terms[3][1:3]),
|
VGroup(*terms[3][1:3]),
|
||||||
terms[-1]
|
terms[-1]
|
||||||
]
|
]
|
||||||
|
@ -1775,13 +1783,244 @@ class TCubedExample(SecantLineToTangentLine):
|
||||||
self.play(*map(FadeOut, two_cubed_terms))
|
self.play(*map(FadeOut, two_cubed_terms))
|
||||||
numerator = VGroup(*terms[1:4])
|
numerator = VGroup(*terms[1:4])
|
||||||
self.play(
|
self.play(
|
||||||
numerator.scale, 1.3, numerator.get_bottom(),
|
numerator.scale, 1.4, numerator.get_bottom(),
|
||||||
terms[-1].scale, 1.3, terms[-1].get_top()
|
terms[-1].scale, 1.4, terms[-1].get_top()
|
||||||
)
|
)
|
||||||
|
self.dither(2)
|
||||||
|
|
||||||
#Cancel out dt
|
#Cancel out dt
|
||||||
#TODO
|
#This is all way too hacky...
|
||||||
|
faders = VGroup(
|
||||||
|
terms[-1],
|
||||||
|
VGroup(*terms[1][-2:]), #"3(2)^2 dt"
|
||||||
|
terms[2][-2], # "+3(2)(dt)2+"
|
||||||
|
terms[3][-1], # "(dt)3"
|
||||||
|
)
|
||||||
|
new_exp = TexMobject("2").replace(faders[-1], dim_to_match = 1)
|
||||||
|
self.play(
|
||||||
|
faders.highlight, BLACK,
|
||||||
|
run_time = 3,
|
||||||
|
submobject_mode = "lagged_start"
|
||||||
|
)
|
||||||
|
self.play(FadeIn(new_exp))
|
||||||
|
terms[3].add(new_exp)
|
||||||
|
shift_val = 0.4*DOWN
|
||||||
|
self.play(
|
||||||
|
FadeOut(terms[-2]),#frac_line
|
||||||
|
terms[1].shift, shift_val + 0.45*RIGHT,
|
||||||
|
terms[2].shift, shift_val,
|
||||||
|
terms[3].shift, shift_val,
|
||||||
|
)
|
||||||
|
|
||||||
|
#Isolate dominant term
|
||||||
|
arrow = Arrow(
|
||||||
|
self.lhs[4].get_bottom(), terms[1][2].get_top(),
|
||||||
|
color = WHITE,
|
||||||
|
buff = MED_BUFF
|
||||||
|
)
|
||||||
|
brace = Brace(VGroup(terms[2][0], terms[3][-1]), DOWN)
|
||||||
|
brace_text = brace.get_text("Contains $dt$")
|
||||||
|
VGroup(*brace_text[-2:]).highlight(TIME_COLOR)
|
||||||
|
|
||||||
|
self.play(ShowCreation(arrow))
|
||||||
|
self.dither()
|
||||||
|
self.play(
|
||||||
|
GrowFromCenter(brace),
|
||||||
|
Write(brace_text)
|
||||||
|
)
|
||||||
|
self.dither(2)
|
||||||
|
|
||||||
|
#Shink dt
|
||||||
|
faders = VGroup(*terms[2:4] + [brace, brace_text])
|
||||||
|
def ds_dt_group_update(group, alpha):
|
||||||
|
new_dt = interpolate(self.start_dt, self.end_dt, alpha)
|
||||||
|
new_group = self.get_ds_dt_group(new_dt)
|
||||||
|
Transform(group, new_group).update(1)
|
||||||
|
self.play(FadeOut(self.vertical_lines))
|
||||||
|
self.play(
|
||||||
|
UpdateFromAlphaFunc(self.ds_dt_group, ds_dt_group_update),
|
||||||
|
faders.fade, 0.7,
|
||||||
|
run_time = 5
|
||||||
|
)
|
||||||
|
self.dither(2)
|
||||||
|
|
||||||
|
#Show as derivative
|
||||||
|
deriv_term = VGroup(*terms[1][:5])
|
||||||
|
deriv_term.generate_target()
|
||||||
|
lhs_copy = self.lhs.copy()
|
||||||
|
lhs_copy.generate_target()
|
||||||
|
lhs_copy.target.shift(3*DOWN)
|
||||||
|
#hack a little, hack a lot
|
||||||
|
deriv_term.target.scale(1.1)
|
||||||
|
deriv_term.target.next_to(lhs_copy.target)
|
||||||
|
deriv_term.target.shift(0.07*DOWN)
|
||||||
|
|
||||||
|
self.play(
|
||||||
|
FadeOut(arrow),
|
||||||
|
FadeOut(faders),
|
||||||
|
MoveToTarget(deriv_term),
|
||||||
|
MoveToTarget(lhs_copy),
|
||||||
|
)
|
||||||
|
arrow = Arrow(
|
||||||
|
self.rhs.get_bottom(), deriv_term.target.get_top(),
|
||||||
|
buff = MED_BUFF,
|
||||||
|
color = WHITE
|
||||||
|
)
|
||||||
|
approach_text = TextMobject("As $dt \\to 0$")
|
||||||
|
approach_text.next_to(arrow.get_center(), RIGHT)
|
||||||
|
VGroup(*approach_text[2:4]).highlight(TIME_COLOR)
|
||||||
|
self.play(
|
||||||
|
ShowCreation(arrow),
|
||||||
|
Write(approach_text)
|
||||||
|
)
|
||||||
|
self.dither(2)
|
||||||
|
self.secant_line_length = 10
|
||||||
|
self.play(Transform(
|
||||||
|
self.ds_dt_group,
|
||||||
|
self.get_ds_dt_group(self.end_dt)
|
||||||
|
))
|
||||||
|
self.dither()
|
||||||
|
|
||||||
|
#Generalize to more t
|
||||||
|
twos = [
|
||||||
|
self.lhs[6],
|
||||||
|
self.rhs[2],
|
||||||
|
self.rhs[10],
|
||||||
|
lhs_copy[6],
|
||||||
|
deriv_term[2]
|
||||||
|
]
|
||||||
|
for two in twos:
|
||||||
|
two.target = TexMobject("t")
|
||||||
|
two.target.replace(two, dim_to_match = 1)
|
||||||
|
self.play(*map(MoveToTarget, twos))
|
||||||
|
def update_as_tangent_line(group, alpha):
|
||||||
|
self.curr_time = interpolate(self.start_time, self.end_time, alpha)
|
||||||
|
new_group = self.get_ds_dt_group(self.end_dt)
|
||||||
|
Transform(group, new_group).update(1)
|
||||||
|
self.play(
|
||||||
|
UpdateFromAlphaFunc(self.ds_dt_group, update_as_tangent_line),
|
||||||
|
run_time = 5,
|
||||||
|
rate_func = there_and_back
|
||||||
|
)
|
||||||
|
self.dither(2)
|
||||||
|
|
||||||
|
self.lhs_copy = lhs_copy
|
||||||
|
self.deriv_term = deriv_term
|
||||||
|
self.approach_text = approach_text
|
||||||
|
|
||||||
|
def react_to_simplicity(self):
|
||||||
|
morty = Mortimer().flip().to_corner(DOWN+LEFT)
|
||||||
|
|
||||||
|
self.play(FadeIn(morty))
|
||||||
|
self.play(PiCreatureSays(
|
||||||
|
morty, "That's \\\\ beautiful!",
|
||||||
|
target_mode = "hooray"
|
||||||
|
))
|
||||||
|
self.play(Blink(morty))
|
||||||
|
self.play(
|
||||||
|
morty.change_mode, 'happy',
|
||||||
|
*map(FadeOut, [morty.bubble, morty.bubble.content])
|
||||||
|
)
|
||||||
|
|
||||||
|
numerator = VGroup(*self.rhs[:12])
|
||||||
|
denominator = VGroup(*self.rhs[-2:])
|
||||||
|
for mob in numerator, denominator, self.approach_text, self.deriv_term:
|
||||||
|
mob.generate_target()
|
||||||
|
mob.target.scale_in_place(1.2)
|
||||||
|
mob.target.highlight(MAROON_B)
|
||||||
|
self.play(
|
||||||
|
MoveToTarget(
|
||||||
|
mob, rate_func = there_and_back,
|
||||||
|
run_time = 1.5,
|
||||||
|
),
|
||||||
|
morty.look_at, mob
|
||||||
|
)
|
||||||
|
self.dither()
|
||||||
|
self.play(Blink(morty))
|
||||||
|
self.dither()
|
||||||
|
|
||||||
|
class YouWouldntDoThisEveryTime(TeacherStudentsScene):
|
||||||
|
def construct(self):
|
||||||
|
self.change_student_modes(
|
||||||
|
"pleading", "guilty", "hesitant",
|
||||||
|
run_time = 0
|
||||||
|
)
|
||||||
|
self.teacher_says(
|
||||||
|
"You wouldn't do this \\\\ every time"
|
||||||
|
)
|
||||||
|
self.change_student_modes(*["happy"]*3)
|
||||||
|
self.dither(2)
|
||||||
|
self.student_thinks(
|
||||||
|
"$\\frac{d(t^3)}{dt} = 3t^2$",
|
||||||
|
)
|
||||||
|
self.dither(3)
|
||||||
|
|
||||||
|
series = VideoSeries()
|
||||||
|
series.scale_to_fit_width(2*SPACE_WIDTH-1)
|
||||||
|
series.to_edge(UP)
|
||||||
|
this_video = series[1]
|
||||||
|
next_video = series[2]
|
||||||
|
this_video.save_state()
|
||||||
|
this_video.highlight(YELLOW)
|
||||||
|
self.play(FadeIn(series, submobject_mode = "lagged_start"))
|
||||||
|
self.play(
|
||||||
|
this_video.restore,
|
||||||
|
next_video.highlight, YELLOW,
|
||||||
|
next_video.shift, 0.5*DOWN
|
||||||
|
)
|
||||||
|
self.dither(2)
|
||||||
|
|
||||||
|
class ContrastConcreteDtWithLimit(Scene):
|
||||||
|
def construct(self):
|
||||||
|
v_line = Line(UP, DOWN).scale(SPACE_HEIGHT)
|
||||||
|
self.add(v_line)
|
||||||
|
|
||||||
|
l_title = TextMobject("""
|
||||||
|
If $dt$ has a
|
||||||
|
specific size.
|
||||||
|
""")
|
||||||
|
VGroup(*l_title[2:4]).highlight(TIME_COLOR)
|
||||||
|
r_title = TexMobject("dt \\to 0")
|
||||||
|
VGroup(*r_title[:2]).highlight(TIME_COLOR)
|
||||||
|
for title, vect in (l_title, LEFT), (r_title, RIGHT):
|
||||||
|
title.to_edge(UP)
|
||||||
|
title.shift(SPACE_WIDTH*vect/2)
|
||||||
|
self.add(title)
|
||||||
|
|
||||||
|
l_formula = TexMobject("""
|
||||||
|
\\frac{d(t^3)}{dt} =
|
||||||
|
\\frac{
|
||||||
|
t^3+
|
||||||
|
3t^2 \\, dt +
|
||||||
|
3t \\, (dt)^2 +
|
||||||
|
(dt)^3
|
||||||
|
- t^3
|
||||||
|
}{dt}
|
||||||
|
""")
|
||||||
|
VGroup(*it.chain(
|
||||||
|
l_formula[6:8],
|
||||||
|
l_formula[15:17],
|
||||||
|
l_formula[21:23],
|
||||||
|
l_formula[27:29],
|
||||||
|
l_formula[35:37],
|
||||||
|
)).highlight(TIME_COLOR)
|
||||||
|
l_formula.scale_to_fit_width(SPACE_WIDTH-2*MED_BUFF)
|
||||||
|
l_formula.to_edge(LEFT)
|
||||||
|
|
||||||
|
l_brace = Brace(l_formula, DOWN)
|
||||||
|
l_text = l_brace.get_text("Messy")
|
||||||
|
l_text.highlight(RED)
|
||||||
|
|
||||||
|
r_formula = TexMobject(
|
||||||
|
"\\frac{d(t^3)}{dt} = 3t^2"
|
||||||
|
)
|
||||||
|
VGroup(*r_formula[6:8]).highlight(TIME_COLOR)
|
||||||
|
r_formula.shift(SPACE_WIDTH*RIGHT/2)
|
||||||
|
r_brace = Brace(r_formula, DOWN)
|
||||||
|
r_text = r_brace.get_text("Simple")
|
||||||
|
r_text.highlight(GREEN)
|
||||||
|
|
||||||
|
self.add(r_formula, r_brace, r_text, l_formula, l_brace, l_text)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue