菜鸟问题:直接将n个数插值为m(m>n)个数的算法。 完后立即给分!!!

gxqcdit 2005-03-22 11:05:25

这n个数是浮点数,如:8.331;12.769;10.512等等;

比如将2000(n = 2000)个浮点数插值为3500(m = 3500)个浮点数。

本人不熟悉插值算法,请高手帮忙。
...全文
287 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sitanda 2005-04-07
  • 打赏
  • 举报
回复
void main()
{
cout<<" ***************插值法******************"<<endl;
cout<<"请选择您要完成的功能:"<<endl;
cout<<"<0>.退出 <1>.分段线性插值法 <2>.分段二次插值法 <3>.全区间上的拉格朗日插值法"<<endl;
int choice;
cin>>choice;
int number,a;
while(choice)
{
cout<<"请问您要输入几组数据?";
cin>>number;
cout<<"请输入您的数据:"<<endl;
float *px=new float[number];
float *py=new float[number];
for(a=0;a<number;a++)
cout<<"x"<<a+1<<" ";
cout<<endl;
for(a=0;a<number;a++)
cin>>px[a];
for(a=0;a<number;a++)
cout<<"y"<<a+1<<" ";
cout<<endl;
for(a=0;a<number;a++)
cin>>py[a];
switch(choice)
{
case 1: linearity(px,py,number);break;
case 2: squared(px,py,number);break;
case 3: lagrange(px,py,number);break;
default: cout<<"您的输入有误,请重试!"<<endl;
}
cout<<"继续吗?"<<endl
<<"<0>.退出 <1>.分段线性插值法 <2>.分段二次插值法 <3>.全区间上的拉格朗日插值法"<<endl;
cin>>choice;
delete px,py;
}

}


void linearity(float *px,float *py,int number)
{
float x,x0,x1,y0,y1,f;
int a;
cout<<"请输入您要计算的x的值:";
cin>>x;
float *pa=new float[number];
for(a=0;a<number;a++)
{
pa[a]=px[a]-x;
if(pa[a]<0)
pa[a]=-pa[a];
}
float *p=new float[number];
for(a=0;a<number;a++)
p[a]=pa[a];
float temp;
for(int pass=1;pass<number;pass++)
{
for(int i=0;i<number-pass;i++)
{
temp=p[i];
p[i]=p[i+1];
p[i+1]=temp;
}
}
for(a=0;a<number;a++)
{
if(p[0]=pa[a])
{
x0=px[a];
y0=py[a];
}
if(p[1]=pa[a])
{
x1=px[a];
y1=py[a];
}
}
f=y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1-x0);
cout<<"用分段线性插值计算的结果是:f("<<x<<")="<<f<<endl;
delete pa;
}


void squared(float *px,float *py,int number)
{
float x,x0,x1,x2,y0,y1,y2,f;
int a;
cout<<"请输入您要计算的x的值:";
cin>>x;
float *pa=new float[number];
for(a=0;a<number;a++)
{
pa[a]=px[a]-x;
if(pa[a]<0)
pa[a]=-pa[a];
}
float *p=new float[number];
for(a=0;a<number;a++)
p[a]=pa[a];
float temp;
for(int pass=1;pass<number;pass++)
{
for(int i=0;i<number-pass;i++)
{
temp=p[i];
p[i]=p[i+1];
p[i+1]=temp;
}
}
for(a=0;a<number;a++)
{
if(p[0]=pa[a])
{
x0=px[a];
y0=py[a];
}
if(p[1]=pa[a])
{
x1=px[a];
y1=py[a];
}
if(p[2]=pa[a])
{
x2=px[a];
y2=py[a];
}
}
f=y0*(x-x1)*(x-x2)/(x0-x1)*(x0-x2)+y1*(x-x0)*(x-x2)/(x1-x0)*(x1-x2)+y2*(x-x0)*(x-x1)/(x2-x0)*(x2-x1);
cout<<"用分段二次插值计算的结果是:f("<<x<<")="<<f<<endl;
delete pa;
}

