Подберите данные любой функцией и проверьте, когда она достигает определенного значения - PullRequest
0 голосов
/ 12 марта 2019

Как видно из названия.Я хочу соответствовать этим пунктам.Найдите функцию и проверьте, при каком x моя функция достигнет 100.

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



points = np.array([(3, 0), (7, 55), (14, 88)])
x = points[:,0]
y = points[:,1]
def func(x, p1,p2):
  return p1*np.log(x)+p2

popt, pcov = curve_fit(func, x, y,p0=(1.0,10.2))
print popt
p1 = popt[0]
p2 = popt[1]

curvex=np.linspace(15,85,1000)
fit = func(curvex, p1, p2)
plt.plot(x, y, 'yo', label='data')



plt.plot(curvex,fit,'r', linewidth=5)

plt.plot(x,y,'x',label = 'Xsaved')

plt.show()

enter image description here

  1. Как мне сделать функциюпройти через точки?(если его слишком много, его не нужно)

  2. Как получить значение x, при котором y = 100?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

Есть две точки данных со значением Y, равным нулю.После удаления единственной точки данных с наименьшим значением X (самой левой точки на диаграмме рассеяния) я смог легко сопоставить оставшиеся данные с уравнением "y = a * ln (x + b)", что кажется несколько разумнымпоскольку вы экстраполируете для правой части диаграммы рассеяния.

plot2

Чтобы найти значение X, где Y = 100 для этого уравнения:

100 = a * ln (x + b)

Я переставляю как:

100 / a = ln (x + b)

и беруестественный показатель каждой стороны:

exp (100 / a) = x + b

Вычитание b с обеих сторон дает мне:

exp (100 / a) -b = x

Использование моих установленных значений для параметров a и b:

a = 3.5059370092556854E + 01

b = -2.0057299645873785E + 00

и поскольку b отрицательно, это дает мне:

exp (100 / 3.5059370092556854E + 01) + 2.0057299645873785E + 00 = x

, который мой калькулятор решает как мое приближение для x при 100 как:

19,3334 = x

0 голосов
/ 13 марта 2019
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.interpolate import interp1d


points = np.array([(3, 0), (7, 55), (14, 88)])
x = points[:,0]
y = points[:,1]
def func(x, p1,p2):
  return p1*np.log(x)+p2

popt, pcov = curve_fit(func, x, y,p0=(1.0,10.2))
print popt
p1 = popt[0]
p2 = popt[1]

curvex=np.linspace(15,85,1000)
fit = func(curvex, p1, p2)
plt.plot(x, y, 'yo', label='data')

f = interp1d(fit, curvex, kind = 'cubic')
print f(100)
plt.plot(curvex,fit,'r', linewidth=1)

plt.plot(x,y,'x',label = 'Xsaved')

plt.show()

Это отвечает на мой вопрос. И функция пересекает y = 100 при значении x = 16.54.

0 голосов
/ 12 марта 2019

Вы можете добавить степень к полиномиальному поиску.Попробуйте 4 вместо 3 для примера, это не будет превышать 100

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial as P

points = np.array([(0, 0), (3, 0), (7, 55), (14, 88)])
x = points[:,0]
y = points[:,1]

y_fit = P.fit(x, y, 4)


x_new = np.linspace(x[0], x[-1], 50)

plt.plot(x,y,'o', x_new, y_fit(x_new))
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.axhline(100)
plt.show()

enter image description here

Если вы действительно хотите попытаться приблизиться, когда он достигнет100 с 4-м порядком:

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial as P

points = np.array([(0, 0), (3, 0), (7, 55), (14, 88)])
# get x and y vectors
x = points[:,0]
y = points[:,1]

y_fit = P.fit(x, y, 4)
x_new = np.linspace(0, 20, 100)

plt.plot(x,y,'o', x_new, y_fit(x_new))
plt.axhline(100)
plt.show()

enter image description here

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

...