2010-11-16 46 views
2

Si je fais ce qui suit dans Matlab:Quelqu'un peut-il expliquer le comportement des fonctions mkpp et ppval?

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

Cela devrait construire un f(x) = x^3 polynôme et l'évaluer à x = 1.5. Alors pourquoi me donne-t-il le résultat 1.5^3 = .125? Maintenant, si je change le domaine défini dans le premier argument de mkpp, je reçois ceci:

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

donc sans changer la fonction, je change la réponse. Impressionnant.

Quelqu'un peut-il expliquer ce qui se passe ici? Comment changer le premier argument en mkpp change le résultat obtenu?

Répondre

2

La fonction MKPP va changement polynôme de sorte que x = 0 commencera au début de la plage correspondante que vous lui donnez. Dans votre premier exemple, le x^3 polynôme est déplacé vers la plage [1 2], donc si vous voulez évaluer le polynôme à un non décalé gamme de [0 1], vous devez faire ce qui suit:

>> 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 

Dans votre deuxième Par exemple, vous avez un polynôme x^3 décalé à la plage [1 1.5] et un autre polynomial x^3 décalé à la plage de [1.5 2]. L'évaluation du polynôme par morceaux à x = 1.5 vous donne une valeur de zéro, apparaissant au début du deuxième polynôme.

Il peut aider à visualiser les polynômes que vous faites comme suit:

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

+0

J'ai regardais ça depuis si longtemps ... Merci! Si je veux l'évaluer à un vecteur de points, comment le ferais-je? Y at-il une meilleure fonction à utiliser que ppval? – Xodarap

+0

@Xodarap: Vous pouvez passer un vecteur de points à [PPVAL] (http://www.mathworks.com/help/techdoc/ref/ppval.html) comme illustré dans mon exemple de code de traçage ci-dessus. – gnovice