离散点(非均匀)插值C程序

背景原理

离散点插值最简单的就是IDW。我要求解PDE遇到的离散点插值问题:需要知道格点上空间偏导数用相邻点的函数值表示,因此Hermite插值更适合我,但是目前没时间弄,先用最简单的IDW吧。(后期补充)

  • 反距离加权法(Inverse Distance Weighted)

反距离加权法(Inverse Distance Weighted)插值是近期做大数据显示时使用的插值方法,很好用的插值方法。反距离权重法主要依赖于反距离的幂值,幂参数可基于距输出点的距离来控制已知点对内插值的影响。幂参数是一个正实数,默认值为2。(一般0.5到3的值可获得最合理的结果)。通过定义更高的幂值,可进一步强调最近点。因此,邻近数据将受到更大影响,表面会变得更加详细(更不平滑)。随着幂数的增大,内插值将逐渐接近最近采样点的值。指定较小的幂值将对距离较远的周围点产生更大的影响,从而导致平面更加平滑。
Kriging 插值公式

  • 三角内插值法和Hermite插值
    wiki词条:插值

算法优化

在IDW插值之前,我们可以事先获取一个离散点子集,用于计算插值的权重:
a:离散点距离插值点越远,对插值点的影响力越低
b:离散点越少可以加快运算速度

C++程序实现

#include <iostream>
#include <cmath>
using namespace std;
struct POINT{ double x,y,z,weight,distance;};
double idw(POINT q,POINT *p,int num){
//point p 存放离散点
//point q 存放插值点
   int i;double result;double f;const double r= 1;//反距离的幂值(0.5-3)
   for( i = 0; i < num; i++) {p[i].distance = sqrt((q.x-p[i].x)*(q.x-p[i].x) + (q.y-p[i].y) *(q.y-p[i].y));}
   for( i = 0; i < num; i++) {f += pow(1.0 / p[i].distance, r);}
   for( i = 0; i < num; i++) {p[i].weight = pow(1.0 / p[i].distance, r)/f;}
   for( i = 0; i < num; i++) {q.z += p[i].weight*p[i].z;}
   return q.z;
}
int main(){
int n = 0; //点的个数
POINT p[50]; //存放离散点
POINT q; //插值点
cout << "请输入已知点的个数" << endl;
cin >> n;
cout << "请输入已知点的坐标" << endl;
for(int i = 0; i < n; ++i)
cin >> p[i].x >> p[i].y >> p[i].z;
cout << "输入目标点的坐标" << endl;
cin >> q.x >> q.y;
q.z = idw(q, p, n);
cout << q.z << endl;
return 0;
}


遇到的错误

非法复制代码
在这里插入图片描述
参考:error: stray ‘\302’ in program 处理 or error: stray ‘\302’ in program/error: stray ‘\240’ in program解决方法。这个错误一般是源代码中含有一些隐藏的非ascii字符。你把东西copy到文本编辑器中,再copy回来试试。或者使用“ od -c *.c ”查看源码中的猫腻,再到对应位置删除(我的做法:将出错的行重新以英文模式输入一般,就OK了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值