1

大家好

我正在尝试对下面在 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)

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

谢谢

波米克·卢特拉

4

1 回答 1

2

正如 Schorsch 在评论中所暗示的那样,您可能应该使用该函数ppval而不是polyval. 确实,这两个功能即使是相关的,也有不同的目标:

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

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

  1. 在你的命令中使用ppval而不是polyval(我会推荐该解决方案):

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

    xs = linspace(6.5137, 7.1828, 200);
    y = polyval(pp.coefs(2,:),xs-6.5137);
    plot(xs,y)
    

希望这可以帮助!

于 2013-06-17T11:52:12.603 回答