我有一个与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])