2015-06-23 36 views
2

我需要添加從多個數據集派生的分段多項式。有沒有一種簡單的方法來將分段多項式添加到一起而不進行插值?換句話說,給定PP1和PP2,是否有辦法生成PP3(其中PP3保持分段多項式形式)? e.g ...在MATLAB中添加分段多項式

t1 = linspace(0,1,5); 
    t2 = linspace(0,1,7); 
    pp1 = spline(t1,sin(pi*t1)); 
    pp2 = spline(t2,t2.^2); 
    close all 
    hold on 
    tnew = linspace(0,1,50); 
    h(:,1) = plot(tnew,ppval(pp1,tnew)); 
    plot(t1,ppval(pp1,t1),'bs') 
    h(:,2) = plot(tnew,ppval(pp2,tnew)); 
    plot(t2,ppval(pp2,t2),'rs') 
    h(:,3) = plot(tnew,ppval(pp1,tnew)+ppval(pp2,tnew)); 
    legend(h,{'spline of sin(\pi t)','spline of t^2','sin(\pi t)+t^2'},... 
       'location','northwest') 
    xlabel('t') 

,而不是指定tnew明確不過,我想一個新的分段多項式pp3這實際上是pp1 + pp2

Output from example problem

+0

'pp1'和'pp1'是包含字段'breaks'和'coefficients'的結構,它們定義了多項式片段。因此,您可以使用'mkpp'來構建一個新的分段多項式,將來自'pp1'和'pp2'的片段組合在一起。你只需要將已排序的斷點和係數傳遞給'mkpp'。唯一麻煩的部分是用等於「pp1」和「pp2」的最大順序的排序構建合成係數矩陣,對中斷進行排序(去除重複項),並將相同的排序應用到合成係數矩陣的行。 –

+1

@LuisMendo正如你所說,排序和構建新的分段多項式很麻煩。這就是爲什麼我想知道是否有簡單的方法來做到這一點,例如具有內置功能或一些小功能組合。 – Delyle

+0

我明白了。這是一個有趣的問題! –

回答

3

這可能是讓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:'); 

給人的黑色虛線:

Piecewise polynomials

pp3是分段多項式形式僅由pp1和pp2的斷點定義。運行max(abs(ppval(pp3,tnew) - pp12(tnew)))產生2.7756e-16,其編號爲eps

感謝@LuisMendo和@TroyHaskin的建議。

+0

這確實給出了_exact_結果。問題不是正確的,而是_type_:你得到一個匿名函數,它是一個不同的「對象」而不是分段多項式(它實際上是一個具有特定字段的結構) –

+0

@LuisMendo我不確定我是否同意。在這裏的解決方案中,我得到了一個分段多項式('pp3',作爲一個帶有字段的結構體),它來自匿名函數(更確切地說,來自在斷點處評估匿名函數pp12所產生的向量)。當我說'pp3'不是_exactly_' pp1' +'pp2',我的意思是pp3中的係數不是你得到的,如果你用所有的代數來擴展和收集'pp1'中的項,和每個段內的「pp2」。我的說法是通過查找max(abs(ppval(pp3,tnew) - pp12(tnew)))〜= 0來驗證的,不是嗎? – Delyle

+2

但這些只是_numerical errors_,因爲這兩種情況下的計算都是不同的。請注意,區別在於「eps」的順序。例如,'sqrt(1e7)^ 2'和'1e7'相等,但是嘗試'sqrt(1e7)^ 2-1e7',你不會得到完全零。 –