多项式插值拟合(一)

使用多项式插值法进行点间拟合。

多项式方程:

展开形式:f(x)=a0x+a1x^2+a2x^3+...

给定n个平面坐标点,通过多项式方程可求解n个方程参数解,并且解是唯一的(自证)。

解法采用范德蒙行列式求解。

在图像处理过程中有时会用到线段区域拟合,因此采用插值法将n点之间进行点补充。

一阶方程:y=kx+b 需要两点(x1,y1),(x0,y0)

   参数    k=(y1-y0)/(x1-x0),b=y0-k*x0

可以使用scipy库中的插值类

举个例子:对5点之间进行一阶插值

import numpy as np
from scipy.interpolate import interp1d,interp2d
import pylab as pl


x=np.array([1,2,3,4,5])
y=np.array([1,4,2,4,1])



fun=interp1d(x,y,kind='linear')#函数 y是一系列点,根据x,y关系推出函数
xint=np.linspace(x.min(),x.max(),20)
print("库x:",xint)
print("库y:",fun(xint))
pl.scatter(x,y,c='b',marker='o')
pl.plot(xint,fun(xint),color='red')
pl.show()

插值后的图像

 输出插值结果

库x: [1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]
库y: [1.         1.63157895 2.26315789 2.89473684 3.52631579 3.89473684
 3.47368421 3.05263158 2.63157895 2.21052632 2.21052632 2.63157895
 3.05263158 3.47368421 3.89473684 3.52631579 2.89473684 2.26315789
 1.63157895 1.        ]

自定义插值

import numpy as np
from scipy.interpolate import interp1d,interp2d
import pylab as pl





#------------------------
x=np.array([1,2,3,4,5])
y=np.array([1,4,2,4,1])




xint=np.linspace(x.min(),x.max(),20)



# 1、线性
def linear_inter(x0,y0,x1,y1,nx):
    k=(y1-y0)/(x1-x0)
    b=y0-k*x0
    ny=k*nx+b
    return ny



for i in range(1,len(x)):
    print("-----第",i,"区间内数据-----")
    # print(ny)
    nx=[]
    for val in xint:
        if val>=x[i-1] and val<=x[i]:
            nx.append(val)

    print(nx)
    nx=np.array(nx)
    ny = linear_inter(x[i - 1], y[i - 1], x[i], y[i], nx)
    print("结果",ny)

    pl.scatter(x,y,c='b',marker='o')
    pl.plot(nx,ny,color='red')
pl.show()

由于分段连接与上图结果有所区别。

每个两点区间获得的y值均相等。

-----第 1 区间内数据-----
[1.0, 1.2105263157894737, 1.4210526315789473, 1.631578947368421, 1.8421052631578947]
结果 [1.         1.63157895 2.26315789 2.89473684 3.52631579]
-----第 2 区间内数据-----
[2.052631578947368, 2.263157894736842, 2.473684210526316, 2.6842105263157894, 2.894736842105263]
结果 [3.89473684 3.47368421 3.05263158 2.63157895 2.21052632]
-----第 3 区间内数据-----
[3.1052631578947367, 3.3157894736842106, 3.526315789473684, 3.7368421052631575, 3.9473684210526314]
结果 [2.21052632 2.63157895 3.05263158 3.47368421 3.89473684]
-----第 4 区间内数据-----
[4.157894736842105, 4.368421052631579, 4.578947368421052, 4.789473684210526, 5.0]
结果 [3.52631579 2.89473684 2.26315789 1.63157895 1.        ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值