Untitled

 avatar
unknown
python
a month ago
2.8 kB
4
Indexable
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# Определение отображения T(x)
def T(x, t):
    result = np.zeros_like(t)
    for i, ti in enumerate(t):
        if 0 <= ti <= 1/5:
            result[i] = x[int(ti * 5 * (len(x) - 1))] / 2
        elif 1/5 < ti <= 2/5:
            result[i] = -(x[int((5 * ti - 1) * (len(x) - 1))] - x[0] - x[-1]) / 2
        elif 2/5 < ti <= 3/5:
            result[i] = 9 * (np.exp(-np.abs(ti - 1/2)) - np.exp(-1/10)) + x[0] / 2
        elif 3/5 < ti <= 4/5:
            result[i] = -(x[int((4 - 5 * ti) * (len(x) - 1))] - x[-1] - x[0]) / 2
        elif 4/5 < ti <= 1:
            result[i] = x[int((5 - 5 * ti) * (len(x) - 1))] / 2
    return result

# Метод сжимающих отображений
def fixed_point_iteration(T, f0, max_iterations):
    t = np.linspace(0, 1, 1000)  # Сетка для вычислений
    f = f0(t)  # Начальное приближение как массив значений
    history = [f.copy()]  # Сохраняем историю итераций
    for i in range(max_iterations):
        f_new = T(f, t)  # Применяем T к текущей функции
        f = f_new  # Обновляем текущую функцию
        history.append(f.copy())  # Сохраняем текущее состояние
    return history

# Начальное приближение
f0 = lambda t: t  # Например, f0(t) = t

# Максимальное число итераций
max_iterations = 50

# Вычисляем историю итераций
history = fixed_point_iteration(T, f0, max_iterations)

# Создаем график
fig, ax = plt.subplots(figsize=(10, 6))
plt.subplots_adjust(left=0.1, bottom=0.25)  # Оставляем место для ползунка

# Начальный график (нулевая итерация)
t = np.linspace(0, 1, 1000)
line, = plt.plot(t, history[0], label="Приближение")
plt.plot(t, f0(t), label="Начальное приближение", linestyle="--")
plt.legend()
plt.xlabel("t")
plt.ylabel("f(t)")
plt.title("Метод сжимающих отображений")

# Создаем ось для ползунка
ax_slider = plt.axes([0.2, 0.1, 0.6, 0.03], facecolor="lightgoldenrodyellow")
slider = Slider(ax_slider, "Итерация", 0, max_iterations, valinit=0, valstep=1)

# Функция обновления графика при изменении ползунка
def update(val):
    iteration = int(slider.val)
    line.set_ydata(history[iteration])
    fig.canvas.draw_idle()

# Привязываем функцию обновления к ползунку
slider.on_changed(update)

plt.show()
Editor is loading...
Leave a Comment