大家好,又见面了,我是你们的朋友全栈君。
线性内插是假设在二个已知数据中的变化为线性关系,因此可由已知二点的座标(a, b)去计算通过这二点的 斜线,公式如下:
其中 a<b<c 在上式的 b 点即是代表要内插的点,f(b) 则是要计算的内插函数值。下图即是一个以二种内插 法的比较
\pcxfile[12cm,5cm]{fig9_1.pcx}
\caption{线性式与 spline 函数的曲线契合}
线性内插是最简单的内插方法,但其适用范围很小;如果原来数据的函数f有极大的变化,假设其数据点之 间为线性变化并不合理。所以我们可以用二次、三次方程式或是另一种称为spline函数来近似原来数据的函 数。MATLAB的一维内插函数是interp1,其语法为interp1(x,y,xi),interp1(x,y,xi,’method’);其中的x,y是原已知的 数据的x,y值,而xi则是要内插的数据点,另外method可以设定内插方法有 linear,cubic,spline,分别是一次、三 次方程式和spline函数,其中预设方法是linear。如果数据的变化较大,以 spline函数内插所形成的曲线最平滑 ,所以效果最好。而三次方程式所得到的内插曲线平滑度,则介于线性与spline函数之间。
我们以下面的例子说明。假设有一个汽车引擎在定转速下,温度与时间(单位为sec)的三次量测值如下
time |
temp1 |
temp2 |
temp3 |
0 |
0 |
0 |
0 |
1 |
20 |
110 |
176 |
2 |
60 |
180 |
220 |
3 |
68 |
240 |
349 |
4 |
77 |
310 |
450 |
5 |
110 |
405 |
503 |
其中温度的数据从 20oC变化到 503oC,如果要估计在t=2.6, 4.9 sec 的温度,可以下列指令计算
>> x=[0 1 2 3 4 5]’; % 键入时间
>> y=[0 20 60 68 77 110]’; % 键入第一组时间
>> y1=interp1(x,y,2.6) % 要内插的数据点为 2.6
y1 = % 对应 2.6 的函数值为 64.8
64.8
>> y1=interp1(x,y,[2.6 4.9]) % 内插数据点为 2.6, 4.9,注意用[ ]将多个内插点放在其中
y1 =
64.8
106.7
>> y1=interp1(x,y,2.6,’cubic’) % 以三次方程式对数据点 2.6 作内插
y1 = % 对应 2.6 的函数值为 66.264
66.264
>> y1=interp1(x,y,2.6,’spline’) % 以spline函数对数据点 2.6 作内插
y1 = % 对应 2.6 的函数值为 66.368
66.368
以下的例子还配合绘图功能,用以比较不同内插方法的差异。
>> h=1:12;
>> temp=[5 8 9 15 25 29 31 30 22 25 27 24]; % 这组温度数据变化较大
>> plot(h,temp,’–‘,h,temp,’+’) % 将线性内插结果绘图
>> h_3=1:0.1:12 % 要每0.1小时估计一次温度值
>> t_3=interp1(h,temp,h_3,’cubic’) % 以三次方程式做内插
>> t_s=interp1(h,temp,h_3,’spline’) % 以spline函数做内插
>> hold on
>> subplot(1,2,1)
>> plot(h,temp,’–‘,h,temp,’+’,h_3,t_3) % 将线性及三次方程式内插绘图
>> subplot(1,2,2)
>> plot(h,temp,’–‘,h,temp,’+’,h_3,t_s) % 将线性方程式及spline内插绘图
>> hold off
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140587.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...