线性插值 订阅
线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。线性插值相比其他插值方式,如抛物线插值,具有简单、方便的特点。线性插值的几何意义即为概述图中利用过A点和B点的直线来近似表示原函数。线性插值可以用来近似代替原函数,也可以用来计算得到查表过程中表中没有的数值。 展开全文
线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。线性插值相比其他插值方式,如抛物线插值,具有简单、方便的特点。线性插值的几何意义即为概述图中利用过A点和B点的直线来近似表示原函数。线性插值可以用来近似代替原函数,也可以用来计算得到查表过程中表中没有的数值。
信息
外文名
Linear Interpolation
定    义
插值函数为一次多项式的插值方式
特    点
简单、方便
中文名
线性插值
几何意义
用过两插值节点的直线近似原函数
应    用
近似代替原函数、插值得到数值
线性插值基础知识
已知函数 在区间 上 个互异点 上的函数值 ,若存在一简单函数 ,使 并要求误差 的绝对值 在整个区间 上比较小。这样的问题称为插值问题。其中 :插值节点 :被插值函数 :插值函数 :插值区间如果在插值区间内部用 代替 则称为内插;在插值区间以外,用 代替 则称为外插。 [1] 
收起全文
精华内容
下载资源
问答
  • 线性插值

    千次阅读 2018-08-16 20:35:24
    1、线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。 2、几何意义 线性插值的几何意义如右图所示,即为利用过点 和 的直线来近似原函数。 3、应用 1)线性插值在一定允许误差下...

    1、线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。

    2、几何意义

    线性插值的几何意义如右图所示,即为利用过点(x_{0},y_{0}) 和 (x_{1},y_{1}) 的直线L(x)来近似原函数f(x)

    3、应用

    1)线性插值在一定允许误差下,可以近似代替原来函数;

    2)在查询各种数值表时,可通过线性插值来得到表中没有的数值。

     

    参考:https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC/19113392?fr=aladdin#3

    展开全文
  • Qt通过线性插值原理和矢量线性插值原理,完成鼠标取点绘制图形并实现图形从初始图形运动到终止图形的动画。
  • 线性插值,也就是给定初始点集合和终止点集合,然后给定一个映射关系。对一一对应的点的位置,即对x,y坐标进行线性插值。   x = x0*t + x1*(1-t); y = y0*t + y1*(1-t);    而矢量线性插值,是在给定初始点和终止...


        线性插值,也就是给定初始点集合和终止点集合,然后给定一个映射关系。对一一对应的点的位置,即对x,y坐标进行线性插值。

     

    x = x0*t + x1*(1-t);

    y = y0*t + y1*(1-t);

     

        而矢量线性插值,是在给定初始点和终止点集合后,将n个点转换为n-1个按顺序首尾相连的向量。然后,再将向量转化为极坐标,并对长度和角度进行线性插值。相当于将其转换到另外一个空间,维护了其角度和长度上的连续性。

     

    a = a*t + a*(1-t);

    p = p*t + p*(1-t);


            线性插值

    void interpolation::setLinearPoint()
    {
        interPoint = new point*[num+1];//num为中间插值的个数
        for(int t=0;t<=num;t++){
            interPoint[t] = new point[size];
            for(int i=0;i<size;i++){//size为图形的点个数,需要对每个点都进行插值
                interPoint[t][i].x = (1-1.0f*t/num)*startPoint[i].x
                        + 1.0f*t/num*endPoint[i].x;
                interPoint[t][i].y = (1-1.0f*t/num)*startPoint[i].y
                        + 1.0f*t/num*endPoint[i].y;
    
            }
        }
    }

            而对于矢量线性插值,要考虑的问题则相对复杂。

            (1)矢量是没有位置的,它只有大小和方向信息。所以在对极坐标两个参数插值后,还需要确定它的位置。要获取位置信息,我们采用的方法是对第一个点的坐标进行线性插值。

    //对第一个点的位置线性插值
        interPoint = new point*[num+1];
        for(int t=0;t<=num;t++){
            interPoint[t] = new point[size];
            interPoint[t][0].x = (1-1.0f*t/num)*startPoint[0].x
                    + 1.0f*t/num*endPoint[0].x;
            interPoint[t][0].y = (1-1.0f*t/num)*startPoint[0].y
                    + 1.0f*t/num*endPoint[0].y;
    }
       //根据矢量定义,依次求出其余点坐标
        for(int t=0;t<=num;t++){
            for(int i=1;i<size;i++){
                interPoint[t][i].x = interPoint[t][i-1].x
                        + interVec[t][i-1].p*cos(interVec[t][i-1].a);
                interPoint[t][i].y = interPoint[t][i-1].y
                        + interVec[t][i-1].p*sin(interVec[t][i-1].a);
            }
        }

            (2)矢量线性插值会出现二义性

           

     

             如图,从一个矢量到另外一个矢量,有两种可能的旋转方式。如果直接对角度进行插值,而不做任何处理,会出现错误(与预期不符合)的旋转方向。具体表现并不是按相反方向旋转,而是一种参差不齐的现象:有的边按预期方向旋转,但有的边却不按预期方向旋转。

             一种解决方法:强制保证旋转角度小于180度,这样能在极大多数情况下避免旋转方向不统一的现象(虽然不一定保证按预期方向)。例外在于旋转角度在180度附近时,依然会出现问题。

        //矢量线性插值
        for(int t=0;t<=num;t++){
            interVec[t] = new vec[size];
            for(int i=0;i<size-1;i++){
                //case 1:
                if(endVec[i].a-startVec[i].a<-pi){
                    interVec[t][i].a = (1-1.0f*t/num)*startVec[i].a
                            + 1.0f*t/num*(endVec[i].a+2*pi);
                }
                //case 2:
                else if(endVec[i].a-startVec[i].a>pi){
                    interVec[t][i].a = (1-1.0f*t/num)*(startVec[i].a+2*pi)
                            + 1.0f*t/num*endVec[i].a;
                }
                //case 3:
                else{
                    interVec[t][i].a = (1-1.0f*t/num)*startVec[i].a
                            + 1.0f*t/num*endVec[i].a;
                }
                interVec[t][i].p = (1-1.0f*t/num)*startVec[i].p
                        + 1.0f*t/num*endVec[i].p;
            }
        }

            首先需要说明的一点,计算角度时,是通过反正切得到的,获得角度的范围在[-pi,pi]。为了保证旋转角小于180度,需要在大于180度时对某一角度强制加上2*pi,相当于多旋转一个周期,这样就改变了它们的相对位置,也就保证了角度的差值将小于180度。

     

            另外一种解决方法:既然程序无法判断我们理想中的旋转方向,可以让用户告诉程序是需要顺时针还是逆时针旋转。

            指定顺时针旋转(保证末角度始终大于初角度)

        //矢量线性插值
        for(int t=0;t<=num;t++){
            interVec[t] = new vec[size];
            for(int i=0;i<size-1;i++){
    
                if(endVec[i].a-startVec[i].a<0){
                    interVec[t][i].a = (1-1.0f*t/num)*startVec[i].a
                            + 1.0f*t/num*(endVec[i].a+2*pi);
                }
                else{
                    interVec[t][i].a = (1-1.0f*t/num)*startVec[i].a
                            + 1.0f*t/num*endVec[i].a;
                }
                interVec[t][i].p = (1-1.0f*t/num)*startVec[i].p
                        + 1.0f*t/num*endVec[i].p;
            }
        }


            指定逆时针旋转(保证末角度小于初角度)

        for(int t=0;t<=num;t++){
            interVec[t] = new vec[size];
            for(int i=0;i<size-1;i++){
    
                if(endVec[i].a-startVec[i].a>0){
                    interVec[t][i].a = (1-1.0f*t/num)*(startVec[i].a+2*pi)
                            + 1.0f*t/num*(endVec[i].a);
                }
                else{
                    interVec[t][i].a = (1-1.0f*t/num)*startVec[i].a
                            + 1.0f*t/num*endVec[i].a;
                }
                interVec[t][i].p = (1-1.0f*t/num)*startVec[i].p
                        + 1.0f*t/num*endVec[i].p;
            }
        }



    展开全文
  • 球面线性插值

    2016-12-26 19:59:03
    主要利用球面线性插值对关键帧运动进行填充。对应博客看本人博客:《球面线性插值(Spherical Linear Interpolation,Slerp)》
  • 利用线性函数做插值每一段的线性函数:#Program 0.6 Linear Interploationimport numpy as npimport matplotlib.pyplot as plt#分段线性插值闭包def get_line(xn, yn):def line(x):index = -1#找出x所在的区间for i ...

    利用线性函数做插值

    每一段的线性函数:

    #Program 0.6 Linear Interploation

    import numpy as np

    import matplotlib.pyplot as plt

    #分段线性插值闭包

    def get_line(xn, yn):

    def line(x):

    index = -1

    #找出x所在的区间

    for i in range(1, len(xn)):

    if x <= xn[i]:

    index = i-1

    break

    else:

    i += 1

    if index == -1:

    return -100

    #插值

    result = (x-xn[index+1])*yn[index]/float((xn[index]-xn[index+1])) + (x-xn[index])*yn[index+1]/float((xn[index+1]-xn[index]))

    return result

    return line

    xn = [i for i in range(-50,50,10)]

    yn = [i**2 for i in xn]

    #分段线性插值函数

    lin = get_line(xn, yn)

    x = [i for i in range(-50, 40)]

    y = [lin(i) for i in x]

    #画图

    plt.plot(xn, yn, 'ro')

    plt.plot(x, y, 'b-')

    plt.show()

    展开全文
  • 现在需使用线性插值的方法求取每两个坐标之间的其他4个点的值。二、插值原理使用等比插值的方法起始值为 a终止值为 b步长值为 (a-b)/5后面的数分别为 a+n, a+2n, a+3n, a+4n三、代码实习对 x 插值interx.pyimport ...

    一、背景

    在野外布设700米的测线,点距为10米,用GPS每隔50米测量一个坐标,再把测线的头和为测量一个坐标。现在需使用线性插值的方法求取每两个坐标之间的其他4个点的值。

    二、插值原理

    使用等比插值的方法

    起始值为 a

    终止值为 b

    步长值为 (a-b)/5

    后面的数分别为 a+n, a+2n, a+3n, a+4n

    三、代码实习对 x 插值

    interx.py

    import numpy as np

    f = np.loadtxt('datax.txt')

    a = f[:, 0]

    b = f[:, 1]

    for j in np.arange(len(a)):

    aa = a[j]*1000# np.arrange()会自动去掉小数

    bb = b[j]*1000

    n = (bb-aa) / 5

    x = np.arange(6)

    x[0] = aa

    print(x[0]/1000)

    for i in range(1, 5, 1):

    x[i] = x[i-1]+n

    print(x[i]/1000)

    i = i+1

    # print(bb/1000)

    # print("\n")

    datax.txt

    514873.536 514883.939

    514883.939 514894.358

    514894.358 514903.837

    514903.837 514903.807

    514903.807 514907.179

    514907.179 514911.356

    514911.356 514913.448

    514913.448 514913.315

    514913.315 514917.344

    514917.344 514923.684

    514923.684 514924.801

    514924.801514929.697

    514929.697 514916.274

    对 y 插值

    intery.py

    import numpy as np

    f = np.loadtxt('datay.txt')

    a = f[:, 0]

    b = f[:, 1]

    for j in np.arange(len(a)):

    aa = (a[j] - 2820000)*1000# 数据太长会溢出

    bb = (b[j]-2820000)*1000

    n = (bb-aa) / 5

    x = np.arange(6)

    x[0] = aa

    print(x[0]/1000+2820000)

    for i in range(1, 5, 1):

    x[i] = x[i-1]+n

    print(x[i]/1000+2820000)

    i = i+1

    # print(bb/1000)

    # print("\n")

    datay.txt

    2820617.820 2820660.225

    2820660.225 2820693.988

    2820693.988 2820819.199

    2820819.199 2820831.510

    2820831.510 2820858.666

    2820858.666 2820973.487

    2820973.487 2821017.243

    2821017.243 2821019.518

    2821019.518 2821058.223

    2821058.223 2821097.575

    2821097.575 2821144.436

    2821144.436 2821173.356

    2821173.356 2821218.889

    四、最终成果

    手动把两次插值结果复制到dataxy中

    dataxy.txt

    514873.536 2820617.819

    514875.616 2820626.300

    514877.696 2820634.781

    514879.776 2820643.262

    514881.856 2820651.743

    514883.939 2820660.225

    514886.022 2820666.977

    514888.105 2820673.729

    514890.188 2820680.481

    514892.271 2820687.233

    514894.358 2820693.987

    514896.253 2820719.029

    514898.148 2820744.071

    514900.043 2820769.113

    514901.938 2820794.155

    514903.837 2820819.199

    514903.831 2820821.661

    514903.825 2820824.123

    514903.819 2820826.585

    514903.813 2820829.047

    514903.807 2820831.509

    514904.481 2820836.940

    514905.155 2820842.371

    514905.829 2820847.802

    514906.503 2820853.233

    514907.179 2820858.666

    514908.014 2820881.630

    514908.849 2820904.594

    514909.684 2820927.558

    514910.519 2820950.522

    514911.356 2820973.487

    514911.774 2820982.238

    514912.192 2820990.989

    514912.610 2820999.740

    514913.028 2821008.491

    514913.448 2821017.242

    514913.421 2821017.697

    514913.394 2821018.152

    514913.367 2821018.607

    514913.340 2821019.062

    514913.315 2821019.518

    514914.120 2821027.259

    514914.925 2821035.000

    514915.730 2821042.741

    514916.535 2821050.482

    514917.344 2821058.223

    514918.612 2821066.093

    514919.880 2821073.963

    514921.148 2821081.833

    514922.416 2821089.703

    514923.684 2821097.575

    514923.907 2821106.947

    514924.130 2821116.319

    514924.353 2821125.691

    514924.576 2821135.063

    514924.801 2821144.436

    514925.780 2821150.219

    514926.759 2821156.002

    514927.738 2821161.785

    514928.717 2821167.568

    514929.697 2821173.356

    514927.012 2821182.462

    514924.327 2821191.568

    514921.642 2821200.674

    514918.957 2821209.780

    五、画图对比

    dataxy.py

    import numpy as np

    import matplotlib as mpl

    from matplotlib import pyplot as plt

    # 解决中文字体显示不出来

    mpl.rcParams["font.sans-serif"]=["SimHei"]

    mpl.rcParams["axes.unicode_minus"] = False

    a = np.loadtxt("datax.txt")

    b = np.loadtxt('datay.txt')

    c = np.loadtxt('dataxy.txt')

    x = a[: ,0]

    y = b[: ,0]

    xx = c[:,0]

    yy = c[:,1]

    plt.plot(x,y,color = 'orange',

    label = '插值线段')

    plt.scatter(xx,yy,marker='o',

    c = 'deepskyblue',

    alpha = 0.6,

    label = '实测点位')

    plt.legend()

    plt.title('Python坐标插值')

    plt.grid()

    # 保存高清图片,dpi表示分辨率

    plt.savefig('out.png',dpi = 600)

    plt.show()

    文件结构

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 线性插值 双线性插值

    2018-04-05 15:12:59
    线性插值先讲一下线性插值:已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值(反过来也是一样,略):上面比较好理解吧,仔细看就是用x和x0,x1的距离作为一个权重,用于y0和y1的...
  • 本文实例为大家分享了Python实现分段线性插值的具体代码,供大家参考,具体内容如下函数:算法这个算法不算难。甚至可以说是非常简陋。但是在代码实现上却比之前的稍微麻烦点。主要体现在分段上。图像效果代码import...
  • 利用线性函数做插值每一段的线性函数:#Program 0.6 Linear Interploationimport numpy as npimport matplotlib.pyplot as plt#分段线性插值闭包def get_line(xn, yn):def line(x):index = -1#找出x所在的区间for i ...
  • python线性插值解析

    2020-12-17 10:48:57
    可以用pandas的函数进行填充,因为这个就是线性插值法 df..interpolate() dd=pd.DataFrame(data=[0,np.nan,np.nan,1]) dd.interpolate() 补充知识:线性插值公式简单推导 以上这篇python线性插值解析就是小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,467
精华内容 1,386
关键字:

线性插值