CubicSpline三次样条插值,与python结果一致

最近研究一个项目遇到需要使用插值,插值方法当然首选三次样条插值。此项目涉及到的插值包括内插值和外插值,所以对于插值的要求还是挺高的,需要尽可能的平滑。

        首先我在github上面找到一段源代码GitHub - glentner/CubicSplineLib: C++ facility for natural cubic spline interpolation in 1D, 2D, and 3D.,基本能符合插值要求,但是外插值的时候跟Python结果差异较大,经过改进之后,完全与python的CubicSpline方法的

bc_type="natural"

保持一致。

部分代码展示如下:python代码

freq = np.array([250, 500, 1000, 2000, 4000])
gain = np.array([30, 30, 30, 30, 45])
gain_x = np.array([125, 250, 500, 1000, 2000, 4000, 8000])
full_freq = CubicSpline(freq, gain, bc_type="natural")
gain_y = full_freq(gain_x)

C++代码:


vector<double>	 AdjustCubicSpline(vector<double>& vecSrcX, vector<double>& vecConstX, vector<double>& vecConstY)
{
	assert(!vecSrcX.empty());
	assert(!vecConstX.empty());
	assert(!vecConstY.empty());
	assert(vecConstX.size() == vecConstY.size());

	std::vector<double> create_temp_y;

	try {

		CubicSpline<double> my_data(vecConstX, vecConstY, 2); // the 2 says omp_set_num_threads(2)
		create_temp_y = my_data.interpolate(vecSrcX);
	}
	catch (std::exception& error) {

		std::cerr << error.what() << std::endl;
		create_temp_y.resize(0);
		vecSrcX.resize(0);
		return create_temp_y;
	}
	return create_temp_y;
}

int main() {
 vector<double> _X = { 250, 500, 1000, 2000, 4000};//must be strictly increasing sequence  必须严格增长
 vector<double> _Y = { 30, 30, 30, 30, 45 };

 vector<double> _X2 = { 125, 250, 500, 1000, 2000, 4000, 8000 };//must be strictly increasing sequence  必须严格增长


 vector<double>	vecAdd = AdjustCubicSpline(_X2, _X, _Y);//根据提供的x轴插值,灵活性较大
 //vecAdd 就是最后得到的插值结果
}

有需求请联系qq:295282563

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值