mirror of
https://github.com/3b1b/manim.git
synced 2025-07-28 12:32:36 +08:00
Move gradient and mvrc to old_projects
This commit is contained in:
393
old_projects/gradient.py
Normal file
393
old_projects/gradient.py
Normal file
@ -0,0 +1,393 @@
|
||||
from big_ol_pile_of_manim_imports import *
|
||||
|
||||
|
||||
class GradientDescentWrapper(Scene):
|
||||
def construct(self):
|
||||
title = TextMobject("Gradient descent")
|
||||
title.to_edge(UP)
|
||||
rect = ScreenRectangle(height=6)
|
||||
rect.next_to(title, DOWN)
|
||||
|
||||
self.add(title)
|
||||
self.play(ShowCreation(rect))
|
||||
self.wait()
|
||||
|
||||
|
||||
class ShowSimpleMultivariableFunction(Scene):
|
||||
def construct(self):
|
||||
scale_val = 1.5
|
||||
|
||||
func_tex = TexMobject(
|
||||
"C(", "x_1,", "x_2,", "\\dots,", "x_n", ")", "=",
|
||||
)
|
||||
func_tex.scale(scale_val)
|
||||
func_tex.shift(2 * LEFT)
|
||||
alt_func_tex = TexMobject(
|
||||
"C(", "x,", "y", ")", "="
|
||||
)
|
||||
alt_func_tex.scale(scale_val)
|
||||
for tex in func_tex, alt_func_tex:
|
||||
tex.set_color_by_tex_to_color_map({
|
||||
"C(": RED,
|
||||
")": RED,
|
||||
})
|
||||
alt_func_tex.move_to(func_tex, RIGHT)
|
||||
inputs = func_tex[1:-2]
|
||||
self.add(func_tex)
|
||||
|
||||
many_inputs = TexMobject(*[
|
||||
"x_{%d}, " % d for d in range(1, 25)
|
||||
])
|
||||
many_inputs.scale_to_fit_width(FRAME_WIDTH)
|
||||
many_inputs.to_edge(UL)
|
||||
|
||||
inputs_brace = Brace(inputs, UP)
|
||||
inputs_brace_text = inputs_brace.get_text("Multiple inputs")
|
||||
|
||||
decimal = DecimalNumber(0)
|
||||
decimal.scale(scale_val)
|
||||
decimal.next_to(tex, RIGHT)
|
||||
value_tracker = ValueTracker(0)
|
||||
self.add(ContinualMovement(value_tracker, rate=0.5))
|
||||
decimal_change = ContinualChangingDecimal(
|
||||
decimal,
|
||||
lambda a: 1 + np.sin(value_tracker.get_value())
|
||||
)
|
||||
self.add(decimal_change)
|
||||
|
||||
output_brace = Brace(decimal, DOWN)
|
||||
output_brace_text = output_brace.get_text("Single output")
|
||||
|
||||
self.wait(2)
|
||||
self.play(GrowFromCenter(inputs_brace))
|
||||
self.play(Write(inputs_brace_text))
|
||||
self.play(GrowFromCenter(output_brace))
|
||||
self.play(Write(output_brace_text))
|
||||
self.wait(3)
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
inputs,
|
||||
many_inputs[:len(inputs)]
|
||||
),
|
||||
LaggedStart(
|
||||
FadeIn,
|
||||
many_inputs[len(inputs):]
|
||||
),
|
||||
FadeOut(inputs_brace),
|
||||
FadeOut(inputs_brace_text),
|
||||
)
|
||||
self.wait()
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
func_tex[0], alt_func_tex[0]
|
||||
),
|
||||
Write(alt_func_tex[1:3]),
|
||||
LaggedStart(FadeOutAndShiftDown, many_inputs)
|
||||
)
|
||||
self.wait(3)
|
||||
|
||||
|
||||
class ShowGraphWithVectors(ExternallyAnimatedScene):
|
||||
pass
|
||||
|
||||
|
||||
class ShowFunction(Scene):
|
||||
def construct(self):
|
||||
func = TexMobject(
|
||||
"f(x, y) = e^{-x^2 + \\cos(2y)}",
|
||||
tex_to_color_map={
|
||||
"x": BLUE,
|
||||
"y": RED,
|
||||
}
|
||||
)
|
||||
func.scale(1.5)
|
||||
self.play(FadeInFromDown(func))
|
||||
self.wait()
|
||||
|
||||
|
||||
class ShowExampleFunctionGraph(ExternallyAnimatedScene):
|
||||
pass
|
||||
|
||||
|
||||
class ShowGradient(Scene):
|
||||
def construct(self):
|
||||
lhs = TexMobject(
|
||||
"\\nabla f(x, y)=",
|
||||
tex_to_color_map={"x": BLUE, "y": RED}
|
||||
)
|
||||
vector = Matrix([
|
||||
["\\partial f / \\partial x"],
|
||||
["\\partial f / \\partial y"],
|
||||
], v_buff=1)
|
||||
gradient = VGroup(lhs, vector)
|
||||
gradient.arrange_submobjects(RIGHT, buff=SMALL_BUFF)
|
||||
gradient.scale(1.5)
|
||||
|
||||
del_x, del_y = partials = vector.get_entries()
|
||||
background_rects = VGroup()
|
||||
for partial, color in zip(partials, [BLUE, RED]):
|
||||
partial[-1].set_color(color)
|
||||
partial.rect = SurroundingRectangle(
|
||||
partial, buff=MED_SMALL_BUFF
|
||||
)
|
||||
partial.rect.set_stroke(width=0)
|
||||
partial.rect.set_fill(color=color, opacity=0.5)
|
||||
background_rects.add(partial.rect.copy())
|
||||
background_rects.set_fill(opacity=0.1)
|
||||
|
||||
partials.set_fill(opacity=0)
|
||||
|
||||
self.play(
|
||||
LaggedStart(FadeIn, gradient),
|
||||
LaggedStart(
|
||||
FadeIn, background_rects,
|
||||
rate_func=squish_rate_func(smooth, 0.5, 1)
|
||||
)
|
||||
)
|
||||
self.wait()
|
||||
for partial in partials:
|
||||
self.play(DrawBorderThenFill(partial.rect))
|
||||
self.wait()
|
||||
self.play(FadeOut(partial.rect))
|
||||
self.wait()
|
||||
for partial in partials:
|
||||
self.play(Write(partial))
|
||||
self.wait()
|
||||
|
||||
|
||||
class ExampleGraphHoldXConstant(ExternallyAnimatedScene):
|
||||
pass
|
||||
|
||||
|
||||
class ExampleGraphHoldYConstant(ExternallyAnimatedScene):
|
||||
pass
|
||||
|
||||
|
||||
class TakePartialDerivatives(Scene):
|
||||
def construct(self):
|
||||
tex_to_color_map = {
|
||||
"x": BLUE,
|
||||
"y": RED,
|
||||
}
|
||||
func_tex = TexMobject(
|
||||
"f", "(", "x", ",", "y", ")", "=",
|
||||
"e^{", "-x^2", "+ \\cos(2y)}",
|
||||
tex_to_color_map=tex_to_color_map
|
||||
)
|
||||
partial_x = TexMobject(
|
||||
"{\\partial", "f", "\\over", "\\partial", "x}", "=",
|
||||
"\\left(", "e^", "{-x^2", "+ \\cos(2y)}", "\\right)",
|
||||
"(", "-2", "x", ")",
|
||||
tex_to_color_map=tex_to_color_map,
|
||||
)
|
||||
partial_y = TexMobject(
|
||||
"{\\partial", "f", "\\over", "\\partial", "y}", "=",
|
||||
"\\left(", "e^", "{-x^2", "+ \\cos(", "2", "y)}", "\\right)",
|
||||
"(", "-\\sin(", "2", "y)", "\\cdot 2", ")",
|
||||
tex_to_color_map=tex_to_color_map,
|
||||
)
|
||||
partials = VGroup(partial_x, partial_y)
|
||||
for mob in func_tex, partials:
|
||||
mob.scale(1.5)
|
||||
|
||||
func_tex.move_to(2 * UP + 3 * LEFT)
|
||||
for partial in partials:
|
||||
partial.next_to(func_tex, DOWN, buff=LARGE_BUFF)
|
||||
top_eq_x = func_tex.get_part_by_tex("=").get_center()[0]
|
||||
low_eq_x = partial.get_part_by_tex("=").get_center()[0]
|
||||
partial.shift((top_eq_x - low_eq_x) * RIGHT)
|
||||
|
||||
index = func_tex.index_of_part_by_tex("e^")
|
||||
exp_rect = SurroundingRectangle(func_tex[index + 1:], buff=0)
|
||||
exp_rect.set_stroke(width=0)
|
||||
exp_rect.set_fill(GREEN, opacity=0.5)
|
||||
|
||||
xs = func_tex.get_parts_by_tex("x", substring=False)
|
||||
ys = func_tex.get_parts_by_tex("y", substring=False)
|
||||
for terms in xs, ys:
|
||||
terms.rects = VGroup(*[
|
||||
SurroundingRectangle(term, buff=0.5 * SMALL_BUFF)
|
||||
for term in terms
|
||||
])
|
||||
terms.arrows = VGroup(*[
|
||||
Vector(0.5 * DOWN).next_to(rect, UP, SMALL_BUFF)
|
||||
for rect in terms.rects
|
||||
])
|
||||
treat_as_constant = TextMobject("Treat as a constant")
|
||||
treat_as_constant.next_to(ys.arrows[1], UP)
|
||||
|
||||
# Start to show partial_x
|
||||
self.play(FadeInFromDown(func_tex))
|
||||
self.wait()
|
||||
self.play(
|
||||
ReplacementTransform(func_tex[0].copy(), partial_x[1]),
|
||||
Write(partial_x[0]),
|
||||
Write(partial_x[2:4]),
|
||||
Write(partial_x[6]),
|
||||
)
|
||||
self.play(
|
||||
ReplacementTransform(func_tex[2].copy(), partial_x[4])
|
||||
)
|
||||
self.wait()
|
||||
|
||||
# Label y as constant
|
||||
self.play(LaggedStart(ShowCreation, ys.rects))
|
||||
self.play(
|
||||
LaggedStart(GrowArrow, ys.arrows, lag_ratio=0.8),
|
||||
Write(treat_as_constant)
|
||||
)
|
||||
self.wait(2)
|
||||
|
||||
# Perform partial_x derivative
|
||||
self.play(FadeIn(exp_rect), Animation(func_tex))
|
||||
self.wait()
|
||||
pxi1 = 8
|
||||
pxi2 = 15
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
func_tex[7:].copy(),
|
||||
partial_x[pxi1:pxi2],
|
||||
),
|
||||
FadeIn(partial_x[pxi1 - 1:pxi1]),
|
||||
FadeIn(partial_x[pxi2]),
|
||||
)
|
||||
self.wait(2)
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
partial_x[10:12].copy(),
|
||||
partial_x[pxi2 + 2:pxi2 + 4],
|
||||
path_arc=-(TAU / 4)
|
||||
),
|
||||
FadeIn(partial_x[pxi2 + 1]),
|
||||
FadeIn(partial_x[-1]),
|
||||
)
|
||||
self.wait(2)
|
||||
|
||||
# Swap out partial_x for partial_y
|
||||
self.play(
|
||||
FadeOutAndShiftDown(partial_x),
|
||||
FadeOut(ys.rects),
|
||||
FadeOut(ys.arrows),
|
||||
FadeOut(treat_as_constant),
|
||||
FadeOut(exp_rect),
|
||||
Animation(func_tex)
|
||||
)
|
||||
self.play(FadeInFromDown(partial_y[:7]))
|
||||
self.wait()
|
||||
|
||||
treat_as_constant.next_to(xs.arrows[1], UP, SMALL_BUFF)
|
||||
self.play(
|
||||
LaggedStart(ShowCreation, xs.rects),
|
||||
LaggedStart(GrowArrow, xs.arrows),
|
||||
Write(treat_as_constant),
|
||||
lag_ratio=0.8
|
||||
)
|
||||
self.wait()
|
||||
|
||||
# Show same outer derivative
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
func_tex[7:].copy(),
|
||||
partial_x[pxi1:pxi2],
|
||||
),
|
||||
FadeIn(partial_x[pxi1 - 2:pxi1]),
|
||||
FadeIn(partial_x[pxi2]),
|
||||
)
|
||||
self.wait()
|
||||
self.play(
|
||||
ReplacementTransform(
|
||||
partial_y[12:16].copy(),
|
||||
partial_y[pxi2 + 3:pxi2 + 7],
|
||||
path_arc=-(TAU / 4)
|
||||
),
|
||||
FadeIn(partial_y[pxi2 + 2]),
|
||||
FadeIn(partial_y[-1]),
|
||||
)
|
||||
self.wait()
|
||||
self.play(ReplacementTransform(
|
||||
partial_y[-5].copy(),
|
||||
partial_y[-2],
|
||||
path_arc=-PI
|
||||
))
|
||||
self.wait()
|
||||
|
||||
|
||||
class ShowDerivativeAtExamplePoint(Scene):
|
||||
def construct(self):
|
||||
tex_to_color_map = {
|
||||
"x": BLUE,
|
||||
"y": RED,
|
||||
}
|
||||
func_tex = TexMobject(
|
||||
"f", "(", "x", ",", "y", ")", "=",
|
||||
"e^{", "-x^2", "+ \\cos(2y)}",
|
||||
tex_to_color_map=tex_to_color_map
|
||||
)
|
||||
gradient_tex = TexMobject(
|
||||
"\\nabla", "f", "(", "x", ",", "y", ")", "=",
|
||||
tex_to_color_map=tex_to_color_map
|
||||
)
|
||||
|
||||
partial_vect = Matrix([
|
||||
["{\\partial f / \\partial x}"],
|
||||
["{\\partial f / \\partial y}"],
|
||||
])
|
||||
partial_vect.get_mob_matrix()[0, 0][-1].set_color(BLUE)
|
||||
partial_vect.get_mob_matrix()[1, 0][-1].set_color(RED)
|
||||
result_vector = self.get_result_vector("x", "y")
|
||||
|
||||
gradient = VGroup(
|
||||
gradient_tex,
|
||||
partial_vect,
|
||||
TexMobject("="),
|
||||
result_vector
|
||||
)
|
||||
gradient.arrange_submobjects(RIGHT, buff=SMALL_BUFF)
|
||||
|
||||
func_tex.to_edge(UP)
|
||||
gradient.next_to(func_tex, DOWN, buff=LARGE_BUFF)
|
||||
|
||||
example_lhs = TexMobject(
|
||||
"\\nabla", "f", "(", "1", ",", "3", ")", "=",
|
||||
tex_to_color_map={"1": BLUE, "3": RED},
|
||||
)
|
||||
example_result_vector = self.get_result_vector("1", "3")
|
||||
example_rhs = DecimalMatrix([[-1.92], [0.54]])
|
||||
example = VGroup(
|
||||
example_lhs,
|
||||
example_result_vector,
|
||||
TexMobject("="),
|
||||
example_rhs,
|
||||
)
|
||||
example.arrange_submobjects(RIGHT, buff=SMALL_BUFF)
|
||||
example.next_to(gradient, DOWN, LARGE_BUFF)
|
||||
|
||||
self.add(func_tex, gradient)
|
||||
self.wait()
|
||||
self.play(
|
||||
ReplacementTransform(gradient_tex.copy(), example_lhs),
|
||||
ReplacementTransform(result_vector.copy(), example_result_vector),
|
||||
)
|
||||
self.wait()
|
||||
self.play(Write(example[2:]))
|
||||
self.wait()
|
||||
|
||||
def get_result_vector(self, x, y):
|
||||
result_vector = Matrix([
|
||||
["e^{-%s^2 + \\cos(2\\cdot %s)} (-2\\cdot %s)" % (x, y, x)],
|
||||
["e^{-%s^2 + \\cos(2\\cdot %s)} \\big(-\\sin(2\\cdot %s) \\cdot 2\\big)" % (x, y, y)],
|
||||
], v_buff=1.2, element_alignment_corner=ORIGIN)
|
||||
|
||||
x_terms = VGroup(
|
||||
result_vector.get_mob_matrix()[0, 0][2],
|
||||
result_vector.get_mob_matrix()[1, 0][2],
|
||||
result_vector.get_mob_matrix()[0, 0][-2],
|
||||
)
|
||||
y_terms = VGroup(
|
||||
result_vector.get_mob_matrix()[0, 0][11],
|
||||
result_vector.get_mob_matrix()[1, 0][11],
|
||||
result_vector.get_mob_matrix()[1, 0][-5],
|
||||
)
|
||||
x_terms.set_color(BLUE)
|
||||
y_terms.set_color(RED)
|
||||
return result_vector
|
Reference in New Issue
Block a user