2010-09-10 19 views
11

J'essaie de générer une fonction symbolique par morceaux dans Matlab. La raison pour laquelle cela doit être symbolique est que je veux pouvoir intégrer/différencier la fonction après et/ou insérer des valeurs réelles. J'ai la fonction suivante:Création d'une fonction symbolique par morceaux dans Matlab

x^3/6 -> 0 < x <= 1 
(1/6)*(-3*x^3+12*x^2-12x+4) -> 1 < x <= 2 
(1/6)*(3*x^3-24*x^2+60x-44) -> 2 < x <= 3 
(1/6)*(4-x)^3 -> 3 < x <= 4 
0 -> otherwise 

Par exemple, je veux mettre cette fonction dans une variable (disons f) puis appelez

int(diff(f, 1)^2, x, 0, 4) % numbers could be different 

et obtenir le (scalaire) 2/3 résultat .

J'ai essayé différentes choses, impliquant la fonction piecewise() et les comparaisons symboliques, mais rien n'a fonctionné ... pouvez-vous m'aider? :-)

Répondre

9

Une option consiste à utiliser la fonction heaviside pour que chaque équation égale à zéro en dehors de sa plage donnée, puis les ajouter en une seule équation:

syms x; 
f = (heaviside(x)-heaviside(x-1))*x^3/6 + ... 
    (heaviside(x-1)-heaviside(x-2))*(1/6)*(-3*x^3+12*x^2-12*x+4) + ... 
    (heaviside(x-2)-heaviside(x-3))*(1/6)*(3*x^3-24*x^2+60*x-44) + ... 
    (heaviside(x-3)-heaviside(x-4))*(1/6)*(4-x)^3; 
double(int(diff(f, 1)^2, x, 0, 4)) 

ans = 

    0.6667 

Une autre alternative consiste à effectuer votre intégration pour chaque fonction sur chaque sous-plage puis ajoutez les résultats:

syms x; 
eq1 = x^3/6; 
eq2 = (1/6)*(-3*x^3+12*x^2-12*x+4); 
eq3 = (1/6)*(3*x^3-24*x^2+60*x-44); 
eq4 = (1/6)*(4-x)^3; 
total = int(diff(eq1, 1)^2, x, 0, 1) + ... 
     int(diff(eq2, 1)^2, x, 1, 2) + ... 
     int(diff(eq3, 1)^2, x, 2, 3) + ... 
     int(diff(eq4, 1)^2, x, 3, 4) 

total = 

2/3 

MISE à JOUR:

Bien qu'il soit mentionné dans la question que la fonction piecewise n'a pas fonctionné, Karan's answer le suggère, au moins dans les versions plus récentes. La documentation pour piecewise dit actuellement qu'il a été introduit dans R2016b, mais il était clairement présent beaucoup plus tôt. Je l'ai trouvé dans la documentation pour le Symbolic Math Toolbox aussi loin que R2012b, mais la syntaxe d'appel était différente de ce qu'elle est maintenant. Je ne l'ai pas trouvé dans la documentation antérieure pour Symbolic Math Toolbox, mais il est apparu en tant que fonction dans d'autres boîtes à outils (telles que Statistics et Spline Toolboxes), ce qui explique sa mention dans la question (et pourquoi pas travailler pour des équations symboliques à l'époque).

+0

Il devrait être de 60 * x. – Jonas

+0

@Jonas: Merci. Le '12x' devait être réparé aussi. – gnovice

+0

Pour ce qui est de R2012b_, vous pouvez faire référence à la fonction MuPAD par morceaux, qui est une interface différente de la Symbolic Math Toolbox. Pour le SMT, il a été introduit dans R2016b. Désolé pour la confusion avec les boîtes à outils. Faites-moi savoir si je peux répondre à d'autres questions. –

3

À partir R2016b, utilisez la fonction piecewise

syms x 
y = piecewise(x<0, -1, x>0, 1) 

y = 
piecewise(x < 0, -1, 0 < x, 1) 

Pour ce cas:

syms x 
f = piecewise(... 
0< x <=1, x^3/6, ... 
1 < x <= 2, (1/6)*(-3*x^3+12*x^2-12*x+4), ... 
2 < x <= 3, (1/6)*(3*x^3-24*x^2+60*x-44), ... 
3 < x <= 4, (1/6)*(4-x)^3, ... 
0) 

f = 
piecewise(x in Dom::Interval(0, [1]), x^3/6, x in Dom::Interval(1, [2]), - x^3/2 + 2*x^2 - 2*x + 2/3, x in Dom::Interval(2, [3]), x^3/2 - 4*x^2 + 10*x - 22/3, x in Dom::Interval(3, [4]), -(x - 4)^3/6, 0) 

int(diff(f, 1)^2, x, 0, 4) 
ans = 
2/3 
+0

Des explications pour les descriptions descendantes seraient utiles, car c'est la méthode recommandée pour créer des fonctions par morceaux dans Symbolic Math Toolbox. –

+0

Je suppose que les downvotes étaient parce que votre ancien exemple ne correspondait pas à la question du tout; votre nouvel exemple devrait y remédier. En outre, la mise à jour de ma réponse peut être intéressante. Les gens peuvent avoir downvoted parce que la question mentionne spécifiquement «par morceaux» ne fonctionne pas, ce qui n'était pas le cas au moment où il a été demandé, mais fait maintenant comme vous le montrez. – gnovice

+0

Assez juste. J'espère que ma réponse éditée est utile. Heureux de répondre à d'autres questions. –