2015-06-23 7 views
2

Мне нужно добавить кусочные полиномы, полученные из нескольких наборов данных. Есть ли простой способ добавить кусочные многочлены вместе без интерполяции? Другими словами, с учетом PP1 и PP2 существует ли способ генерации PP3 (где PP3 остается в кусочно-полиномиальной форме)? например ...Добавление кусочных полиномов в 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' и' factors', которые определяют части многочлена. Таким образом, вы можете использовать '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', как struct with fields), который получен из анонимной функции (точнее, из вектора, полученного при оценке анонимной функции' pp12' в точках останова). Когда я говорю 'pp3' не _exactly_' pp1' + 'pp2', я имею в виду, что коэффициенты в' pp3' - это не то, что вы получили бы, если бы вы сделали всю алгебру для расширения и сбора терминов в 'pp1' и 'pp2' в каждом сегменте. Мое утверждение подтверждается поиском 'max (abs (ppval (pp3, tnew) - pp12 (tnew))) ~ = 0', не так ли? – Delyle

+2

Но это просто _нумерные ошибки_, потому что в любом случае вычисление выполняется по-разному. Обратите внимание, что разница составляет порядка 'eps'. Например, 'sqrt (1e7)^2' и' 1e7'_are_ равны, но попробуйте 'sqrt (1e7)^2-1e7', и вы не получите ровно нуля. –