Tema 16: Cálculo simbólico usando MATLAB. Declaración y conversión a objeto simbólico (syms, sym), expansión de expresiones algebraicas (expand), resolución de expresiones algebraicas (solve), simplificación de expresiones algebraicas (simplify), factorización de expresiones algebraicas (collect), escritura en forma matemática de una expresión simbólica (pretty), determinante de una matriz simbólica (det), factorización de expresión algebraica (factor), conversión de polinomios simbólicos a vector de coeficientes y viceversa (poly2sym, sym2poly). Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB MATLAB tiene un conjunto de funciones para cálculo simbólico. Lo primero que hay que hacer es declarar las variables que van a intervenir como objetos simbólicos. Para esto se cuenta con la funciones “syms” y “sym”. syms a b c: declara a, b y c como variables simbólicas. La variable “a” puede ser una constante, una variable o una expresión en la que intervengan constantes, variables, operadores aritméticos y funciones predefinidas. M=sym(m): convierte un objeto numérico “m” en un objeto simbólico “M”. Ejemplos: >> syms x (declaración de x como variable simbólica) >> expand((x+1)^3) (desarrolla la expresión en suma de monomios) ans = x^3+3*x^2+3*x+1 >> pretty(expand((x+1)^3)) (expresa el resultado con la notación habitual) x 3 + 3x 2 + 3x + 1 >> solve(‘-x^2-2*x+3=0’, ’x’) (resuelve la ecuación en la variable “x”) ans = [ -3] [ 1] Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “expand” expand(s): escribe cada elemento de la expresión simbólica s como producto de sus factores. Normalmente se usa para funciones polinómicas, trigonométricas, exponenciales y logarítmicas. Ejemplos: >> syms x y v >> v = [exp(x + y), log(x^2/y)] >> expand((x+1)^3) retorna x^3+3*x^2+3*x+1 >> expand(sin(x+y)) retorna sin(x)*cos(y)+cos(x)*sin(y) >> expand(v) retorna [exp(x)*exp(y), 2*log(x)-log(y)] Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “simplify” simplify(s): simplifica cada elemento de la expresión simbólica s. Ejemplos: sin 2 (x) + cos 2 (x) = 1 >> syms x >> simplify(sin(x)^2 + cos(x)^2) e c log α + β → retorna 1 (α + β ) 1 c 2 >> syms c alpha beta >> simplify(exp(c*log(sqrt(alpha+beta)))) retorna (alpha+beta)^(1/2*c) x 2 + 5x + 6 → x+2 x +3 >> syms x >> simplify((x ˆ 2+5*x+6)/(x+3)) retorna x+2 Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “collect” collect(s,v): reagrupa cada uno de los elementos en s como un polinomio en v y reescribe s en términos de potencias de v. Ejemplos: x 2y + yx − x 2 − 2x → (y − 1)x 2 + (y − 2)x >> syms x y >> collect(x^2*y + y*x - x^2 - 2*x) − 1 −2 x 3 −2 x xe e + 16 4 retorna (y-1)*x^2+(y-2)*x 3 −2 x 1 → − x + e 16 4 >> syms x f >> f = -1/4*x*exp(-2*x)+3/16*exp(-2*x) >> collect(f,exp(-2*x)) retorna (-1/4*x+3/16)*exp(-2*x) Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “solve” Solución simbólica de expresiones algebraicas. Ejemplos: >> solve('p*sin(x) = r') escoge 'x' como incógnita y retorna ans = asin(r/p) >> [x,y] = solve('x^2 + x*y + y = 3', 'x^2 - 4*x + 3 = 0') resuelve el sistema y retorna x = [ 1] [ 3] y= [ 1] [ -3/2] >> [u,v] = solve('a*u^2 + v^2 = 0', 'u - v = 1') escoge 'a’ como parámetro y resuelve las 2 ecuaciones usando como incógnitas u y v. u= v= [ 1/2/(a+1)*(-2*a+2*(-a)^(1/2))+1] [ 1/2/(a+1)*(-2*a+2*(-a)^(1/2))] [ 1/2/(a+1)*(-2*a-2*(-a)^(1/2))+1] [ 1/2/(a+1)*(-2*a-2*(-a)^(1/2))] Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “solve” >> [a,u,v] = solve('a*u^2 + v^2 = 0', 'u - v = 1', 'a^2 - 5*a + 6 = 0') resuelve las 3 ecuaciones usando como incógnitas a, u y v. a= u= v= [ 2] [ 1/3+1/3*i*2^(1/2)] [ -2/3+1/3*i*2^(1/2)] [ 2] [ 1/3-1/3*i*2^(1/2)] [ -2/3-1/3*i*2^(1/2)] [ 3] [ 1/4+1/4*i*3^(1/2)] [ -3/4+1/4*i*3^(1/2)] [ 3] [ 1/4-1/4*i*3^(1/2)] [ -3/4-1/4*i*3^(1/2)] >> aa = eval(a); uu = eval(u); vv = eval(v); aa = uu = vv = 2 0.3333 + 0.4714i -0.6667 + 0.4714i 2 0.3333 - 0.4714i -0.6667 - 0.4714i 3 0.2500 + 0.4330i -0.7500 + 0.4330i 3 0.2500 - 0.4330i -0.7500 - 0.4330i Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “solve” >> [x, y] = solve('x^2*y^2 - 2*x - 1 = 0', 'x^2 - y^2 - 1 = 0') x= y= [ -1/2+1/2*i*3^(1/2)] [ 1/2*(-6-2*i*3^(1/2))^(1/2)] [ -1/2+1/2*i*3^(1/2)] [ -1/2*(-6-2*i*3^(1/2))^(1/2)] [ -1/2-1/2*i*3^(1/2)] [ 1/2*(-6+2*i*3^(1/2))^(1/2)] [ -1/2-1/2*i*3^(1/2)] [ -1/2*(-6+2*i*3^(1/2))^(1/2)] [ 1/2*5^(1/2)+1/2] [ 1/2*(2+2*5^(1/2))^(1/2)] [ 1/2*5^(1/2)+1/2] [ -1/2*(2+2*5^(1/2))^(1/2)] [ 1/2-1/2*5^(1/2)] [ 1/2*(2-2*5^(1/2))^(1/2)] [ 1/2-1/2*5^(1/2)] [ -1/2*(2-2*5^(1/2))^(1/2)] x= y= -0.5000 + 0.8660i 0.3406 - 1.2712i -0.5000 + 0.8660i -0.3406 + 1.2712i -0.5000 - 0.8660i 0.3406 + 1.2712i -0.5000 - 0.8660i -0.3406 - 1.2712i 1.6180 1.2720 1.6180 -1.2720 -0.6180 0.0000 + 0.7862i -0.6180 -0.0000 - 0.7862i Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “dsolve” Solución simbólica de ecuaciones diferenciales ordinarias. La variable independiente es “t”. La letra “D” denota diferenciación respecto a la variable independiente (D es d/dt, D2 es d2/dt2). Las condiciones iniciales se especifican como “y(a)=b” o “Dy(a)=b”. Ejemplos: >> dsolve('Dx = -a*x') retorna ans = C1 * exp(-a*t) >> x = dsolve('Dx = -a*x', 'x(0) = 1‘, ‘s’) retorna >> y = dsolve('(Dy)^2 + y^2 = 1','y(0) = 0') >> aa = dsolve('Dy = y^2*(1-y)') x = exp(-a*s) retorna y = [ sin(t)] [ -sin(t)] retorna Warning: Explicit solution could not be found; implicit solution returned. aa = t+1/y-log(y)+log(-1+y)+C1=0 >> [x, y] = dsolve('Dx = y', 'Dy = -x', 'x(0) = 0', 'y(0) = 1') retorna x = sin(t) y = cos(t) Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “subs” subs(s, antiguo, nuevo): sustituye “antiguo” con “nuevo” en la expresión simbólica s. Ejemplos: >> a = 980; C1 = 3; >> y = dsolve('Dy = -a*y') produce y = C1 * exp(-a*t) >> subs(y) produce ans = 3 * exp(-980*t) >> syms a b alpha >> subs(cos(a)+sin(b), {a, b}, {alpha, 2}) retorna cos(alpha)+sin(2) Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “findsym” findssym(expr): determina cuales son las variables simbólicas en la expresión simbólica “expr”. Las variables se escriben en orden alfabético y separadas por coma. Si no encuentra variables simbólicas, findsym retorna una cadena vacía. Ejemplo: >> t = 4; syms x y; findsym(x^3+t*x+y) retorna ans = x ,y >> b = 1; syms x1 y alpha >> findsym(cos(alpha)*b*x1 + 14*y) retorna ans = alpha, x1, y >> syms y i j; findsym(y*(4+3*i) + 6*j) retorna ans = y Función “pretty” pretty(expr): devuelve la expresión simbólica escrita en notación matemática. Esta expresión no sirve para ser utilizada en cálculos posteriores con MATLAB, sólo es una presentación “más bonita” de los resultados. >> b = 1; x1 = 1; syms aplha y; >> pretty(cos(alpha)*b*x1 + 14*y) retorna Prof. Saúl. Buitrago y Oswaldo Jiménez cos(alpha) + 14 y 16. Cálculo simbólico usando MATLAB Función “det” y “poly” También es posible definir matrices simbólicas del siguiente modo: >> M=sym(’[a b; c d]’) retorna M= [ a, b] [ c, d] y ahora calcular, por ejemplo su determinante: >> det(M) retorna ans = a*d-b*c y su polinomio característico: x − a det (Ix − M ) = det c >> poly(M) retorna b = (x − a )(x − d ) − bc x −d ans = x^2-x*d-a*x+a*d-b*c Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “factor” factor(expr): factoriza la expresión (ya sea numérica o simbólica) >> factor(x^2+2*x+1) retorna ans = (x+1)^2 Función “poly2sym” Define un polinomio simbólico a partir de sus coeficientes >> poly2sym([1 2 3 -2 10]) >> poly2sym([1 0 -2 -5],'t') retorna ans = x^4+2*x^3+3*x^2-2*x+10 retorna ans = t^3-2*t-5 Función “sym2poly” Transforma un polinomio simbólico en un vector con sus coeficientes >> sym2poly(x^3 - 2*x - 5) retorna Prof. Saúl. Buitrago y Oswaldo Jiménez [1 0 -2 -5] 16. Cálculo simbólico usando MATLAB Función “limit” Calcula el limite hacia un determinado valor de una expresión simbólica. Ejemplos: sin(x ) x →0 x lim >> syms x >> limit(sin(x)/x,0) retorna ans = 1 n lim n →∞ n + 1 >> syms n >> limit(n/(n+1), n, inf) retorna ans = 1 n 3 + 3n 2 − 2n lim n →∞ 3n 3 − 1 >> limit((n^3+3*n^2-2*n)/(3*n^3-1),inf) retorna ans = 1/3 Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “diff” diff(f, ‘x’, n): calcula la n-esima derivada respecto a x de una expresión simbólica f. f = log(x ) − 1 x2 >> diff(‘log(x)’, ‘x’, 2) retorna ans = -1/x^2 f = exp( z 3 ) + sin2 (z ) 3z 2 exp( z 3 ) + 2 sin(z ) cos(z ) >> f = ’exp(z^3)+sin(z)^2’; >> diff(f) retorna ans = 3*z^2*exp(z^3)+2*sin(z)*cos(z) exp(a + x ) f =a sin(ax ) exp(a + x ) a exp(a + x ) a exp(a + x ) cos(ax )x + − sin(ax ) sin(ax ) sin2 (ax ) >> f = ’a*exp(a+x)/sin(a*x)’; >> diff(f, ’a’) retorna ans = exp(a+x)/sin(a*x)+a*exp(a+x)/sin(a*x)-a*exp(a+x)/sin(a*x)^2*cos(a*x)*x Prof. Saúl. Buitrago y Oswaldo Jiménez 16. Cálculo simbólico usando MATLAB Función “int” La integración se lleva a cabo con el comando int. Es posible hacer integrales definidas o indefinidas: >> int(x^2,’x’) retorna ans = 1/3 * x^3 >> f = ’a*exp(a*x)’; >> int(f, ’x’) retorna ans = exp(a*x) >> int(f,’x’, 0, 1) retorna ans = exp(a)-1 >> int('2*x^2*(19+12*x^2)/(7*(x^2+1))','x',0,1) retorna ans = 22/7-1/2*pi Es importante observar que el cálculo de una integral definida mediante la última sentencia es un cálculo simbólico, de manera que integrales como la siguiente >> int(’exp(x^2)’, ’x’, 0, 1) retorna ans = -1/2*i*erf(i)*pi^(1/2) no tienen mucho sentido, pues el resultado viene expresado mediante 2 x una función extraña, ya que no se conoce una primitiva de la función e función error erf (x ) = 2 π x ∫e 0 −t 2 Prof. Saúl. Buitrago y Oswaldo Jiménez dt 16. Cálculo simbólico usando MATLAB Función “taylor” Calcula el desarrollo en serie de Taylor alrededor de un punto dado, para una función simbólica dada. Por defecto el polinomio es de grado 5 y alrededor del cero. >> taylor(exp(-x)) retorna ans = 1-x+1/2*x^2-1/6*x^3+1/24*x^4-1/120*x^5 >> taylor(log(x), 6, 1) retorna (grado 5 y alrededor del 1) ans = x-1-1/2*(x-1)^2+1/3*(x-1)^3-1/4*(x-1)^4+1/5*(x-1)^5 >> taylor(sin(x), pi/2, 8) retorna (grado 7 y alrededor de pi/2) ans = 1-1/2*(x-1/2*pi)^2+1/24*(x-1/2*pi)^4-1/720*(x-1/2*pi)^6 >> syms t >> taylor(x^t, 3, t) retorna (grado 2, respecto a la variable t y alrededor de 0) ans = 1+log(x)*t+1/2*log(x)^2*t^2 Prof. Saúl. Buitrago y Oswaldo Jiménez