#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)