在MATLAB中添加分段多项式

在MATLAB中添加分段多项式,matlab,spline,piecewise,cubic-spline,Matlab,Spline,Piecewise,Cubic Spline,我需要添加来自多个数据集的分段多项式。有没有一种简单的方法可以将分段多项式相加而无需插值?换句话说,给定PP1和PP2,有没有办法生成PP3(其中PP3保持分段多项式形式)?e、 g 但是,我不想显式地指定tnew,而是想要一个新的分段多项式pp3,它实际上是pp1+pp2 这可能是获得pp1+pp2添加到问题代码的最简单方法: pp12 = @(x) ppval(pp1,x)+ppval(pp2,x); breaks = unique([pp1.breaks,pp2.brea

我需要添加来自多个数据集的分段多项式。有没有一种简单的方法可以将分段多项式相加而无需插值?换句话说,给定PP1和PP2,有没有办法生成PP3(其中PP3保持分段多项式形式)?e、 g

但是,我不想显式地指定
tnew
,而是想要一个新的分段多项式
pp3
,它实际上是
pp1
+
pp2


这可能是获得
pp1
+
pp2
添加到问题代码的最简单方法:

    pp12 = @(x) ppval(pp1,x)+ppval(pp2,x);

    breaks = unique([pp1.breaks,pp2.breaks]);
    pp3 = spline(breaks,pp12(breaks));

    plot(tnew,ppval(pp3,tnew),'k:');
给出了黑色虚线:

pp3
为分段多项式形式,段仅由pp1和pp2的断点定义。运行
max(abs(ppval(pp3,tnew)-pp12(tnew))
产生
2.7756e-16
,其顺序为
eps

感谢@LuisMendo和@TroyHaskin的建议

x1  = pp1.breaks;
x2  = pp2.breaks;
x   = unique([x1,x2]);

idx1 = lookup(x1,x(1:end-1));
idx2 = lookup(x2,x(1:end-1));

coefs = pp1.coefs(idx1,:) + pp2.coefs(idx2,:);

pp3 = mkpp(x,coefs);
y   = ppval(pp3,x);
h(:,4)  = plot(tnew,ppval(pp3,tnew));
legend(h,{'spline of sin(\pi t)','spline of t^2','sin(\pi t)+t^2','pp3'},'location','northwest')
xlabel('t')

我认为这个代码应该可以工作,但不是真的。我认为,由于mkpp生成的分段多项式系数是局部的,所以在相同的区间内添加它们并不能解决问题。但这可能是解决方案的起点

从mkpp的Matlab帮助中: 由于coefs中的多项式系数是每个区间的局部系数,因此必须减去相应节点区间的下端,才能使用常规多项式方程中的系数。换句话说,对于区间[x1,x2]上的系数[a,b,c,d],相应的多项式为

f(x)=a(x−x1)3+b(x−x1)2+c(x−x1)+d ."

pp1
pp1
是包含定义多项式片段的字段
breaks
系数的结构。因此,您可以使用
mkpp
来构建一个新的分段多项式,将
pp1
pp2
中的片段组合起来。您只需要传递排序好的breaks和系数to
mkpp
。唯一麻烦的部分是构建复合系数矩阵,其顺序等于
pp1
pp2
的最大顺序,对中断进行排序(删除重复项),并对复合系数矩阵的行应用相同的排序。@LuisMendo,正如你所说,排序和构建新的分段多项式很麻烦。这就是为什么我想知道是否有一种简单的方法可以做到这一点,例如,使用内置函数或一些小的函数组合。我明白了。这是一个有趣的问题!@LuisMendo(除非我遗漏了什么)如果
pp1
pp2
使用相同数量的控制点,无论是5个还是7个,都可以大大减少工作量。那么正确的合成系数矩阵不就是将另外2个加上
断点=唯一([pp1.断点,pp2.断点])
?@TroyHaskin是的,如果在
pp1
pp2
之间使用相同的控制点,那么问题几乎是微不足道的。但是,在我的例子中,我使用的任意控制点并不总是对齐,就像上面的例子。因此我想知道是否有一个简单的(ish)当
pp1
pp2
没有相同的控制点时,生成
pp3
的方法。这确实会给出精确的结果。问题不在于精确性,而在于类型:您得到一个匿名函数,它是一个不同于分段多项式(实际上是一个具有特定字段的结构)的“对象”@LuisMendo我不确定我是否同意。在这里的解决方案中,我得到了一个分段多项式(
pp3
,作为带字段的结构),它是从匿名函数(更准确地说,是从在断点处计算匿名函数
pp12
生成的向量)派生而来的当我说
pp3
并不完全是
pp1
+
pp2
时,我的意思是
pp3
中的系数不是如果你做了所有的代数来展开和收集
pp1
pp2
中的每一个片段中的项所能得到的。我的主张通过找到
max(abs(ppval(pp3,tnew)来验证-pp12(tnew))~=0
,不是吗?但这些只是数字错误,因为在这两种情况下计算的方式不同。请注意,差异的顺序是
eps
。例如,
sqrt(1e7)^2
1e7
相等,但请尝试
sqrt(1e7)^2-1e7
你不会得到零。@LuisMendo我明白了。你说服了我。我会修改答案的。
f(x)=a(x−x1)3+b(x−x1)2+c(x−x1)+d ."