2010-09-10 25 views
11

Estoy tratando de generar una función simbólica por partes en Matlab. La razón por la cual tiene que ser simbólico es que quiero poder integrar/diferenciar la función posteriormente y/o insertar valores reales. Tengo la siguiente función:Construyendo la función simbólica por partes en 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 

Por ejemplo, quiero poner esta función en una variable (digamos f) y luego llamar

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

y obtener el (escalar) como resultado 2/3 .

Intenté varias cosas, involucrando la función por partes() y las comparaciones simbólicas, pero nada funcionó ... ¿me pueden ayudar? :-)

Respuesta

9

Una opción es utilizar la función heaviside para que cada ecuación igual a cero fuera de su rango dado, a continuación, añadir a todos juntos en una sola ecuación:

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 

Otra alternativa es llevar a cabo su integración para cada función sobre cada subintervalo a continuación, añadir los resultados:

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 

ACTUALIZACIÓN:

Aunque se menciona en la pregunta que la función piecewise no funcionó, Karan's answer sugiere que sí, al menos en las versiones más recientes. La documentación para piecewise actualmente dice que fue introducida en R2016b, pero estaba claramente presente mucho antes. Lo encontré en la documentación del Symbolic Math Toolbox ya en R2012b, pero la sintaxis de las llamadas era diferente de lo que es ahora. No pude encontrarlo en la documentación anterior para Symbolic Math Toolbox, pero apareció como una función en otras cajas de herramientas (como Statistics y Spline Toolboxes), lo que explica su mención en la pregunta (y por qué no lo hizo). trabajar para ecuaciones simbólicas en el momento).

+0

sea de 60 * x. – Jonas

+0

@Jonas: Gracias. El '12x' necesitaba ser reparado también. – gnovice

+0

En cuanto a R2012b_, es posible que te estés refiriendo a la función MuPAD por partes, que es una interfaz diferente de Symbolic Math Toolbox. Para SMT, se introdujo en R2016b. Perdón por la confusión con las cajas de herramientas. Avíseme si puedo responder cualquier otra pregunta. –

3

partir R2016b, utilice la función

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

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

piecewise Para este caso:

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

Explicaciones para los downvotes serían útiles, ya que este es el método recomendado para crear funciones por partes en Symbolic Math Toolbox. –

+0

Supongo que los votos a favor se debieron a que su ejemplo anterior no coincidía con la pregunta en absoluto; tu nuevo ejemplo debería remediar eso. Además, la actualización en mi respuesta puede ser de interés. Es posible que las personas hayan votado negativamente porque la pregunta menciona específicamente que "por partes" no funciona, lo que en realidad no ocurrió en el momento en que se solicitó, pero ahora lo hace a medida que se muestra. – gnovice

+0

Bastante justo. Espero que mi respuesta editada sea útil. Feliz de responder cualquier otra pregunta. –

Cuestiones relacionadas