使用scipy库将离散点连续化

离散点连续化用于求满足所有离散点的对应法则F(x)且非离散集合中的值。
如有x=[0,1,2,3], y=[1,3,2,1],求当x=1.5时对应的y是多少?

拟合

可以直接求出对应的函数式,但要求知晓经验函数

from numpy import *
from scipy.signal import *

# 如线性拟合经验函数一般是 ax+b 或者 ax^2 + bx + c,通过拟合获取a,b,c参数值
def lineFunc(x, a, b): # 拟合线性
    return a * x + b
popt, pcov = curve_fit(lineFunc, x, y) # 传入经验函数,x轴数组,y轴数组。

# 再如指数拟合经验函数一般是 ae^(bx)
def func(x, a, b):
    return a * np.exp(b * x)
popt, pcov = curve_fit(func, x, y, maxfev=8000) # 经验函数,x轴数组,y轴数组,最大拟合次数

插值

可以获取插入值的对应值。如插入x值得到对应y值
插值有一维插值,二维插值,三维插值,此处只讲解一维。

import numpy as np
import matplotlib.pyplot as plt 
from scipy import interpolate as inter

x = np.arange(0, 10, 1)
y = [1.1,1.2,1.4,1.5,2.0,1.6,1.7,2.1,1.8,1.9]
xli = [1.1, 1.2] # 插入x值
# 一维插值函数
# 参数分别是x轴数组,y轴数组,插值类型
# 插值类型有: 1. 'zero' 0阶B样条曲线  2. 'slinear' 1阶B样条曲线  3. 'quadratic' 2阶B样条曲线  4. 'cubic' 4阶B样条曲线。 阶数越高越具曲线特征且凹凸性表现更强
yli = inter.interp1d(x,y,kind="cubic")(xli) # 此处inter.interp1d(x,y,kind="cubic")返回的是函数,即(yli)相当于给函数传参
# xli即为[1.25,1.26]对应的x值
plt.plot(x,y,'--',xli,yli,'-')
plt.legend(['data','cubic'],loc='best')
plt.show()

# 上述是通过x值获取y值,通过y值获取x值如下
yli = [1.25, 1.26] # 插入y值
xli = inter.interp1d(y,x,kind="cubic")(yli)
plt.plot(x,y,'--',xli,yli,'-')
plt.legend(['data','cubic'],loc='best')
plt.show()

使用scipy库将离散点连续化_第1张图片

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