Skip to content

Instantly share code, notes, and snippets.

@JustGNUKen
Created May 7, 2025 09:03
Show Gist options
  • Save JustGNUKen/030a9004dc604c7fee7e18af749cddec to your computer and use it in GitHub Desktop.
Save JustGNUKen/030a9004dc604c7fee7e18af749cddec to your computer and use it in GitHub Desktop.
4.3.md

Аналіз методу простої ітерації для розв'язання системи лінійних рівнянь

Вступ

Представлений код реалізує метод простої ітерації (також відомий як метод Якобі) для розв'язання системи лінійних алгебраїчних рівнянь. Цей ітераційний метод є альтернативою прямим методам, таким як метод Гауса, і особливо ефективний для розріджених систем або систем з діагональним домінуванням.

Покроковий аналіз

1. Оголошення функції та ініціалізація

def simple_iteration(epsilon=0.001, max_iter=1000):
    # Початкове наближення (можна змінити за потреби)
    x = [0, 0, 0, 0]

Функція simple_iteration приймає два параметри:

  • epsilon - допустима похибка (критерій зупинки ітерацій)
  • max_iter - максимальна кількість ітерацій

Початкове наближення розв'язку встановлюється як нульовий вектор [0, 0, 0, 0]. У загальному випадку, можна обрати будь-яке початкове наближення, але вдалий вибір може пришвидшити збіжність.

2. Основний цикл ітерацій

for k in range(1, max_iter + 1):
    x_new = [0, 0, 0, 0]
    # Обчислення за формулами
    x_new[0] = (0.32 * x[1] - 0.23 * x[2] + 0.41 * x[3] + 0.67) / (1 - (-0.06))
    x_new[1] = (0.18 * x[0] - 0.33 * x[2] - 0.88) / (1 - 0.12)
    x_new[2] = (0.12 * x[0] + 0.32 * x[1] + 0.67 * x[3] - 0.18) / (1 - (-0.05))
    x_new[3] = (0.05 * x[0] - 0.11 * x[1] + 0.09 * x[2] + 1.44) / (1 - (-0.12))

У цьому блоці відбувається основна робота методу. На кожній ітерації:

  1. Створюється новий вектор x_new для зберігання наступного наближення
  2. Обчислюються нові значення для кожної змінної за спеціальними формулами

Ці формули отримані перетворенням системи рівнянь до вигляду x = φ(x). Для цього кожне рівняння переписується таким чином, щоб виразити одну змінну через інші.

Наприклад, перше рівняння виглядає як: 1.06x₁ - 0.32x₂ + 0.23x₃ - 0.41x₄ = 0.67

Звідси x₁ виражається як: x₁ = (0.32x₂ - 0.23x₃ + 0.41x₄ + 0.67) / 1.06

Що в коді записано як:

x_new[0] = (0.32 * x[1] - 0.23 * x[2] + 0.41 * x[3] + 0.67) / (1 - (-0.06))

Аналогічно для інших змінних.

3. Перевірка збіжності

# Обчислення максимальної різниці між ітераціями
diff = max(abs(x_new[i] - x[i]) for i in range(4))
print(f"Iteration {k}: x = {x_new}, diff = {diff:.6f}")
# Перевірка досягнення заданої точності
if diff < epsilon:
    return x_new, k
x = x_new

Цей блок коду:

  1. Обчислює максимальну абсолютну різницю між поточним і попереднім наближеннями (diff)
  2. Виводить інформацію про поточну ітерацію
  3. Перевіряє, чи досягнуто заданої точності (diff < epsilon)
  4. Якщо так, повертає поточне наближення та кількість виконаних ітерацій
  5. Якщо ні, оновлює вектор x для наступної ітерації
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment