Plotting exponential curve by fitting to data in python

∥☆過路亽.° 提交于 2021-02-08 10:21:00

问题


I have x array and y array. I need to predict points(points of pareto fronts) in left and right side (I don't know exactly how). That's why used in first extrapolation of points, but it gaves linear I tried to fit my data points to exponential curve, but gave me as result only straight line with coefficients A=1.0, K=1.0, C=232.49024883323932. I also tried to fit my data to polynomial function with degree 3, result better, but the tail is increasing


x=[263.56789586, 263.56983885, 263.57178259, 263.57372634,
       263.57567008, 263.57761383, 263.57955759, 263.58150134,
       263.58344509, 263.58538884, 263.5873326 , 263.66699508,
       263.5912201 , 263.59316385, 263.59510762, 263.59705135,
       263.59899512, 263.60093885, 263.60288261, 263.60482637,
       263.60677014, 263.60871386, 263.61065764, 263.61260141,
       263.61454514, 263.6164889 , 263.61843266, 263.62037642,
       263.62232019, 263.62426392, 263.62620767, 263.62815143,
       263.63009519, 263.63203894, 263.63398269, 263.63592645,
       263.63787021, 263.63981396, 263.64175772, 263.64370148,
       263.64564523, 263.64758898, 263.64953274, 263.65147649,
       263.65342024, 263.655364  , 263.65730775, 263.65925151,
       263.66119527, 263.66313902, 263.66508278, 263.66702653,
       263.66897028, 263.67091404, 263.67285779, 263.67480155,
       263.67674531, 263.67868906, 263.68063281, 263.68257657,
       263.68452032, 263.68646408, 263.68840783, 263.69035159,
       263.69229534, 263.69423909, 263.69618285, 263.6981266 ,
       263.70007036, 263.70201411, 263.70395787, 263.70590162,
       263.70784537, 263.70978913, 263.71173288, 263.71367664,
       263.71562039, 263.71756415, 263.7195079 , 263.72145166,
       263.72339541, 263.72533917, 263.72728292, 263.72922667,
       263.73117043, 263.73311418, 263.73505802, 263.73700169,
       263.73894545, 263.74088929, 263.74283296, 263.74477671,
       263.74672046, 263.74866422, 263.75060797, 263.75255173,
       263.75449548, 263.75613889, 263.75617049, 263.75587478]
y= [232.99031933, 232.95558575, 232.93713544, 232.9214609 ,
       232.9072364 , 232.8939496 , 232.88133917, 232.86925025,
       232.85758305, 232.84626821, 232.8352564 , 232.59299633,
       232.81389123, 232.80326395, 232.79262328, 232.7819675 ,
       232.77129713, 232.76061533, 232.74992564, 232.739233  ,
       232.72854327, 232.717862  , 232.70719578, 232.69655002,
       232.68593193, 232.67534666, 232.66479994, 232.65429722,
       232.64384269, 232.63344132, 232.62309663, 232.61281189,
       232.60259005, 232.59243338, 232.5823437 , 232.57232231,
       232.56237032, 232.55248837, 232.54267676, 232.5329356 ,
       232.52326498, 232.51366471, 232.5041348 , 232.4946754 ,
       232.48528698, 232.47597054, 232.46672774, 232.4575614 ,
       232.44847565, 232.43947638, 232.43057166, 232.42177232,
       232.41309216, 232.40454809, 232.39615988, 232.387949  ,
       232.37993719, 232.37215305, 232.36467603, 232.35750509,
       232.35062207, 232.34401067, 232.33765646, 232.33154649,
       232.32566912, 232.32001373, 232.31457099, 232.30933224,
       232.30428981, 232.29943675, 232.29476679, 232.29027415,
       232.2859539 , 232.28180142, 232.2778127 , 232.27398435,
       232.27031312, 232.26679651, 232.26343235, 232.26021888,
       232.25715486, 232.25423943, 232.25147212, 232.24885312,
       232.24638301, 232.24406282, 232.24189425, 232.23987999,
       232.23802286, 232.23632689, 232.2347971 , 232.23343943,
       232.23226138, 232.23127218, 232.2304829 , 232.22990751,
       232.22956307, 232.22946832, 232.22947064, 232.22947062]
def func(x, a, b, c, d):
    #return a*x**3 + b*x**2 +c*x + d
    return a*np.exp(-b*x) + c

x = pareto_df['BSFC_bar_LET'].values
y = pareto_df['BSFC_RatedP'].values

popt, pcov = curve_fit(func, x, y)


print (popt[0], popt[1], popt[2], popt[3])

min_x=min(np.exp(x))-0.5*(max(np.exp(x))-min(np.exp(x)))
max_x=max(np.exp(x))+0.5*(max(np.exp(x))-min(np.exp(x)))
xnew= np.linspace(min(x), max(x), 1000)  

plt.plot(x, y, 'o')
plt.plot(xnew, func(xnew, *popt), label="Fitted Curve") 

plt.legend(loc='upper left')
plt.show()

enter image description here

来源:https://stackoverflow.com/questions/63611165/plotting-exponential-curve-by-fitting-to-data-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!