我正在使用其中一种提议的算法,但结果非常糟糕.

在Java中(代码如下). x(0)是points.get(0),y(0)是值[points.get(0)],α是alfa,μ是mi.其余部分与wiki伪代码相同.

public void createSpline(double[] values, ArrayList points){

a = new double[points.size()+1];

for (int i=0; i

{

a[i] = values[points.get(i)];

}

b = new double[points.size()];

d = new double[points.size()];

h = new double[points.size()];

for (int i=0; i

h[i] = points.get(i+1) - points.get(i);

}

alfa = new double[points.size()];

for (int i=1; i

alfa[i] = (double)3 / h[i] * (a[i+1] - a[i]) - (double)3 / h[i-1] *(a[i+1] - a[i]);

}

c = new double[points.size()+1];

l = new double[points.size()+1];

mi = new double[points.size()+1];

z = new double[points.size()+1];

l[0] = 1; mi[0] = z[0] = 0;

for (int i =1; i

l[i] = 2 * (points.get(i+1) - points.get(i-1)) - h[i-1]*mi[i-1];

mi[i] = h[i]/l[i];

z[i] = (alfa[i] - h[i-1]*z[i-1])/l[i];

}

l[points.size()] = 1;

z[points.size()] = c[points.size()] = 0;

for (int j=points.size()-1; j >0; j--)

{

c[j] = z[j] - mi[j]*c[j-1];

b[j] = (a[j+1]-a[j]) - (h[j] * (c[j+1] + 2*c[j])/(double)3) ;

d[j] = (c[j+1]-c[j])/((double)3*h[j]);

}

for (int i=0; i

for (int j = points.get(i); j

// fk[j] = values[points.get(i)];

functionResult[j] = a[i] + b[i] * (j - points.get(i))

+ c[i] * Math.pow((j - points.get(i)),2)

+ d[i] * Math.pow((j - points.get(i)),3);

}

}

}

我得到的结果如下:

但它应该类似于:

首先,他们展示了如何做线性样条,这很容易.我创建了计算A和B系数的函数.然后,他们通过添加二阶导数来扩展线性样条. C和D系数也很容易计算.

但是当我试图计算二阶导数时,问题就出现了.我不明白他们是如何计算的.

所以我只实现了线性插值.结果是:

有谁知道如何修复第一个算法或解释我如何计算第二个算法中的二阶导数?

解决方法:

最近,Unser,Thévenaz等人在一系列论文中描述了立方b样条,其中包括

M. Unser, A. Aldroubi, M. Eden, “Fast B-Spline Transforms for Continuous Image Representation and Interpolation”, IEEE Trans. Pattern Anal. Machine Intell., vol. 13, n. 3, pp. 277-285, Mar. 1991.

M. Unser, “Splines, a Perfect Fit for Signal and Image Processing”, IEEE Signal Proc. Mag., pp. 22- 38, Nov. 1999.

P. Thévenaz, T. Blu, M. Unser, “Interpolation Revisited,” IEEE Trans. on Medical Imaging, vol. 19, no. 7, pp. 739-758, July 2000.

以下是一些指导原则.

什么是样条线?

样条曲线是平滑连接在一起的分段多项式.对于度数n的样条,每个段是n次多项式.连接这些部件使得样条连续到其在结的n-1度的导数,即多项式部件的连接点.

如何构造样条线?

零阶样条曲线如下

所有其他样条曲线都可以构造为

卷积采取n-1次.

立方样条

最流行的样条是三次样条,其表达式为

样条插值问题

给定在离散整数点k处采样的函数f(x),样条插值问题是确定以下列方式表示的近似值s(x)到f(x)

其中ck是插值系数,s(k)= f(k).

样条预过滤

不幸的是,从n = 3开始,

这样ck不是插值系数.它们可以通过求解通过强制s(k)= f(k)得到的线性方程组来确定,即

这样的方程可以以卷积形式重铸并且在变换的z空间中求解为

哪里

因此,

以这种方式进行总是优于通过例如LU分解提供线性方程组的解.

可以通过注意到来确定上述等式的解

哪里

第一部分代表因果过滤器,而第二部分代表反义过滤器.它们都在下图中说明.

因果过滤器

Anticausal过滤器

在上图中,

滤波器的输出可以用以下递归方程表示

可以通过首先确定c-和c的“初始条件”来解决上述等式.在假定周期性镜像输入序列fk时

那么可以证明c的初始条件可以表示为

而c的初始条件可表示为

标签:java,c-2,interpolation,spline,cubic

来源: https://codeday.me/bug/20190714/1459994.html

java 三次样条插值_java – 三次样条插值的正确实现相关推荐

  1. java输出日志_java代码中如何正确使用loggger日志输出

    java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...

  2. java jcombobox用法_java – 填充JComboBox的正确方法?

    我认为最干净的方法是定义自定义 ComboBoxModel. 这样,您可以为组合框定义数据模型,将创建组合框的部分与数据管理本身分开. 可能使用文本文件是一件好事,因为在插入新条目时您不必修改代码.您 ...

  3. 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值

    插值算法   数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求 ...

  4. 【matlab】三次埃尔米特插值与三次样条插值的实际应用代码

    要求:完成下列这些数据的插值,并将结果保存到一个EXCEL表格中.要求至少选取两种插值方法,并对1号池中的这些指标做出插值后图像(显示在同一个图像中) Z.mat load Z.mat x=Z(1,: ...

  5. 【插值】牛顿插值、拉格朗日插值、三次样条插值的Python代码实现

    插值简介 插值即根据有限的离散点绘制出穿过所有样本点的曲线,从直观上想象似乎画一条穿过n个特定点的曲线有无数种画法,但从数学意义上来说我们希望画出的曲线能够尽量平滑,震荡幅度尽量小能够在非样本点上符合 ...

  6. 数学建模十大算法02—插值与拟合(拉格朗日插值、三次样条插值、线性最小二乘法……)

    文章目录 引入 一.插值 1.1 分段线性插值 1.2 牛顿插值法 1.3 拉格朗日插值多项式 1.4 样条插值 1.4.1 三次样条插值 1.5 二维插值 1.5.1 插值节点为网格节点 1.5.2 ...

  7. java this()函数_Java经典面试题之(如何正确的使用this?)

    大家好,又到了我们的知识点分享时刻,书读百遍,其义自现,Java的学习是循序渐进的过程,知识点的理解随着过目的次数逐渐会有不同的境界,每天十分钟小编帮您理解的更深入.今天要和大家分享的是Java的经典 ...

  8. 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值

    插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...

  9. matlab chebyshev插值,Matlab之插值

    转自:http://blog..net/htttw/article/details/7251459 Matlab之插值 Matlab中有5种基本的插值方法: nearest:最近邻插值法(平面立体均适 ...

  10. 线性插值插值_揭秘插值搜索

    线性插值插值 搜索算法指南 (Searching Algorithm Guide) Prior to this article, I have written about Binary Search. ...

最新文章

  1. Science | COVID-19大流行期间,研究重点应放在高质量研究
  2. 营销系统--手动补偿
  3. 无软件linux,无需安装即可运行或演示Linux的方法 (1)
  4. inotify 机制
  5. java random.nextbytes_Java Random类
  6. 创世纪游戏、黄金分割比
  7. AE插件自动创建图层工具LayerGenerators使用教程
  8. pytorch的dataset用法详解
  9. SSH、SSL、TSL
  10. android sd卡数据恢复软件下载,内存卡数据恢复
  11. 云原生安全攻防|使用eBPF逃逸容器技术分析与实践
  12. Redis 线程模型
  13. C++ 学习(基础语法篇)
  14. 一年月份大小月口诀_大月小月口诀 什么意思 有多少天
  15. Human Pose Estimation with Spatial Contextual Information(CVPR2019)
  16. android自定义壁纸制作,Android 自定义View实现画背景和前景(ViewGroup篇)
  17. 【华人学者风采】麦立强 武汉理工大学
  18. 查看ubuntu系统的版本详细信息
  19. 学 Rust 要几天?「GitHub 热点速览 v.22.51」
  20. L2-1 盲盒包装流水线 (25 分)

热门文章

  1. dsp 28377 +RX-8025T 实现RTC功能
  2. Android MessageQueue与Message详解
  3. 矩阵求导和矩阵迹求导
  4. JavaScript --------WebS APIs学习之网页特效(动画函数封装)
  5. 你知道现在有多少AI开放平台吗?
  6. 最新中国数据中心排行榜
  7. 数学笔记30——无穷级数和收敛判定
  8. Windwos tar 命令详解
  9. ArcMap进行地图标注与注记
  10. malloc函数的使用