Python 绘制分段拟合到非线性数据

Python 绘制分段拟合到非线性数据,python,numpy,matplotlib,scipy,curve-fitting,Python,Numpy,Matplotlib,Scipy,Curve Fitting,我有一个类似的问题。我有一个数据集,我想适合几个分段函数,然后绘制结果 数据在下面以红色绘制 为了提供一些上下文,y值表示电机转动x度所需的毫秒数。我已将原始值上载到 现在,我想以分段方式拟合三个函数: 适用于数据开始的多项式,其中电机加速至最大速度 达到最大速度时的线性拟合 多项式拟合,然后电机关闭并减速 到目前为止,我已经尝试使用下面所示的代码对两个线性函数进行分段拟合。考虑到数据的外观,我希望看到数据从原点到大约ms=550有一个斜率,然后从那里有第二条线平行于x轴 然而,这不是我得到

我有一个类似的问题。我有一个数据集,我想适合几个分段函数,然后绘制结果

数据在下面以红色绘制

为了提供一些上下文,y值表示电机转动x度所需的毫秒数。我已将原始值上载到

现在,我想以分段方式拟合三个函数:

  • 适用于数据开始的多项式,其中电机加速至最大速度
  • 达到最大速度时的线性拟合
  • 多项式拟合,然后电机关闭并减速
到目前为止,我已经尝试使用下面所示的代码对两个线性函数进行分段拟合。考虑到数据的外观,我希望看到数据从原点到大约
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])
    
    从导入*
    将matplotlib.pyplot作为plt导入
    将numpy作为np导入
    从scipy导入优化
    #使用熊猫获取数据
    df=读取csv(“test\u data.csv”)
    ms=df[“ms”]。数值
    度=df[“度”]。值
    #从另一个stackoverflow中提取的分段函数
    def分段线性(x,x0,y0,k1,k2):
    逐段返回np(x[x
    2。问题:您需要重新定义
    分段线性
    ,现在它有三个部分,您可以随意更改它们(我刚刚举了一个二次、一次和三次多项式的例子)

    作为旁注,我还为初始参数添加了一些有根据的猜测,这比让python随机选择更合适

    那就做吧

    ax.plot(x_new, piecewise_linear(x_new, *p), '-', ms[::20], degrees[::20], 'o')
    

    谢谢,这正是我想要的。我注意到我需要在曲线_fit()中添加猜测以获得拟合的平端。否则,它就像一个符咒:)没问题:),这也是我发现的,第三度如果随机放置,不知何故并不适合。
    #Setting linspace and making the fit, make sure to make you data numpy arrays
    x_new = np.linspace(ms[0], ms[-1], dtype=float)
    m = np.array(ms, dtype=float)
    deg = np.array(degrees, dtype=float)
    guess = np.array( [100, 500, -30, 350, -0.1, 0.0051, 1, -0.01, -0.01, -0.01], dtype=float)
    p , e = optimize.curve_fit(piecewise_linear, m, deg)
    #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])
    
    ax.plot(x_new, piecewise_linear(x_new, *p), '-', ms[::20], degrees[::20], 'o')