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? : -)

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top