- 外文名
- Linear Interpolation
- 定 义
- 插值函数为一次多项式的插值方式
- 特 点
- 简单、方便
- 中文名
- 线性插值
- 几何意义
- 用过两插值节点的直线近似原函数
- 应 用
- 近似代替原函数、插值得到数值
-
线性插值
2018-08-16 20:35:241、线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。 2、几何意义 线性插值的几何意义如右图所示,即为利用过点 和 的直线来近似原函数。 3、应用 1)线性插值在一定允许误差下...1、线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。
2、几何意义
线性插值的几何意义如右图所示,即为利用过点
和
的直线
来近似原函数
。
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通过线性插值和矢量线性插值实现图形动画
2014-11-16 20:45:11Qt通过线性插值原理和矢量线性插值原理,完成鼠标取点绘制图形并实现图形从初始图形运动到终止图形的动画。 -
[计算机动画] 线性插值 矢量线性插值
2016-11-09 12:34:53线性插值,也就是给定初始点集合和终止点集合,然后给定一个映射关系。对一一对应的点的位置,即对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)》 -
python分段线性插值_[Python] 分段线性插值
2020-12-08 13:53:25利用线性函数做插值每一段的线性函数:#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()
-
python线性插值_Python坐标线性插值应用实现
2020-12-21 17:10:27现在需使用线性插值的方法求取每两个坐标之间的其他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分段线性插值_Python实现分段线性插值
2020-12-08 13:53:48本文实例为大家分享了Python实现分段线性插值的具体代码,供大家参考,具体内容如下函数:算法这个算法不算难。甚至可以说是非常简陋。但是在代码实现上却比之前的稍微麻烦点。主要体现在分段上。图像效果代码import... -
python三维线性插值_[Python] 分段线性插值
2020-12-04 20:40:45利用线性函数做插值每一段的线性函数:#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线性插值解析就是小...
-
kernel-headers-4.14.91-201.el7.x86_64.rpm
-
Python中的random模块用于生成随机数
-
kernel-headers-4.19.113-300.el7.x86_64.rpm
-
Fiddler工具使用之菜单栏介绍
-
flutter插件调用APP页面、使用原生aar,framework库
-
什么是Java内存模型
-
android5.1以太网共享4g,wifi网络.rar
-
算法导论(基础知识)——编程大牛的必经之路
-
IPAD MINI2维修原理图PCB位置图(PDF格式)
-
《Python编程:从入门到实践》源代码文件
-
【数据分析-随到随学】数据分析建模和预测
-
单元测试UnitTest+Pytest【Selenium3】
-
百度百科编辑中常见的问题以及解决方法
-
MATLAB所有画图函数.pdf
-
LED_SW.zip
-
21年新消息队列RabbitMQ视频教程AMQP教程
-
kernel-headers-4.14.111-200.el7.x86_64.rpm
-
三维地图GIS大数据可视化
-
2021-01-23 打卡学习C++第三天
-
【数据分析-随到随学】Tableau数据分 析+PowerBI