#python #pandas #matplotlib #integral
#python #pandas #matplotlib #интеграл
Вопрос:
У меня есть две кривые, которые пересекаются несколько раз. Я не знаю, где находятся пересечения. Я пытаюсь получить значение для каждой области между двумя точками пересечения без ручной установки границы.
До сих пор я вычислял значения каждой кривой и отображал их зеленым цветом в случае, если logifunc находится выше logifuncsoll, и красным цветом, если logifunc находится ниже logifuncsoll.
E701077['logifuncsoll'] = 1811.7/ (1 769.67 * np.exp(-0.704566*(xsoll))) 14.5212
E701077['logifunc'] = 1847.28 / (1 312.09 * np.exp(-0.606454*(x701077)))-8.16471
plt.figure(dpi=300)
plt.plot(x701077, E701077['logifuncsoll'],'r',markersize=np.sqrt(1), label ="soll",color='red' )
plt.plot(x701077, E701077['logifunc'],'r',markersize=np.sqrt(1), label ="E701077",color='purple' )
plt.legend
fig, ax = plt.subplots(1, 1, sharex=True)
ax.plot(x701077, E701077['logifunc'],linewidth=1 , label='logifunc', color= 'purple')
ax.plot(x701077, E701077['logifuncsoll'],linewidth=1, label='logifuncsoll', color='black')
ax.fill_between(x701077, E701077['logifuncsoll'], E701077['logifunc'], where=E701077['logifunc'] >= E701077['logifuncsoll'], facecolor='green', interpolate=True)
ax.fill_between(x701077, E701077['logifuncsoll'], E701077['logifunc'], where=E701077['logifunc'] <= E701077['logifuncsoll'], facecolor='red', interpolate=True)
ax.legend(loc='upper left', frameon=False)
Ответ №1:
Общая разница между двумя строками заключается в использовании scipy для интегрирования абсолютного значения разностной функции.
import scipy.integrate
left_lim = 0
right_lim = 27
func = lambda x: abs( (1811.7/ (1 769.67 * np.exp(-0.704566*(x))) 14.5212)-
(1847.28 / (1 312.09 * np.exp(-0.606454*(x)))-8.16471) )
area = scipy.integrate.quad(func, left_lim, right_lim)
Чтобы найти точки пересечения, используйте Shapely.
import shapely
from shapely.geometry import LineString, Point
line1 = LineString(E701077['logifuncsoll'].values)
line2 = LineString(E701077['logifunc'].values)
int_pt = line1.intersection(line2)
point_of_intersection = int_pt.x, int_pt.y
print(point_of_intersection)
Комментарии:
1. Большое вам спасибо! Расчет работает безукоризненно. Но часть с пересечением выдает мне ошибку:
ModuleNotFoundError: No module named 'shapely'
Я добавил пакеты, которые вы сделали.