Untitled
unknown
python
9 months ago
2.8 kB
7
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