Как нарисовать график функции между двумя горизонтальными границами?
У меня есть сложная функция, состоящая из нескольких кусочных, поэтому чтобы не писать сюда много кода предлагаю разобрать проблему на простой синусоиде. Есть 2 горизонтальные границы, которые функция не должна пересекать. При достижении этой границы график становится равным этой границе до того времени пока функция не начнет убывать. И также в случае возрастания. На рисунке попытался изобразить, что хочу получить.
Прошу заметить значение графика равно верхней границе только пока функция возрастает(!!!), а не когда значение больше этой границы.

Мой график функции выглядит так, и невозможно предугадать в какой точке будет пересекаться с любой из границ. Все зависит от исходных данных

Ответы (3 шт):
Если я правильно вас понял, то можно использовать numpy.clip:
import numpy as np
import matplotlib.pylab as plt
n = 100
x = np.linspace(0, np.pi * 4, n)
y = np.sin(x)
plt.plot(x, y, 'b--')
y1 = np.clip(y, -0.5, 0.5)
plt.plot(x, y1, 'r')
Ну на первый взгляд - не так уж сложно.
На каждом шаге считаете разницу для входных данных с предыдущим значением
dy = in_y - in_y_last
Если достигнут max и dx>0 (функция возрастает), в выходные данные записываем max, иначе, похоже по описанию, прошлое выходное значение out_y_last+dy. Аналогично с min
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
x = np.arange(0, 25, 0.1)
y = np.sin(x)
uppery = 0.5
lowery = -.5
# украшательство
plt.plot(x, y, alpha=0.3)
plt.axhline(uppery, color = 'lightgreen')
plt.axhline(lowery, color = 'lightgreen')
projx1 = np.arange(np.pi/2, 25, np.pi*2)
projx2 = np.arange(1.5*np.pi, 25, np.pi*2)
plt.vlines(projx1, ymin = uppery, ymax = max(y), color="r", linestyles="dashed")
plt.vlines(projx2, ymin = lowery, ymax = min(y), color="r", linestyles="dashed")
# собственно решение - прибавление или вычитание разницы между локальными экстремумами
# и ограничмтельными линиями в зависимости от возрастания/убывания функции
func1 = func2 = y
if uppery < max(y):
func1 = y-(max(y)-uppery)
if lowery > min(y):
func2 = y+(lowery - min(y))
res = np.where(np.diff(y, prepend=[0])<0, func1, func2)
res = np.clip(res, lowery, uppery)
plt.plot(x, res, color="r")
plt.show()
При значениях ограничительный прямых, превышающих экстремумы, функция просто отрисовывается без изменений

при неравных разностях ограничительных прямых график все равно будет ломаться, потому что одним сложением/вычитанием координат тут не отделаешься - нужно будет перерассчитывать точки.

