【发布时间】:2016-03-09 11:31:11
【问题描述】:
我有一个类似于this previous StackOverflow question 的问题。我有一个数据集,我想拟合几个分段函数,然后绘制结果。
下面用红色标出了数据。
为了提供一些上下文,y 值表示电机需要多少毫秒才能转动 x 度。我已将原始值上传到this Pastebin。
我现在想分段拟合三个函数:
- 多项式拟合数据的开始,其中电机加速到最大速度。
- 达到最大速度时的线性拟合。
- 多项式拟合,然后电机关闭并减速。
到目前为止,我已经尝试使用下面显示的代码对两个线性函数进行分段拟合。考虑到数据的样子,我希望看到从原点到大约ms=550 的数据有一个斜率,然后从那里看到第二条线平行于 x 轴。
但是,这不是我得到的:
在我尝试使用三个函数进行分段拟合之前,我首先想了解为什么我得到这个图而不是我所期望的。
所以我的问题是:
- 谁能解释如何更正我的代码以使其适合两个线性函数?
- 如何扩展我的代码以使用三个函数绘制分段拟合?
用于创建上述绘图的代码如下:
from pandas import *
import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize
#Getting data using Pandas
df = read_csv("test_data.csv")
ms = df["ms"].values
degrees = df["Degrees"].values
#A piece wise function taken from the other stackoverflow
def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
#Setting linspace and making the fit
x_new = np.linspace(ms[0], ms[-1])
p , e = optimize.curve_fit(piecewise_linear, ms, degrees)
#Plotting data and fit
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x_new, piecewise_linear(x_new, *p), '.', df)
ax.set_ylim([0, 450])
ax.set_xlim([0, 800])
【问题讨论】:
标签: python numpy matplotlib scipy curve-fitting