Sei sulla pagina 1di 20

CALCOLO SIMBOLICO IN MATLAB Il toolbox di Matlab di nome Symbolic permette di fare in ambiente Matlab del calcolo simbolico.

Elenchiamo brevemente le principali funzioni di questo tool.

sym, syms
x=sym(stringa) Esempi x=sym(x) x= x a=sym(alpha) a= alpha rho=sym('(1+sqrt(5))/2') rho = (1+sqrt(5))/2 f=rho^2-rho-1 f= (1/2+1/2*5^(1/2))^2-3/2-1/2*5^(1/2) simplify(f) ans = 0 f=sym(a*x^2+b*x+c) f= a*x^2+b*x+c Attenzione: non vengono create le variabili a,x,b,c esplicitamente, ma solo f A=hilb(3); A=sym(A) A= [ 1, 1/2, 1/3] [ 1/2, 1/3, 1/4] [ 1/3, 1/4, 1/5] sym converte a simbolici anche dati definiti numericamente costruisce un oggetto simbolico il cui valore fornito dalla stringa specificata

Queste variabili si possono combinare con tutte le operazioni aritmetiche e le funzioni predefinite di Matlab.

Per fare operazioni matematiche (integrazione, differenziazione, sostituzione, passaggio al limite), occorre creare variabili indipendenti esplicitamente. Invece di fare a=sym(a); b=sym(b);c=sym(c);x=sym(x); si pu usare labbreviazione syms a b c x possibile specificare le propriet matematiche di un simbolo usando real in sym o real in syms: x=sym(x,real); oppure syms x real Esempi syms x y real z=x+ i*y z una variabile complessa z= x+i*y f=x^2+y^2 f non pu essere negativa f= x^2+y^2 conj(x) ans = x conj(z) ans = x-i*y z*conj(z) ans = (x+i*y)*(x-i*y) expand(z*conj(z)) distribuisce prodotti tra le somme ans = x^2+y^2 Per eliminare tale propriet, usare unreal al posto di real. syms x unreal; Esempi >>syms x y t >>r = x^2 + y^2 r= x^2+y^2 >>theta = atan(y/x) theta = atan(y/x) >>e = exp(i*pi*t) e = exp(i*pi*t)

