在MATLAB中给定数据的分段立方Hermite插值多项式(PCHIP),然后找到区域

时间:2013-06-17 04:57:31

标签: matlab interpolation area

朋友你好

我正在尝试对MATLAB中给出的数据进行分段立方Hermite插值,然后我想得到x轴多项式所覆盖的区域。我想,我误解了pchip命令返回的系数的含义,但不确定。难道不知道会出现什么问题吗?

x = [5.8808 6.5137 7.1828 7.8953];

y = [31.2472 33.9977 36.7661 39.3567];

pp = pchip(x,y)

如果我看到pp,它会给出pp作为

   form: 'pp'
    breaks: [5.8808 6.5137 7.1828 7.8953]
     coefs: [3x4 double]
    pieces: 3
     order: 4
       dim: 1

和pp.coefs

-0.0112 -0.1529 4.4472 31.2472

-0.3613 0.0884 4.2401 33.9977

-0.0422 -0.3028 3.8731 36.7661

我认为这些是代表三个区间的多项式

[5.8808:6.5137],

[6.5137:7.1828],

[7.1828:7.8953]

但是当我使用这些多项式找到对应于x值的y值时,它会给出错误的值。

它给出第二个多项式的负y值。甚至第三个多项式似乎也不满足这些要点。

我使用这些命令来获取值

例如: - (对于第二个多项式)

xs = linspace(6.5137, 7.1828, 200);

y = polyval(pp.coefs(2,:),xs);

plot(xs,y)

我想找到该图所覆盖的曲线下面积,这就是我试图找到多项式的原因。有没有其他方法可以做到这一点,或者如果有人能在我使用的命令中找到问题,请告诉我。

感谢

Bh​​omik Luthra

1 个答案:

答案 0 :(得分:2)

正如Schorsch的评论中暗示的那样,您应该使用函数ppval而不是polyval。实际上,即使它们是相关的,这两个函数也有不同的目标:

  • polyval可用于将向量解释为多项式,其中向量中的每个条目是多项式中的系数。使用此功能,无法分段定义多项式。
  • ppval可让您评估分段多项式。多项式的片段在中断之间定义(正如您猜测的那样)。然后,在两个中断之间,多项式的系数是针对(x-left)中的多项式给出的(左边是考虑区间的左侧),而不是x

为实现目标,您将拥有两个等效的解决方案:

  1. 在命令中使用ppval代替polyval(我建议使用该解决方案):

    xs = linspace(6.5137, 7.1828, 200);
    y = ppval(pp,xs);
    plot(xs,y)
    
  2. 正确使用多边形函数:

    xs = linspace(6.5137, 7.1828, 200);
    y = polyval(pp.coefs(2,:),xs-6.5137);
    plot(xs,y)
    
  3. 希望这有帮助!