views:

123

answers:

1

I am trying to generate a piecewise symbolic function in Matlab. The reason it has to be symbolic is I want to be able to integrate/differentiate the function afterwards and/or insert actual values. I have the following function:

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

For example, I want to put this function in a variable (let's say f) and then call

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

and get the (scalar) result 2/3.

I tried various things, involving the piecewise() function and symbolic comparisions, but nothing worked... can you help? :-)

+2  A: 

One option you can try is to use the HEAVISIDE function to make each equation equal zero outside of its given range, then add them all together into one equation:

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'];

Another alternative you can try is to perform your integration for each function over each subrange then add the results:

eq1 = 'x^3/6';                         %# 0 <= x <= 1
eq2 = '(1/6)*(-3*x^3+12*x^2-12*x+4)';  %# 1 <= x <= 2
eq3 = '(1/6)*(3*x^3-24*x^2+60*x-44)';  %# 2 <= x <= 3
eq4 = '(1/6)*(4-x)^3';                 %# 3 <= x <= 4

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);
gnovice
It should be 60*x.
Jonas
@Jonas: Thanks. The `12x` needed to be fixed too.
gnovice
Thank you very much, that is exactly what I needed!
Maximilian Csuk

related questions