基于python scipy.interpolate 实现三次样条插值法

scipy.interpolate 可实现各种插值法的实现,官方文档:
https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

这里,我们只说明三次样条插值法的简单python脚本

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :python_ws 
@File :interpolation.py
@Author :lx
@Date :2021-02-07 9:47 
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sympy import *
from pylab import mpl
from utilities.mysql_conn import get_conn
from scipy.interpolate import CubicSpline
def main():
    sql = "SELECT * FROM tb WHERE DATEDIFF(datetime,DATE(NOW()))=1;"
    df = pd.read_sql(sql=sql, con=get_conn())
    x_init4 = np.arange(0, df.shape[0], 1)
    y_init4 = np.array(df["dni"])
    print("x_init4:", x_init4)
    print("y_init4:", y_init4)

    # 构造x,y 数组,x为自变量、y为因变量
    x = x_init4
    y = y_init4
    # 使用 CubiSpline 构建分段三次样条插值函数cs,cs即为scipy.interpolate.PPoly类的对象
    # 默认情况下,三次样条端点边界条件为‘not-a-knot’ (默认值),曲线末端的第一段和第二段是相同的多项式。当没有关于边界条件的信息时,这是一个很好的默认值。
    cs = CubicSpline(x, y)
    print("cs:",cs)
    cs.c.shape, cs.x, cs(x), y
    # 输出为 三次样条分段多项式的形状,x数据点,插值x数据点=原始数据y值
    # print("cs.c.shape",cs.c.shape)
    # print("cs.x", cs.x)
    # print("cs(x)", cs(x))
    # print("y", y)

    # 构造插值点
    xs = np.arange(0, 96, 0.1)

    fig, ax = plt.subplots(figsize=(6.5, 4))
    ax.plot(x, y, 'o', label='data')
    ax.plot(xs, cs(xs), label="插值数据")
    #  一阶导数
    ax.plot(xs, cs(xs, 1), label="一阶导数'")

    ax.set_xlim(0, 95)
    ax.legend(loc='lower left', ncol=2)
    plt.show()

if __name__ == '__main__':
    main()

ps: 代码中的sql用来获取源数据,可忽略 ,尝试的时候替换即可 。保证有效输入x,y,格式为numpy。

【reference】
scipy 三次样条插值

你可能感兴趣的:(python,scipy)