Snažím sa generovať symbolický kusv Matlab. Dôvod, prečo musí byť symbolický, je, že chcem byť schopný integrovať / rozlíšiť funkciu neskôr a / alebo vložiť aktuálne hodnoty. Mám nasledujúcu funkciu:
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
Napríklad chcem uviesť túto funkciu do premennej (povedzme f) a potom zavolať
int(diff(f, 1)^2, x, 0, 4) % numbers could be different
a získať (skalárny) výsledok 2/3.
Skúšal som rôzne veci, zahŕňajúce funkciu piecewise () a symbolické porovnanie, ale nič nefungovalo ... môžete pomôcť? :-)
odpovede:
9 pre odpoveď č. 1Jednou z možností je použiť heaviside
funkciu, aby každá rovnica bola rovná nule mimo jej daného rozsahu, potom ich všetky pridajte do jednej rovnice:
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
Ďalšou alternatívou je vykonať svoju integráciu pre každú funkciu nad každým podzákladom a potom pridať výsledky:
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
UPDATE:
Aj keď sa v otázke spomína, že piecewise
funkcia nefungovala, Karanova odpoveď navrhuje to, aspoň v novších verziách. Dokumentácia pre piecewise
v súčasnosti hovorí, že bol zavedený v R2016b, ale bol jasne prítomný oveľa skôr. Zistil som to v dokumentácii pre Symbolic Math Toolbox hneď ako R2012b, ale volajúca syntax bolainak ako je teraz. Nemohol som to nájsť v predchádzajúcej dokumentácii pre Symbolic Math Toolbox, ale ukázal sa ako funkcia v iných nástrojoch (napríklad v štatistikách a nástrojoch Spline Toolboxes), čo vysvetľuje jeho zmierenie v otázke (a prečo to neurobil práca pre symbolické rovnice v tej dobe).
3 pre odpoveď č. 2
Spustite R2016b, použite po častiach funkcie
syms x
y = piecewise(x<0, -1, x>0, 1)
y =
piecewise(x < 0, -1, 0 < x, 1)
V tomto prípade:
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