La construction de la fonction symbolique dans Matlab par morceaux
-
02-10-2019 - |
Question
Je suis en train de générer une fonction symbolique dans Matlab par morceaux. La raison pour laquelle il doit être symbolique, je veux être en mesure d'intégrer / différencier la fonction après et / ou insérer des valeurs réelles. J'ai la fonction suivante:
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 appeler
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) et piecewise (comparisions symboliques, mais rien ne marchait ... peux vous aider? : -)
La solution
Une option consiste à utiliser la fonction heaviside
pour rendre 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 ajouter 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 travail, réponse de Karan suggère qu'il fait, au moins dans les versions plus récentes. La documentation de piecewise
dit actuellement, il a été introduit en R2016b, mais il était bien présent beaucoup plus tôt. Je l'ai trouvé dans la documentation Boîte à outils Symbolic Math aussi loin que R2012b , mais la syntaxe d'appel était différente de ce qu'elle est maintenant. Je ne pouvais pas trouver dans la documentation plus tôt pour la Soroban, mais il ne se présenter en fonction dans d'autres boîtes à outils (tels que les statistiques et Spline), boîtes à outils qui explique sa mention dans la question (et pourquoi il n'a pas travail pour les équations symboliques à l'époque).
Autres conseils
À partir R2016b, utilisez la fonction piecewise
syms x
y = piecewise(x<0, -1, x>0, 1)
y =
piecewise(x < 0, -1, 0 < x, 1)
Dans 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