我想用两个线性函数(破幂律)拟合我的数据,其中一个断点是用户给定的。当前Im正在使用来自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')
第二个线性函数的偏移量设置为等于第一个线性函数的偏移量
看起来这很管用,但我穿得很合适:
现在我认为bybrkPowLaw
函数中的条件应该足够了,但它没有。我想要的是,第一个线性方程用来拟合数据,直到一个选择的断点,然后从这个断点开始,进行第二个线性拟合,但是,没有曲线图中显示的驼峰,因为现在这里似乎有两个断点,而不是拟合的一个和三个线性函数,这不是我期望的,也不是我想要的
我想要的是,当第一次线性拟合结束时,第二次拟合从第一次线性拟合结束的点开始
我尝试过使用numpy.piecewise
函数,但没有任何合理的结果,研究了一些主题like this或this,但我没有成功地使我的脚本工作
谢谢你抽出时间
这将是我的方法,不是线性的,而是二次函数
这使得:
及
把跳跃速度提高到-3.189
相关问题 更多 >
编程相关推荐