Nel seguente esempio si genera una matrice simbolica: syms a b c A=[a b c; b c a; c a b] A= [ a, b, c] [ b, c, a] [ c, a, b] sum(A(1,:)) operazione ans= a+b+c sum(A(:,1)==sum(A(:,2) test logico ans= 1

subs
y=subs(f,x,valore) y=subs(f) permette di sostituire in f ad ogni occorrenza del simbolo x (o della stringa specificata come x) il valore dato, oppure ad ogni occorrenza di una variabile definita nell'ambiente di lavoro il suo valore. Esempi syms x f=2*x^2; y=subs(f,x,2) y= 8 y=subs(f,x,1:1:4) y= [2 8 18 32 ] g=sym('exp(-a*t)*C1'); a=980;C1=3; subs(g) ans= 3*exp(-980*t)

findsym
findsym(f,n) determina le n variabili simboliche pi prossime a x in ordine alfabetico; findsym(f,1) ritorna la variabile simbolica pi vicina a x; a parit di distanza si prende lultima in ordine alfabetico. Esempi >>syms v x y >>findsym(v+y,1) ans= y

diff
df=diff(funzione,variabile,n) permette di derivare una funzione rispetto a una variabile n volte; se variabile omessa si prende la variabile simbolica findsym(funzione,1); se n omesso, si calcola la derivata prima. Esempi syms x a n; f=sin(a*x); df=diff(f) df= cos(a*x)*a dfa=diff(f,a) dfa = cos(a*x)*x df2=diff(f,2) df2 = -sin(a*x)*a^2 dfa2=diff(f,a,2) dfa2 = -sin(a*x)*x^2 f=x^2/100*sin(x/10) f= 1/100*x^2*sin(1/10*x) df=diff(f) df = 1/50*x*sin(1/10*x)+1/1000*x^2*cos(1/10*x) df2=diff(f,2) df2 = 1/50*sin(1/10*x)+1/250*x*cos(1/10*x)-1/10000*x^2*sin(1/10*x) f=x^n f= x^n df=diff(f,x) % uguale a diff(f) df = x^n*n/x dfn=diff(f,n) dfn = x^n*log(x)

syms a x A=[cos(a*x) sin(a*x);-sin(a*x) cos(a*x)] A= [ cos(a*x), sin(a*x)] [ -sin(a*x), cos(a*x)]

dA=diff(A) dA = [ -sin(a*x)*a, cos(a*x)*a] [ -cos(a*x)*a, -sin(a*x)*a] Calcolo dello jacobiano di una funzione da R3 pR3

x=x(r,t,f); y=y(r,t,f); z=z(r,t,f);


syms r t f x=r*cos(t)*cos(f); y=r*cos(t)*sin(f); z=r*sin(t); J=jacobian([x;y;z],[r,t,f]) J= [ [ [ cos(t)*cos(f), -r*sin(t)*cos(f), -r*cos(t)*sin(f)] cos(t)*sin(f), -r*sin(t)*sin(f), r*cos(t)*cos(f)] sin(t), r*cos(t), 0]

si noti che le funzioni formano un vettore colonna e le variabili un vettore riga.

detJ=det(J) detJ = -cos(t)^3*cos(f)^2*r^2-cos(t)^3*sin(f)^2*r^2-r^2*sin(t)^2*cos(f)^2*cos(t)r^2*cos(t)*sin(f)^2*sin(t)^2 detJ=simplify(det(J)) detJ = -cos(t)*r^2 syms x y z w=[x*y*z;y;x+z]; v=[x y z]; R=jacobian(w,v) R= [ y*z, x*z, x*y] [ 0, 1, 0] [ 1, 0, 1] b=jacobian(x+z,v) b= [ 1, 0, 1]

syms x y f=2*x^2+3*y^2; grad=[diff(f,x);diff(f,y)] grad = [ 4*x] [ 6*y] S=solve(grad(1),grad(2)) S= x: [1x1 sym] y: [1x1 sym] S.x ans = 0 S.y ans = 0 H=jacobian(grad,[x,y]) H= [ 4, 0] [ 0, 6] eig(H) ans = [ 4] [ 6]

f=log(1+x^2+x*y+2*y^2); grad=[diff(f,x);diff(f,y)] grad = [ (2*x+y)/(1+x^2+x*y+2*y^2)] [ (x+4*y)/(1+x^2+x*y+2*y^2)] [a,b]=solve(grad(1),grad(2)) a= 0 b= 0 H=jacobian(grad,[x,y]) H= [ 2/(1+x^2+x*y+2*y^2)-(2*x+y)^2/(1+x^2+x*y+2*y^2)^2, 1/(1+x^2+x*y+2*y^2)(2*x+y)/(1+x^2+x*y+2*y^2)^2*(x+4*y)] [ 1/(1+x^2+x*y+2*y^2)-(2*x+y)/(1+x^2+x*y+2*y^2)^2*(x+4*y), 4/(1+x^2+x*y+2*y^2)(x+4*y)^2/(1+x^2+x*y+2*y^2)^2] x=a;y=b; H1=subs(H) H1= 21 14 eig(H1) ans = 1.5858 4.4142

limit
lim=limit(funzione, x, val); permette di trovare il limite di una funzione per x tendente a val; se x omessa si usa la variabile indipendente data da findsym(funzione,1); se val omesso, assunto uguale a 0. Aggiungendo left o right come quarto parametro, si trova il limite sinistro o destro. Esempi syms h n x dc=limit((cos(x+h)-cos(x))/h, h, 0) dc= -sin(x) dc=limit((1+x/n)^n, n,inf) dc= exp(x) limit(1/x) il limite calcolato per x tendente a 0 ans= NaN limit(1/x,x,0,left) ans= -inf limit(1/x,x,0,right) ans= inf syms x f=sin(x)/x; limit(f) ans = 1

int
pr=int(funzione,variabile) permette di trovare la primitiva di funzione rispetto alla variabile specificata; se variabile omessa, assunta come variabile dintegrazione findsym(funzione,1). pr=int(funzione,variabile,a,b) permette di calcolare lintegrale di funzione sull intervallo [a,b], ove a e b possono essere variabili simboliche o stringhe. Esempi i=int(x^n) i= x^(n+1)/(n+1) i=int(sin(2*x),0,pi/2) i= 1 pr=int(sin(2*x)) pr = -1/2*cos(2*x) subs(pr,x,pi/2)-subs(pr,x,0) ans= 1 f=exp(-x^2/2); a=int(f,-inf,inf) a= 2^(1/2)*pi^(1/2) double(a) ans = 2.5066

converte una stringa numerica a numero reale

symsum
pr=symsum(funzione) pr=symsum(funzione,variabile) permette di trovare la somma dell'espressione simbolica funzione rispetto alla variabile k come specificata da findsym(funzione,1), da 0 a k-1, oppure rispetto alla variabile specificata da 0 a variabile-1. pr=int(funzione,variabile,a,b) permette di trovare la somma dell'espressione simbolica funzione rispetto alla variabile specificata dal valore di a a quello di b, ove a e b possono essere variabili simboliche o stringhe. Esempi syms x k s1=symsum(1/k^2,1,inf) s1 = 1/6*pi^2 s2=symsum(x^k,k,1,inf) s2 = -x/(x-1)

ezplot
ezplot (funzione,a,b); ezplot(funzione,[a,b],fig) esegue il grafico di funzione (variabile simbolica o stringa) nellintervallo [a,b]; se a e b non sono specificati, il grafico fatto nellintervallo [-2*pi,2*pi]; fig indica il numero della finestra grafica in cui appare il grafico; se omesso, si usa la finestra grafica corrente. >> f=1/(5+4*cos(x)); >>ezplot(f) >>df=diff(f); >>hold on; ezplot(df);

taylor
taylor(funzione,n.termini,punto_iniziale) calcolo il polinomio di Taylor della funzione specificata fino al grado n.termini-1 (con un errore dellordine di xn.termini a partire dal punto_iniziale specificato; se non si specifica punto_iniziale, esso assunto uguale a 0 (polinomio di MacLaurin). >> syms x >>f=1/(5+4*cos(x)) f= 1/(5+4*cos(x)) >>T=taylor(f,8) T= 1/9+2/81*x^2+5/1458*x^4+49/131220*x^6 >>g=exp(x) g= exp(x) >> G=taylor(g,5) G= 1+x+1/2*x^2+1/6*x^3+1/24*x^4 Per vedere ladeguamento del polinomio di MacLaurin alla funzion exp(x) nellintervallo [-1,1], si provi questo codice: syms x; g=exp(x); for n=1:6 close; G=taylor(g,n); ezplot(g,[-1,1]); hold on; ezplot(G,[-1,1]); pause end;

pretty
pretty(funzione) permette di visualizzare in forma migliore una espressione

>> G G= 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5 >>pretty(G) 2 3 4 5 1 + x + 1/2 x + 1/6 x + 1/24 x + 1/120 x

Le seguenti funzioni permettono di semplificare espressioni simboliche, applicando identit algebriche e trigonomeriche; in tal modo si trasforma una rappresentazione di una funzione in un'altra.

collect
collect(f) esprime f, se possibile, in forma polinomiale standard come somma di termini, ciascuno relativo a una diversa potenza di x; in generale, somma termini simili. syms x f=(x-1)*(x-2)*(x-3) f= (x-1)*(x-2)*(x-3) collect(f) ans = x^3-6*x^2+11*x-6 syms t f=(1+x)*t+x*t f= (1+x)*t+x*t collect(f) ans = 2*x*t+t

expand
expand(f) Distribuisce prodotti rispetto a somme e applica identit che coinvolgono funzioni di somma. syms x y a b expand(a*(x+y)) ans = a*x+a*y expand((x-1)*(x-2)*(x-3)) ans = x^3-6*x^2+11*x-6 expand(exp(a+b)) ans = exp(a)*exp(b) expand(cos(3*cos(x))) ans = 4*cos(cos(x))^3-3*cos(cos(x))

factor
factor(f)

Fattorizza, se possibile, un polinomio usando coefficienti razionali; nel caso non sia possibile, si riottiene il polinomio stesso. syms x f=x^3-6*x^2+11*x-6; factor(f) ans = (x-1)*(x-2)*(x-3) f=x^6+1; factor(f) ans = (x^2+1)*(x^4-x^2+1)

simplify
simplify(f) Tenta di semplificare una funzione. f=(1-x^2)/(1-x); simplify(f) ans = x+1 f=exp(x)*exp(y); simplify(f) ans = exp(x+y) f=cos(x)^2+sin(x)^2; simplify(f) ans = 1

horner
horner(f) Trasforma un polinomio f nella sua rappresentazione di Horner. In tale rappresentazione la valutazione numerica di un polinomio coinvolge il minimo numero di operazioni e il minimo errore se si usa l'aritmetica finita del calcolatore. f=x^3-6*x^2+11*x-6; horner(f) ans = -6+(11+(-6+x)*x)*x

simple
simple(f)

Ha lo scopo di trovare una semplificazione della funzione che usa il minor numero di caratteri. Tenta di raggiungere lo scopo, applicando simplify(f), factor(f), expand(f), collect(f) e altre funzioni di semplificazione. In genera migliora il risultato di una simplify(f). In alcuni casi vantaggioso applicare due volte simple(f) per ottenere differenti semplificazioni. f=(1/x^3+6/x^2+12/x+8)^(1/3); simple(f) simplify: ((2*x+1)^3/x^3)^(1/3) radsimp: (2*x+1)/x combine(trig): ((1+6*x+12*x^2+8*x^3)/x^3)^(1/3) factor: ((2*x+1)^3/x^3)^(1/3) expand: (1/x^3+6/x^2+12/x+8)^(1/3) convert(exp): (1/x^3+6/x^2+12/x+8)^(1/3) convert(sincos): (1/x^3+6/x^2+12/x+8)^(1/3) convert(tan): (1/x^3+6/x^2+12/x+8)^(1/3) collect(x): (1/x^3+6/x^2+12/x+8)^(1/3) ans = (2*x+1)/x

solve
g=solve(eq); g=solve(eq, var); g=solve(eq1,eq2,,eqn); g=solve(eq1,eq2,,eqn,var1,var2,,varn); esegue la risoluzione di una equazione o di un sistema di equazioni, rispetto alla/alle variabili di default, determinate con findsym, oppure rispetto a quella/quelle specificate. L'equazione o le equazioni possono essere espressioni simboliche o stringhe. Se l'equazione o le equazioni non contengono =, viene risolto eq=0 (oppure eq1=0, eq2=0,,eqn=0). Esempi s=solve('a*x^2+b*x+c') s= [ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))] s=solve('a*x^2+b*x+c','b') s= -(a*x^2+c)/x s=solve('x^3-2*x^2=x-1') s= [ 1/6*(28+84*i*3^(1/2))^(1/3)+14/3/(28+84*i*3^(1/2))^(1/3)+2/3] [ -1/12*(28+84*i*3^(1/2))^(1/3)7/3/(28+84*i*3^(1/2))^(1/3)+2/3+1/2*i*3^(1/2)*(1/6*(28+84*i*3^(1/2))^(1/3)14/3/(28+84*i*3^(1/2))^(1/3))] [ -1/12*(28+84*i*3^(1/2))^(1/3)-7/3/(28+84*i*3^(1/2))^(1/3)+2/31/2*i*3^(1/2)*(1/6*(28+84*i*3^(1/2))^(1/3)-14/3/(28+84*i*3^(1/2))^(1/3))] double(s) ans = 2.2470e+000 +1.0000e-032i -8.0194e-001 +2.0000e-032i 5.5496e-001 -4.0000e-032i

s=solve('x+y=1','x-11*y=5') s= x: [1x1 sym] y: [1x1 sym] s.x ans = 4/3 s.y ans = -1/3 [x,y]=solve('x+y=1','x-11*y=5') x = 4/3 y =-1/3

double([x,y]) ans = 1.3333 -0.3333 syms a u v f1=a*u^2+v^2;f2=u-v-1;f3=a^2-5*a+6; A=solve(f1,f2,f3) A= a: [4x1 sym] u: [4x1 sym] v: [4x1 sym] A.a ans = [ 2] [ 2] [ 3] [ 3] A.u ans = [ 1/3+1/3*i*2^(1/2)] [ 1/3-1/3*i*2^(1/2)] [ 1/4+1/4*i*3^(1/2)] [ 1/4-1/4*i*3^(1/2)] A.v ans = [ -2/3+1/3*i*2^(1/2)] [ -2/3-1/3*i*2^(1/2)] [ -3/4+1/4*i*3^(1/2)] [ -3/4-1/4*i*3^(1/2)] double([A.a(1),A.u(1),A.v(1)]) ans = 2.0000 0.3333 + 0.4714i -0.6667 + 0.4714i Nel caso di funzioni periodiche, vengono determinate spesso solo alcune soluzioni: syms x s=solve(tan(x)+sin(x)-2); x=double(s) x= 0.8863 -1.8979 2.0766 - 1.5151i 2.0766 + 1.5151i ezplot('tan(x)+sin(x)-2');hold on;w=-2*pi:pi/2:2*pi;plot(w,0*w,'r-.') rx=[x(1),x(2)];plot(rx,0*rx,'bo'); mostra le soluzioni trovate px=[x(1)-2*pi,x(2)+2*pi];plot(px,0*px,'r*') mostra le altre soluzioni

dsolve
r=dsolve('equazione1','equazione2',..'equazionen','cond1',,'condn','v'); risolve una o pi equazioni differenziali; il differenziale indicato con D seguito dalla cifra che denota l'ordine (se 1, la cifra pu essere omessa), seguita dalla variabile dipendente; se non specificata in 'v', la variabile indipendente t. Se le condizioni iniziali sono omesse, compaiono costanti arbitrarie nelle soluzioni. Esempi y=dsolve('Dy=y0*y') y= exp(y0*t)*C1 y=dsolve('Dy=y0*y','y(0)=1') y= exp(y0*t) [u,v]=dsolve('Du=v','Dv=u','u(0)=1','v(0)=1') u= exp(t) v= exp(t) [u,v]=dsolve('Du=v','Dv=-u') u= sin(t)*C1+cos(t)*C2 v= cos(t)*C1-sin(t)*C2 y=dsolve('(Dy)^2+y^2=1','s') y= [ sin(s-C1)] [ -sin(s-C1)]