Представлений код реалізує метод простої ітерації (також відомий як метод Якобі) для розв'язання системи лінійних алгебраїчних рівнянь. Цей ітераційний метод є альтернативою прямим методам, таким як метод Гауса, і особливо ефективний для розріджених систем або систем з діагональним домінуванням.
def simple_iteration(epsilon=0.001, max_iter=1000):
# Початкове наближення (можна змінити за потреби)
x = [0, 0, 0, 0]
Функція simple_iteration
приймає два параметри:
epsilon
- допустима похибка (критерій зупинки ітерацій)max_iter
- максимальна кількість ітерацій
Початкове наближення розв'язку встановлюється як нульовий вектор [0, 0, 0, 0]. У загальному випадку, можна обрати будь-яке початкове наближення, але вдалий вибір може пришвидшити збіжність.
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))
У цьому блоці відбувається основна робота методу. На кожній ітерації:
- Створюється новий вектор
x_new
для зберігання наступного наближення - Обчислюються нові значення для кожної змінної за спеціальними формулами
Ці формули отримані перетворенням системи рівнянь до вигляду 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))
Аналогічно для інших змінних.
# Обчислення максимальної різниці між ітераціями
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
Цей блок коду:
- Обчислює максимальну абсолютну різницю між поточним і попереднім наближеннями (
diff
) - Виводить інформацію про поточну ітерацію
- Перевіряє, чи досягнуто заданої точності (diff < epsilon)
- Якщо так, повертає поточне наближення та кількість виконаних ітерацій
- Якщо ні, оновлює вектор
x
для наступної ітерації