2016-11-09 97 views
0

我试图做一个分段拟合,如图1所示:分段指数拟合在Python

enter image description here

下面是代码:

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

def piecewise_linear(x, x0, y0, k1, k2): 
    return np.piecewise(x, [x < x0], [lambda x: k1*np.power(x,k2), lambda x: y0]) 

x=np.arange(0.0,100.0,1.0) 
y=piecewise_linear(x, 45.0, 2025.0, 1.0, 2.0) 

popt , pcov = optimize.curve_fit(piecewise_linear, x, y) 
tau = np.linspace(x[0], x[-1], 200) 
perr = np.sqrt(np.diag(pcov)) 
print popt 
print perr 
print pcov 
plt.plot(x, y, 'b+') 
plt.plot(tau, piecewise_linear(tau, *popt),'r') 
plt.loglog() 
plt.show() 
plt.close() 

但是,这给了我作为拟合图。 2: enter image description here

无论我如何更改数据集,参数x0固定为1。

我不知道我的代码有什么问题,我该如何解决这个问题?

回答

1

在您optimize.curve_fit()你需要使用p0 = []在那里你输入你最初的猜测到p0,其中的文件可以发现here指定的配件一些初步猜测。

在你给的例子来说,你已经有了,你用它们来计算yx0, y0, k1, k2值,因此只需输入这些到您的curve_fit

def piecewise_linear(x, x0, y0, k1, k2): 
    return np.piecewise(x, [x < x0], [lambda x: k1*np.power(x,k2), lambda x: y0]) 

x=np.arange(0.0,100.0,1.0) 
y=piecewise_linear(x, 45.0, 2025.0, 1.0, 2.0) 

#insert the initial guesses into curve_fit below using p0 = [...] 
popt , pcov = optimize.curve_fit(piecewise_linear, x, y, p0=[45, 2000, 1, 2]) 
tau = np.linspace(x[0], x[-1], 200) 
perr = np.sqrt(np.diag(pcov)) 

print (popt) 
print (perr) 
print (pcov) 

plt.plot(x, y, 'b+') 
plt.plot(tau, piecewise_linear(tau, *popt),'r') 
plt.loglog() 
plt.show() 

这给出如下图:

enter image description here

+0

感谢您的建议!但是,如果将初始猜测定义为与实际值45相同,那么拟合没有问题,而对于参数“x0”也存在问题,而如果对于“x0”的初始猜测不是实际值,例如44或44.5,配件将失败。无论我输入“x0”的初始猜测,它都不会改变。 'x0'的拟合结果是我输入的初始猜测。 –