Кусочно-линейная функция: пересечение базовой линии и тангенса точки перегиба

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

from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

x=[ 25.257  25.887  26.565  27.223  27.892  28.56   29.238  29.896  30.555
  31.233  31.911  32.579  33.238  33.916  34.584  35.243  35.911  36.551
  37.228  37.906  38.546  39.214  39.863  40.531  41.2    41.878  42.536
  43.205  43.873  44.522  45.19   45.83   46.508  47.176  47.835  48.503
  49.171  49.82   50.479  51.138  51.816  52.484  53.143  53.811  54.479
  55.147  55.816  56.474  57.143  57.801  58.479  59.128  59.806  60.474
  61.143  61.821  62.47   63.128  63.797  64.475]

y=[7009.2    6920.9    6898.5    7067.2    3647.9    6973.4    6601.8
    6862.     6697.8    6673.1    6537.8    6427.1    6888.3    6768.3
    6578.8    6678.7    6543.4    6794.5    6558.5    6952.2    6741.4
    6577.4    6728.1    6740.1    6618.8    6580.1    6801.5    6498.6
    6417.2    6503.3    6386.5    5991.4    6271.2    5630.6    6001.3
    6196.2    6381.     5783.4    5721.8    6024.     6015.6    6133.7
    5987.     5607.4    6129.7    6211.1    7037.3    8266.7   11961.
   17120.    21857.    29003.    36856.    47164.    58358.    65570.
   77873.    88707.   109440.   129630.]

tck = interpolate.splrep(x, y, k=2, s=0)
xnew = np.linspace(25, 65)

fig, axes = plt.subplots(3)

axes[0].plot(x, y, 'x', label = 'data')
axes[0].plot(xnew, interpolate.splev(xnew, tck, der=0), label = 'Fit')
axes[1].plot(x, interpolate.splev(x, tck, der=1), label = '1st dev')
dev_2 = interpolate.splev(x, tck, der=2)
axes[2].plot(x, dev_2, label = '2st dev')

turning_point_mask = dev_2 == np.amax(dev_2)

axes[2].plot(x[turning_point_mask], dev_2[turning_point_mask],'rx',
             label = 'Turning point')
for ax in axes:
    ax.legend(loc = 'best')

plt.show()

0 ответов

Другие вопросы по тегам