假設qi>0
的斜率實際上是正值,所以我沒有得到-0.003
的選擇,況且我認爲de rivative是錯誤的。 您可以準確計算lope達到臨界值的值。 現在,根據我的經驗,你有兩個選擇。如果你自己定義一個分段函數,你通常會遇到使用numpy數組進行函數調用的麻煩。我通常使用scipy.optimize.leastsq
和一個自定義殘差函數。第二個選項是兩個函數之間的連續轉換。根據定義,您可以使其儘可能銳利,因爲價值和坡度已經合適。 這兩種方案如下所示
進口matplotlib。pyplot如PLT 進口numpy的爲NP
def hy(x,b,qi,di):
return qi*(1.0-b*di*x)**(-1.0/b)
def abshy(x,b,qi,di):#same as hy but defined for all x
return qi*abs(1.0-b*di*x)**(-1.0/b)
def dhy(x,b,qi,di):#derivative of hy
return qi*di*(1.0-b*di*x)**(-(b+1.0)/b)
def get_x_from_slope(s,b,qi,di):#self explaining
return (1.0-(s/(qi*di))**(-b/(b+1.0)))/(b*di)
def exh(x,xlim,qlim,dlim):#exponential part (actually no free parameters)
return qlim*np.exp(dlim*(x-xlim))
def trans(x,b,qi,di, s0):#piecewise function
x0=get_x_from_slope(s0,b,qi,di)
if x<x0:
out= hy(x,b,qi,di)
else:
H0=hy(x0,b,qi,di)
out=exh(x,x0,H0,s0/H0)
return out
def no_if_trans(x,b,qi,di, s0,sharpness=10):#continuous transition between the two functions
x0=get_x_from_slope(s0,b,qi,di)
H0=hy(x0,b,qi,di)
weight=0.5*(1+np.tanh(sharpness*(x-x0)))
return weight*exh(x,x0,H0,s0/H0)+(1.0-weight)*abshy(x,b,qi,di)
xList=np.linspace(0,5.5,90)
hyList=np.fromiter((hy(x,2.2,1.2,.1) for x in xList) ,np.float)
t1List=np.fromiter((trans(x,2.2,1.2,.1,3.59) for x in xList) ,np.float)
nt1List=np.fromiter((no_if_trans(x,2.2,1.2,.1,3.59) for x in xList) ,np.float)
fig1=plt.figure(1)
ax=fig1.add_subplot(1,1,1)
ax.plot(xList,hyList)
ax.plot(xList,t1List,linestyle='--')
ax.plot(xList,nt1List,linestyle=':')
ax.set_ylim([1,10])
ax.set_yscale('log')
plt.show()
有兩個解決方案几乎沒有差別,但您使用scipy
擬合功能的選項略有不同。第二種解決方案應該很容易與curve_fit
請問您可以添加一個鏈接到數據? –
[這裏描述](https://stackoverflow.com/q/29382903/832621)的方法可以給你一些見解 –
謝謝,我會看看,並瞭解更多關於'numpy.piecewise()' – Ditchbuster