mirror of
https://github.com/3b1b/manim.git
synced 2025-08-01 08:54:38 +08:00
EpsilonDeltaCounterExample
This commit is contained in:
@ -1206,6 +1206,14 @@ class LimitCounterExample(GraphLimitExpression):
|
|||||||
"small_delta" : 0.05,
|
"small_delta" : 0.05,
|
||||||
}
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
|
self.add_func()
|
||||||
|
self.setup_axes()
|
||||||
|
self.draw_graph()
|
||||||
|
self.approach_zero()
|
||||||
|
self.write_limit_not_defined()
|
||||||
|
self.show_epsilon_delta_intuition()
|
||||||
|
|
||||||
|
def add_func(self):
|
||||||
def func(h):
|
def func(h):
|
||||||
square = 0.25*h**2
|
square = 0.25*h**2
|
||||||
if h < 0:
|
if h < 0:
|
||||||
@ -1214,12 +1222,6 @@ class LimitCounterExample(GraphLimitExpression):
|
|||||||
return square + 2
|
return square + 2
|
||||||
self.func = func
|
self.func = func
|
||||||
|
|
||||||
self.setup_axes()
|
|
||||||
self.draw_graph()
|
|
||||||
self.approach_zero()
|
|
||||||
self.write_limit_not_defined()
|
|
||||||
self.show_epsilon_delta_intuition()
|
|
||||||
|
|
||||||
def draw_graph(self):
|
def draw_graph(self):
|
||||||
epsilon = 0.1
|
epsilon = 0.1
|
||||||
left_graph, right_graph = [
|
left_graph, right_graph = [
|
||||||
@ -1623,9 +1625,78 @@ class EpsilonDeltaExample(GraphLimitExpression, ZoomedScene):
|
|||||||
result.digest_mobject_attrs()
|
result.digest_mobject_attrs()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
class EpsilonDeltaCounterExample(LimitCounterExample, EpsilonDeltaExample):
|
||||||
|
def construct(self):
|
||||||
|
self.add_func()
|
||||||
|
self.setup_axes()
|
||||||
|
self.draw_graph()
|
||||||
|
self.introduce_epsilon()
|
||||||
|
self.introduce_epsilon_delta_group()
|
||||||
|
self.move_epsilon_group_up_and_down()
|
||||||
|
|
||||||
|
def introduce_epsilon(self):
|
||||||
|
epsilon_group = self.get_epsilon_group(0.4, 1.5)
|
||||||
|
rhs = TexMobject("=0.4")
|
||||||
|
label = epsilon_group.labels[1]
|
||||||
|
rhs.next_to(label, RIGHT)
|
||||||
|
epsilon_group.add(rhs)
|
||||||
|
|
||||||
|
self.play(ShowCreation(epsilon_group.limit_line))
|
||||||
|
self.play(*it.chain(
|
||||||
|
[
|
||||||
|
ReplacementTransform(
|
||||||
|
epsilon_group.limit_line.copy(),
|
||||||
|
line
|
||||||
|
)
|
||||||
|
for line in epsilon_group.epsilon_lines
|
||||||
|
],
|
||||||
|
map(GrowFromCenter, epsilon_group.braces)
|
||||||
|
))
|
||||||
|
self.play(*map(Write, epsilon_group.labels))
|
||||||
|
self.play(Write(rhs))
|
||||||
|
self.dither()
|
||||||
|
|
||||||
|
self.epsilon_group = epsilon_group
|
||||||
|
|
||||||
|
def introduce_epsilon_delta_group(self):
|
||||||
|
ed_group = self.get_epsilon_delta_group(self.big_delta)
|
||||||
|
|
||||||
|
self.play(*map(ShowCreation, ed_group.delta_lines))
|
||||||
|
self.play(ShowCreation(ed_group.input_range))
|
||||||
|
self.play(ReplacementTransform(
|
||||||
|
ed_group.input_range.copy(),
|
||||||
|
ed_group.output_range,
|
||||||
|
run_time = 2
|
||||||
|
))
|
||||||
|
self.play(*map(GrowFromCenter, ed_group.epsilon_lines))
|
||||||
|
self.dither(2)
|
||||||
|
self.animate_epsilon_delta_group_change(
|
||||||
|
ed_group, target_delta = self.small_delta,
|
||||||
|
run_time = 3
|
||||||
|
)
|
||||||
|
ed_group.delta = self.small_delta
|
||||||
|
self.dither()
|
||||||
|
|
||||||
|
self.ed_group = ed_group
|
||||||
|
|
||||||
|
def move_epsilon_group_up_and_down(self):
|
||||||
|
vects = [
|
||||||
|
self.coords_to_point(0, 2) - self.coords_to_point(0, 1.5),
|
||||||
|
self.coords_to_point(0, 1) - self.coords_to_point(0, 2),
|
||||||
|
]
|
||||||
|
for vect in vects:
|
||||||
|
self.play(self.epsilon_group.shift, vect)
|
||||||
|
self.dither()
|
||||||
|
self.shake_ed_group()
|
||||||
|
self.dither()
|
||||||
|
|
||||||
|
##
|
||||||
|
|
||||||
|
def shake_ed_group(self):
|
||||||
|
self.animate_epsilon_delta_group_change(
|
||||||
|
self.ed_group, target_delta = self.big_delta,
|
||||||
|
rate_func = lambda t : 0.2*there_and_back(2*t%1)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -129,7 +129,10 @@ class TexMobject(SVGMobject):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
## TODO, is this the best way?
|
## The shallow copy method usually only cares about
|
||||||
|
## points and submobjects, but for TexMobjects with
|
||||||
|
## multiple parts the original_submobject list should
|
||||||
|
## be updated as well.
|
||||||
copy_mobject = SVGMobject.copy(self)
|
copy_mobject = SVGMobject.copy(self)
|
||||||
if hasattr(self, "expression_parts"):
|
if hasattr(self, "expression_parts"):
|
||||||
pairs = zip(
|
pairs = zip(
|
||||||
|
Reference in New Issue
Block a user