【发布时间】:2020-04-03 17:10:18
【问题描述】:
我想使用两个线性函数(破幂律)拟合我的数据,其中一个断点是用户给定的。目前我正在使用来自scipy.optimize 模块的curve_fit 函数。这是我的数据集frequencies、binned data、errors
这是我的代码:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
freqs=np.loadtxt('binf11.dat')
binys=np.loadtxt('binp11.dat')
errs=np.loadtxt('bine11.dat')
def brkPowLaw(xArray, breakp, slopeA, offsetA, slopeB):
returnArray = []
for x in xArray:
if x <= breakp:
returnArray.append(slopeA * x + offsetA)
elif x>breakp:
returnArray.append(slopeB * x + offsetA)
return returnArray
#define initial guesses, breakpoint=-3.2
a_fit,cov=curve_fit(brkPowLaw,freqs,binys,sigma=errs,p0=(-3.2,-2.0,-2.0,-2.0))
modelPredictions = brkPowLaw(freqs, *a_fit)
plt.errorbar(freqs, binys, yerr=errs, fmt='kp',fillstyle='none',elinewidth=1)
plt.xlim(-5,-2)
plt.plot(freqs,modelPredictions,'r')
第二个线性函数的偏移量设置为等于第一个的偏移量。
看起来这样可行,但我很合适:
现在我认为brkPowLaw 函数中的条件应该足够了,但事实并非如此。我想要的是第一个线性方程用于将数据拟合到一个选定的断点,然后从这个断点进行第二个线性拟合,但是 没有 如它所示的驼峰因为现在看起来有两个断点而不是一个和三个线性函数来拟合,这不是我所期望的,也不是我想要的。
我想要的是,当第一个线性拟合结束时,第二个从第一个线性拟合结束的点开始。
我尝试使用 numpy.piecewise 函数但没有合理的结果,查看了一些主题 like this 或 this 但我没有设法使我的脚本工作
感谢您的宝贵时间
【问题讨论】:
-
我已经设法进行了一些修改,特别是我将第二个线性函数定义为
slopeA*breakp+offsetA-slopeB*x+slopeB*breakp所以它几乎给了我想要的东西,但断点仍然有点偏离 -
我会反复执行此操作:使用像
tanh这样的软步骤来淡出功能,另一个淡入。在每个步骤中,移除软性并使过渡更加尖锐,直到一个基本上达到阶跃函数。
标签: python curve-fitting piecewise