#include<stdioh>
#include<mathh>
double Lagrange1(double x, double y, double xx) //拉格郎日插值
{
int i,j;
double a,yy=0000;
a=new double[6];
for(i=0;i< 6;i++)
{
a[i]=y[i];
for(j=0;j< 6;j++)
if(j!=i)
a[i]=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
delete a;
return yy;
}
double Lagrange2(double x, double y, double input) //分段线性插值
{
double output;
int i;
for (i=0;i<5;i++)
{
if (x[i] <= input && x[i+1] >= input)
{
output=y[i] +(y[i+1]-y[i])(input-x[i])/(x[i+1]-x[i]);
break;
}
}
return output;
}
double Lagrange3(double x,double y,double u) //分段二次插值
{
int i,k=0;
double v;
for(i=0;i<6;i++)
{
if(u<x[1])
{
k=0;
v=y[k](u-x[k+1])(u-x[k+2])/((x[k]-x[k+1])(x[k]-x[k+2]))+y[k+1](u-x[k])(u-x[k+2])/((x[k+1]-x[k])(x[k+1]-x[k+2]))+y[k+2](u-x[k])(u-x[k+1])/((x[k+2]-x[k])(x[k+2]-x[k+1]));
}
if((x[i]<u&&u<=x[i+1])&&(fabs(u-x[i])<=fabs(u-x[i+1])))
{
k=i-1;
v=y[k](u-x[k+1])(u-x[k+2])/((x[k]-x[k+1])(x[k]-x[k+2]))+y[k+1](u-x[k])(u-x[k+2])/((x[k+1]-x[k])(x[k+1]-x[k+2]))+y[k+2](u-x[k])(u-x[k+1])/((x[k+2]-x[k])(x[k+2]-x[k+1]));
}
if ((x[i]<u&&u<=x[i+1])&&fabs(u-x[i])>fabs(u-x[i+1]))
{
k=i;
v=y[k](u-x[k+1])(u-x[k+2])/((x[k]-x[k+1])(x[k]-x[k+2]))+y[k+1](u-x[k])(u-x[k+2])/((x[k+1]-x[k])(x[k+1]-x[k+2]))+y[k+2](u-x[k])(u-x[k+1])/((x[k+2]-x[k])(x[k+2]-x[k+1]));
}
if(u>x[4])
{
k=3;
v=y[k](u-x[k+1])(u-x[k+2])/((x[k]-x[k+1])(x[k]-x[k+2]))+y[k+1](u-x[k])(u-x[k+2])/((x[k+1]-x[k])(x[k+1]-x[k+2]))+y[k+2](u-x[k])(u-x[k+1])/((x[k+2]-x[k])(x[k+2]-x[k+1]));
}
}
return v;
}
void main()
{
double x[6] = {00, 01, 0195, 03, 0401, 05},y[6] = {039894,039695,039142,038138,036812,035206};
double u;
scanf("%lf",&u);
printf("%f\n",Lagrange1(x,y,u)); //拉格郎日插值
printf("%f\n",Lagrange2(x,y,u)); //分段线性插值
printf("%f\n",Lagrange3(x,y,u)); //分段二次插值
}
不清楚你的具体问题,给你如下的例子。你可以参考下。
§2 插值问题
在应用领域中,由有限个已知数据点,构造一个解析表达式,由此计算数据点之间的函数值,称之为插值。
实例:海底探测问题
某公司用声纳对海底进行测试,在5×5海里的坐标点上测得海底深度的值,希望通过这些有限的数据了解更多处的海底情况。并绘出较细致的海底曲面图。
一、一元插值
一元插值是对一元数据点(xi,yi)进行插值。
1. 线性插值:由已知数据点连成一条折线,认为相临两个数据点之间的函数值就在这两点之间的连线上。一般来说,数据点数越多,线性插值就越精确。
调用格式:yi=interp1(x,y,xi,’linear’) %线性插值
zi=interp1(x,y,xi,’spline’) %三次样条插值
wi=interp1(x,y,xi,’cubic’) %三次多项式插值
说明:yi、zi、wi为对应xi的不同类型的插值。x、y为已知数据点。
例1:已知数据:
x 0 1 2 3 4 5 6 7 8 9 1
y 3 5 1 14 16 19 6 4 8 15 2
求当xi=025时的yi的值。
程序:
x=0:1:1;
y=[3 5 1 14 16 1 6 4 8 15 2];
yi0=interp1(x,y,0025,'linear')
xi=0:02:1;
yi=interp1(x,y,xi,'linear');
zi=interp1(x,y,xi,'spline');
wi=interp1(x,y,xi,'cubic');
plot(x,y,'o',xi,yi,'r+',xi,zi,'g',xi,wi,'k-')
legend('原始点','线性点','三次样条','三次多项式')
结果:yi0 = 03500
要得到给定的几个点的对应函数值,可用:
xi =[ 02500 03500 04500]
yi=interp1(x,y,xi,'spline')
结果:
yi =12088 15802 13454
(二) 二元插值
二元插值与一元插值的基本思想一致,对原始数据点(x,y,z)构造见世面函数求出插值点数据(xi,yi,zi)。
一、单调节点插值函数,即x,y向量是单调的。
调用格式1:zi=interp2(x,y,z,xi,yi,’linear’)
‘liner’ 是双线性插值 (缺省)
调用格式2:zi=interp2(x,y,z,xi,yi,’nearest’)
’nearest’ 是最近邻域插值
调用格式3:zi=interp2(x,y,z,xi,yi,’spline’)
‘spline’是三次样条插值
说明:这里x和y是两个独立的向量,它们必须是单调的。z是矩阵,是由x和y确定的点上的值。z和x,y之间的关系是z(i,:)=f(x,y(i)) z(:,j)=f(x(j),y) 即:当x变化时,z的第i行与y的第i个元素相关,当y变化时z的第j列与x的第j个元素相关。如果没有对x,y赋值,则默认x=1:n, y=1:m。n和m分别是矩阵z的行数和列数。
例2:已知某处山区地形选点测量坐标数据为:
x=0 05 1 15 2 25 3 35 4 45 5
y=0 05 1 15 2 25 3 35 4 45 5 55 6
海拔高度数据为:
z=89 90 87 85 92 91 96 93 90 87 82
92 96 98 99 95 91 89 86 84 82 84
96 98 95 92 90 88 85 84 83 81 85
80 81 82 89 95 96 93 92 89 86 86
82 85 87 98 99 96 97 88 85 82 83
82 85 89 94 95 93 92 91 86 84 88
88 92 93 94 95 89 87 86 83 81 92
92 96 97 98 96 93 95 84 82 81 84
85 85 81 82 80 80 81 85 90 93 95
84 86 81 98 99 98 97 96 95 84 87
80 81 85 82 83 84 87 90 95 86 88
80 82 81 84 85 86 83 82 81 80 82
87 88 89 98 99 97 96 98 94 92 87
其地貌图为:
对数据插值加密形成地貌图。
程序:
x=0:5:5;
y=0:5:6;
z=[89 90 87 85 92 91 96 93 90 87 82
92 96 98 99 95 91 89 86 84 82 84
96 98 95 92 90 88 85 84 83 81 85
80 81 82 89 95 96 93 92 89 86 86
82 85 87 98 99 96 97 88 85 82 83
82 85 89 94 95 93 92 91 86 84 88
88 92 93 94 95 89 87 86 83 81 92
92 96 97 98 96 93 95 84 82 81 84
85 85 81 82 80 80 81 85 90 93 95
84 86 81 98 99 98 97 96 95 84 87
80 81 85 82 83 84 87 90 95 86 88
80 82 81 84 85 86 83 82 81 80 82
87 88 89 98 99 97 96 98 94 92 87];
mesh(x,y,z) %绘原始数据图
xi=linspace(0,5,50); %加密横坐标数据到50个
yi=linspace(0,6,80); %加密纵坐标数据到60个
[xii,yii]=meshgrid(xi,yi); %生成网格数据
zii=interp2(x,y,z,xii,yii,'cubic'); %插值
mesh(xii,yii,zii) %加密后的地貌图
hold on % 保持图形
[xx,yy]=meshgrid(x,y); %生成网格数据
plot3(xx,yy,z+01,'ob') %原始数据用‘O’绘出
2、二元非等距插值
调用格式:zi=griddata(x,y,z,xi,yi,’指定插值方法’)
插值方法有: linear % 线性插值 (默认)
bilinear % 双线性插值
cubic % 三次插值
bicubic % 双三次插值
nearest % 最近邻域插值
例:用随机数据生成地貌图再进行插值
程序:
x=rand(100,1)4-2;
y=rand(100,1)4-2;
z=xexp(-x^2-y^2);
ti=-2:25:2;
[xi,yi]=meshgrid(ti,ti); % 加密数据
zi=griddata(x,y,z,xi,yi);% 线性插值
mesh(xi,yi,zi)
hold on
plot3(x,y,z,'o')
假设序列存在变量a中
xa=ones(size(a));
xa=cumsum(xa);
b=a(a<=T);
xb=xa(a<=T);
c=interp1(xb,b,xa,'linear','extrap');
c就是要求的序列
三次样条插值函数边界条件由实际问题对三次样条插值在端点的状态要求给出。以第1边界条件为例,用节点处二阶导数表示三次样条插值函数,用追赶法求解相关方程组。通过Matlab编制三次样条函数的通用程序,可直接显示各区间段三次样条函数体表达式,计算出已给点插值并显示各区间分段曲线图
0引言分段低次样条插值虽然计算简单、稳定性好、收敛性有保证且易在电子计算机上实现,但只能保证各小段曲线在连接处的连续性,不能保证整件曲线的光滑性。利用样条插值,既可保持分段低次插值多项式,又可提高插值函数光滑性。故给出分段三次样条插值的构造过程、算法步骤,利用
x=[01 08 13 19 25 31];
y=[12 16 27 20 13 05];
a=interp1(x,y,20)%线性插值
a1=interp1(x,y,20,'spline')%三次插值
分段线性插值就是满足shape-preserving的。Matlab里有这样的命令,直接调用,非常简单,自己去查。
而所有高于二次的多项式插值方法,都会产生虚假的波动,不具备保形效果。
在要求shape-preserving的同时,如果对插值精度没有要求,那么分段线性插值就非常好了,其缺陷仅在于插值曲线连续但不光滑(即导数不连续)。
Matlab中的一维插值函数为yi=(x,y,xi,method),其中method选取"nearest"(临近点插值)或"linear"(线性插值)都是保形的。
以上就是关于分段线性插值问题全部的内容,包括:分段线性插值问题、matlab插值、求一段matlab程序,把序列中大于阀值的点去掉,并用线性插值得到的点替代等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)