Skip to content

Instantly share code, notes, and snippets.

@eemmikail
Last active August 12, 2025 16:24
Show Gist options
  • Save eemmikail/a991a4d24f5c417e85d26229a047bc50 to your computer and use it in GitHub Desktop.
Save eemmikail/a991a4d24f5c417e85d26229a047bc50 to your computer and use it in GitHub Desktop.

GaussYokEtme Animasyon

Manim docker kurulum

docker pull manimcommunity/manim:stable

Manim kod çalıştırma

docker run --rm -it   -v "$PWD":/manim   --user="$(id -u):$(id -g)"   manimcommunity/manim:stable   manim -qm manim_test.py GaussElimination

Örnek kod

#manim_test.py
from manim import *
import numpy as np

class GaussElimination(Scene):
    def construct(self):
        # A ve b
        A = [[2, -1, 1],
             [4,  2, 2],
             [-2, 2, 1]]
        b = [3, 10, -1]
        data = [row + [b_i] for row, b_i in zip(A, b)]
        rows, cols = len(data), len(data[0])

        title = Text("Gauss Yok Etme ve Geri Yerine Koyma", font_size=36).to_edge(UP)

        # Artırılmış matris (MathTex hücreler)
        matrix = Matrix(
            data,
            element_to_mobject=lambda x: MathTex(str(x)),
        ).scale(0.9)

        self.play(FadeIn(title, shift=UP))
        self.play(Write(matrix))

        entries = list(matrix.get_entries())
        def cell(i, j): return entries[i * cols + j]

        # (A|b) ayırıcı çizgi
        x_sep = 0.5 * (cell(0, cols-2).get_right()[0] + cell(0, cols-1).get_left()[0])
        vbar = Line(
            start=[x_sep, matrix.get_top()[1], 0],
            end=[x_sep,  matrix.get_bottom()[1], 0]
        )
        self.play(Create(vbar))

        upper_text = Text("Üst üçgensel form elde edildi", font_size=28).next_to(matrix, DOWN)
        aug = VGroup(matrix, vbar, upper_text)  # birlikte kayacaklar

        def set_row(i, values, run_time=1.05):
            new_cells, anims = [], []
            for j, val in enumerate(values):
                new_tex = MathTex(str(val)).move_to(cell(i, j))
                anims.append(ReplacementTransform(cell(i, j), new_tex))
                new_cells.append(new_tex)
            self.play(*anims, lag_ratio=0.08, run_time=run_time)
            for j in range(cols):
                entries[i * cols + j] = new_cells[j]

        def highlight(i, j, color=YELLOW):
            return SurroundingRectangle(cell(i, j), color=color, buff=0.1)

        # ---------- İleri yok etme ----------
        box = highlight(0, 0, YELLOW); self.play(Create(box)); self.wait(0.1); self.play(FadeOut(box))
        op = MathTex(r"R_2 \leftarrow R_2 - 2R_1").next_to(matrix, DOWN)
        self.play(Write(op)); set_row(1, [0, 4, 0, 4]); self.play(FadeOut(op))

        op = MathTex(r"R_3 \leftarrow R_3 + R_1").next_to(matrix, DOWN)
        self.play(Write(op)); set_row(2, [0, 1, 2, 2]); self.play(FadeOut(op))

        box = highlight(1, 1, GREEN); self.play(Create(box)); self.wait(0.1); self.play(FadeOut(box))
        op = MathTex(r"R_3 \leftarrow R_3 - \tfrac{1}{4} R_2").next_to(matrix, DOWN)
        self.play(Write(op)); set_row(2, [0, 0, 2, 1]); self.play(FadeOut(op))

        self.play(FadeIn(upper_text)); self.wait(0.35)

        # Matris bloğunu sola açalım
        self.play(aug.animate.to_edge(LEFT, buff=0.9))

        # ---------- Geri yerine koyma (ortada sabit) ----------
        eq_scale, line_gap = 0.9, 0.25
        right_x = config.frame_width / 2
        mid_x = 0.5 * (aug.get_right()[0] + right_x)
        top_y = (config.frame_height / 2) - 0.9
        eq_anchor = VectorizedPoint(np.array([mid_x, top_y, 0]))

        # z
        z_box = highlight(2, 2, BLUE); rhs_box3 = highlight(2, 3, BLUE_E)
        eq_z = MathTex(r"2z = 1 \Rightarrow z = \tfrac{1}{2}").scale(eq_scale)
        eq_z.next_to(eq_anchor, DOWN, aligned_edge=LEFT)
        self.play(Create(z_box), Create(rhs_box3), Write(eq_z)); self.wait(0.25)
        self.play(FadeOut(z_box), FadeOut(rhs_box3))

        # y
        y_box = highlight(1, 1, BLUE); rhs_box2 = highlight(1, 3, BLUE_E); zeroz = highlight(1, 2, GREY)
        eq_y = MathTex(r"4y = 4 \Rightarrow y = 1").scale(eq_scale)
        eq_y.next_to(eq_z, DOWN, aligned_edge=LEFT, buff=line_gap)
        self.play(Create(y_box), Create(rhs_box2), Create(zeroz), Write(eq_y)); self.wait(0.25)
        self.play(FadeOut(y_box), FadeOut(rhs_box2), FadeOut(zeroz))

        # x adımları
        x_boxs = VGroup(highlight(0, 0, BLUE), highlight(0, 1, BLUE_E),
                        highlight(0, 2, BLUE_E), highlight(0, 3, BLUE_E))
        self.play(Create(x_boxs))

        eq1 = MathTex(r"2x - y + z = 3").scale(eq_scale)
        eq2 = MathTex(r"2x - 1 + \tfrac{1}{2} = 3").scale(eq_scale)
        eq3 = MathTex(r"2x - \tfrac{1}{2} = 3").scale(eq_scale)
        eq4 = MathTex(r"2x = \tfrac{7}{2}").scale(eq_scale)
        eq5 = MathTex(r"x = \tfrac{7}{4}").scale(eq_scale)
        x_steps = VGroup(eq1, eq2, eq3, eq4, eq5).arrange(DOWN, aligned_edge=LEFT, buff=line_gap)
        x_steps.next_to(eq_y, DOWN, aligned_edge=LEFT, buff=line_gap + 0.15)

        self.play(Write(eq1)); self.wait(0.08)
        self.play(TransformFromCopy(eq1, eq2))
        self.play(TransformFromCopy(eq2, eq3))
        self.play(TransformFromCopy(eq3, eq4))
        self.play(TransformFromCopy(eq4, eq5)); self.play(FadeOut(x_boxs))

        # Denklem bloğu: ŞİMDİ matrisin yanına kaydır (tek hamlede)
        eq_block = VGroup(eq_z, eq_y, x_steps)
        eq_block.generate_target()
        eq_block.target.next_to(aug, RIGHT, buff=0.7).align_to(aug, UP)
        self.play(MoveToTarget(eq_block), run_time=0.6)

        # --------- Sonuç vektörü: en sağda, denklemlerle çakışmadan FadeIn ---------
        sol_title = Text("Çözüm:", font_size=30)
        sol_vec = MathTex(
            r"\begin{bmatrix}x\\y\\z\end{bmatrix} = "
            r"\begin{bmatrix}\tfrac{7}{4}\\[2pt]1\\[2pt]\tfrac{1}{2}\end{bmatrix}"
        ).scale(0.95)
        result = VGroup(sol_title, sol_vec).arrange(RIGHT, buff=0.3)
        result.next_to(eq_block, RIGHT, buff=0.8).align_to(eq_block, UP)

        # Kadraj taşmasını önle (gerekirse sola it)
        margin = 0.2
        overshoot = result.get_right()[0] - (right_x - margin)
        if overshoot > 0:
            result.shift(LEFT * overshoot)

        self.play(FadeIn(result))
        self.wait(1.1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment