Как нарисовать график функции между двумя горизонтальными границами?

Рейтинг: 0Ответов: 3Опубликовано: 20.04.2023

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

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

Ответы

▲ 5Принят
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()

введите сюда описание изображения

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

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

▲ 2

Если я правильно вас понял, то можно использовать 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')

введите сюда описание изображения

▲ 0

Ну на первый взгляд - не так уж сложно.

На каждом шаге считаете разницу для входных данных с предыдущим значением

dy = in_y - in_y_last

Если достигнут max и dx>0 (функция возрастает), в выходные данные записываем max, иначе, похоже по описанию, прошлое выходное значение out_y_last+dy. Аналогично с min