Может кто-нибудь объяснить поведение функций mkpp и ppval? - PullRequest
2 голосов
/ 16 ноября 2010

Если я сделаю следующее в MATLAB:

ppval(mkpp(1:2, [1 0 0 0]),1.5)
ans =  0.12500

Это должно создать многочлен f(x) = x^3 и оценить его как x = 1.5.Так почему же он дает мне результат 1.5^3 = .125?Теперь, если я изменяю домен, определенный в первом аргументе, на mkpp, я получаю это:

> ppval(mkpp([1 1.5 2], [[1 0 0 0]; [1 0 0 0]]), 1.5)
ans = 0

Поэтому, не меняя функцию, я меняю ответ.Круто.

Кто-нибудь может объяснить, что здесь происходит?Как изменение первого аргумента на mkpp меняет полученный результат?

1 Ответ

2 голосов
/ 16 ноября 2010

Функция MKPP будет сдвигать полином, так что x = 0 начнется в начале соответствующего диапазона, который вы ему дадите.В первом примере полином x^3 смещен в диапазон [1 2], поэтому, если вы хотите вычислить полином в диапазоне без сдвига , равном [0 1], вам необходимо выполнить следующее:

>> pp = mkpp(1:2,[1 0 0 0]);   %# Your polynomial
>> ppval(pp,1.5+pp.breaks(1))  %# Shift evaluation point by the range start

ans =

    3.3750                     %# The answer you expect

Во втором примере у вас один полином x^3 смещен в диапазон [1 1.5], а другой полином x^3 смещен в диапазон [1.5 2].Оценка кусочного полинома в x = 1.5 дает вам значение ноль, встречающееся в начале второго полинома.

Это может помочь визуализировать полиномы, которые вы делаете, следующим образом:

x = linspace(0,3,100);                     %# A vector of x values
pp1 = mkpp([1 2],[1 0 0 0]);               %# Your first piecewise polynomial
pp2 = mkpp([1 1.5 2],[1 0 0 0; 1 0 0 0]);  %# Your second piecewise polynomial
subplot(1,2,1);                            %# Make a subplot
plot(x,ppval(pp1,x));                      %# Evaluate and plot pp1 at all x
title('First Example');                    %# Add a title
subplot(1,2,2);                            %# Make another subplot
plot(x,ppval(pp2,x));                      %# Evaluate and plot pp2 at all x
axis([0 3 -1 8])                           %# Adjust the axes ranges
title('Second Example');                   %# Add a title

alt text

...