void lagrange(float *px,float *py,int number)
{
float f=0,sumUp=1,sumDown=1,x,mulUp=1,mulDown=1;
cout<<"请输入您要计算的x的值:";
cin>>x;
for(int a=0;a<number;a++)
{
for(int b=0;b<number;b++)
{
if(b=a)
{
mulUp*=1;
mulDown*=1;
}
else
{
mulUp*=x-px[b];
mulDown*=px[a]-px[b];
}
}
sumUp=py[a]*mulUp;
sumDown=mulDown;
f+=sumUp/sumDown;
}
cout<<"用全区间上的拉格朗日插值法计算的结果是:f("<<x<<")="<<f<<endl;
}
YaDa 2005-04-06
  • 打赏
  • 举报
回复
我没有代码,我做插值运算的当时(80年代初)没有计算机。
我想我已经把原理说清楚了,如果要代码,以后给楼主编一个吧,现在我没空也没心情。
cctv512 2005-04-06
  • 打赏
  • 举报
回复
YaDa直接把插值代码贴上来,楼主不就知道如何做了!
tudou614 2005-03-25
  • 打赏
  • 举报
回复
MARK....
YaDa 2005-03-23
  • 打赏
  • 举报
回复
当然是离散的,否则插什么值。
你在图纸上把点画好了,最简单的,把各点用直线连起来,就实现插值了。然后,你在连线上去取点就行了。无非是转换到计算机上来嘛。应该说更简单了。两点知道了,直线方程也知道了,然后根据你的要求(如水平距离均匀的),代入一个数据得到一个点。
gxqcdit 2005-03-23
  • 打赏
  • 举报
回复
你们说的道理我理解.但是具体该怎么做啊!

比如:
1. mathe兄的线性插值该如何插呢? 查找资料中...
2. YaDa兄说的"如果是一条直线上的,就把水平距离设为X轴,高程设为Y轴,然后插值",这个道理我懂,但n个点是离散的,不是连续的,怎么插成m个值? 是不是要先把n个原始值整成一条连续曲线?

摸索中...
zengwujun 2005-03-23
  • 打赏
  • 举报
回复
mark
YaDa 2005-03-22
  • 打赏
  • 举报
回复
你的例题,看不到“原则”,你插值后是为了达到什么目的?是“将点连成光滑的曲线”?你是单个的数,不是点。
YaDa 2005-03-22
  • 打赏
  • 举报
回复
抱着抛砖引玉的心情,顺便帮顶。
插值,要根据某种原则进行,一般是“取平均”。我们在曲线插值上是这样处理的:
1、简单方法:将平面上的两个点用直线连起来,这直线上的点就是插值的点。
2、稍微复杂点的方法:将平面上的三个点用抛物线连起来,抛物线上的点就是插值的点。好处是,曲线比较光滑。
3、我们没做过:用贝塞耳函数连接各个点,就象是用一根有弹性的钢丝弯曲成通过各个给定的点。这“钢丝”上的点(除了给定的点)就是插值的点。
图像的插值,是根据周围的点来计算,是二维的,所以比较复杂:
1、本质上还是“取平均”:先计算水平方向的平均值,根据这些平均值再计算垂直方向的平均值。图像很平滑但也比较“柔”,不够硬朗。
2、采用卷积的方法,图像可以比较硬朗。具体的可以看看图像处理高手的做法,我也是似懂非懂。
YaDa 2005-03-22
  • 打赏
  • 举报
回复
对楼主:“平面上测量得到的一系列高度值”,这个我搞过。你不是还有一个(或一对)位置的数据码?就按照我说的去做就是了。我一维二维都讲到了,就这么办。
如果是一条直线上的,就把水平距离设为X轴,高程设为Y轴,然后插值。
mathe 2005-03-22
  • 打赏
  • 举报
回复
最简单的线性插值就可以了,复杂一点可以使用三次样条曲线
gxqcdit 2005-03-22
  • 打赏
  • 举报
回复
OK, 先说明一下背景:这n个浮点数是一个平面上测量得到的一系列高度值。为了计算方便,需要插值为m个值。
conquer2004 2005-03-22
  • 打赏
  • 举报
回复
插值也要看你想怎么插,就像一楼说的,选用的模型不一样,插出来的值就不一样。
在图形学上看过,不过没研究过。
楼下继续。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