Python, scipy - Как подогнать кривую, используя кусочную функцию с условным параметром, который также необходимо вычислить? - PullRequest
0 голосов
/ 08 апреля 2019

Как видно из названия, я пытаюсь подогнать кусочное уравнение к большому набору данных.Уравнения, которые я хотел бы подогнать под мои данные, следующие:

y (x) = b, когда x

else:

y (x) =b + exp (a (xc)) - 1, когда x> = c

Существует несколько ответов на вопрос, как решить эту проблему, но, как новичок в Python, я не могу понять, как подать заявкуих к моей проблеме: Кривая соответствует кусочной функции? Условная кривая соответствует scipy?

Проблема в том, что все переменные (a, b и c) имеютрассчитывается по алгоритму подбора.

Спасибо за помощь!

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

# Reduced Dataset
y = np.array([23.032, 21.765, 20.525, 21.856, 21.592, 20.754, 20.345, 20.534,
       23.502, 21.725, 20.126, 21.381, 20.217, 21.553, 21.176, 20.976,
       20.723, 20.401, 22.898, 22.02 , 21.09 , 22.543, 22.584, 22.799,
       20.623, 20.529, 20.921, 22.505, 22.793, 20.845, 20.584, 22.026,
       20.621, 23.316, 22.748, 20.253, 21.218, 23.422, 23.79 , 21.371,
       24.318, 22.484, 24.775, 23.773, 25.623, 23.204, 25.729, 26.861,
       27.268, 27.436, 29.471, 31.836, 34.034, 34.057, 35.674, 41.512,
       48.249])

x = np.array([3756., 3759., 3762., 3765., 3768., 3771., 3774., 3777., 3780.,
       3783., 3786., 3789., 3792., 3795., 3798., 3801., 3804., 3807.,
       3810., 3813., 3816., 3819., 3822., 3825., 3828., 3831., 3834.,
       3837., 3840., 3843., 3846., 3849., 3852., 3855., 3858., 3861.,
       3864., 3867., 3870., 3873., 3876., 3879., 3882., 3885., 3888.,
       3891., 3894., 3897., 3900., 3903., 3906., 3909., 3912., 3915.,
       3918., 3921., 3924.])

# Simple exponential function without conditions (works so far)
def exponential_fit(x,a,b,c):
    return b + np.exp(a*(x-c)) 

popt, pcov = curve_fit(exponential_fit, x, y, p0 = [0.1, 20,3800])

plt.plot(x, y, 'bo')
plt.plot(x, exponential_fit(x, *popt), 'r-')
plt.show()

1 Ответ

0 голосов
/ 09 апреля 2019

Изменение вашей функции на:

def exponential_fit(x, a, b, c):
    if x >= c:
        return b + np.exp(a*(x-c))-1
    else:
        return b

дает мне:

enter image description here

...