Calcolo simbolico con Matlab

matlab_symbolic_calculation

Matlab è un’applicazione che tutti ben conosciamo, ma non sempre si ha consapevolezza di tutte le sue potenzialità. Infatti Matlab oltre che effettuare il calcolo numerico diretto a cui tutti siamo abituati, ci permette anche di valutare analiticamente (cioè mantenendo le espressioni parametriche) molti di questi calcoli. Infatti, grazie al Symbolic Math Toolbox, Matlab ci fornisce un set di istruzioni per il calcolo simbolico (o letterale).

Quindi, piuttosto che effettuare i calcoli utilizzando dei numeri noti, come siamo soliti fare con Matlab, si utilizzeranno dei caratteri (lettere alfabetiche o lettere greche) in modo da formare delle espressioni simboliche. Tutto ciò è molto utile quando non si vuole conoscere immediatamente il risultato di un calcolo, ma mantenere la formula matematica durante tutta una serie di calcoli. Solo al termine, assegneremo dei valori numerici a questi parametri per conoscere i nostri risultati. Lavorando in questo modo sarà possibile impostare diversi set di valori ai vari parametri, analizzarne il risultato, eventualmente modificarli, e tutto ciò senza dover più effettuare alcun calcolo.

Riassumendo, con Matlab è possibile gestire le operazioni matematiche analiticamente. Ecco un elenco delle possibili operazioni che Matlab ci mette a disposizione:

  • derivate e integrali
  • risoluzione delle equazioni
  • manipolazione e semplificazione delle formule matematiche
  • serie numeriche e sommatorie (Taylor,..)
  • limiti
  • transformate (Fourier, Laplace, ecc.)
  • analisi vettoriale (jacobiano, laplaciano,..)

Definizione delle espressioni simboliche: sym e syms

Il calcolo simbolico si basa sull’uso delle variabili della classe sym (definite attraverso il Symbolic Toolbox). Quindi se hai bisogno di definire un espressione simbolica con un determinato insieme di variabili, la prima cosa che dovrai fare sarà quella di dichiarare queste variabili come simboli. Per fare ciò si usano i comandi sym e syms.

Consideriamo il caso in cui vogliamo calcolarci il seno di un angolo θ, con θ = π/2.

>> theta = pi/2;
ans =
           1

Giustamente, otterrai un valore numerico. Ma qualche volta, avrai bisogno di mantenere l’espressione in forma simbolica (analitica). Quindi per prima cosa dovrai dichiarare l’angolo theta come simbolo utilizzando la funzione sym( ).

>> x = sym('theta')
x =
      theta
>> sin(x)
ans =
    sin(theta)

Questa volta l’espressione mantiene l’angolo theta come parametro durante il calcolo.
Generalmente, può essere necessario utilizzare più di una variabile in forma simbolica, per esempio, se vogliamo specificare la funzione seguente:

trigonometric_expression

dovrai utilizzare il comando syms seguito da tre parametri e poi (opzionalmente) specificare il tipo dei dati (per esempio di tipo real)

>> syms alpha beta gamma real
>> y = sin(alpha)^2 + cos(beta) + sin(gamma)
ans =
    y = sin(alpha)^2 + cos(beta) + sin(gamma)

Quando il comando syms viene usato senza alcun argomento, tutti i valori simbolici presenti nel workspace di Matlab verranno elencati. I comandi sym e syms sono parole riservate in Matlab . Personalmente, per semplicità e per chiarezza nella sintassi, preferisco usare sempre il comando syms anche nel caso di un singolo parametro.

 >> syms theta
>> sin(theta)
ans =
       sin(theta)

Rapprentare graficamente le funzioni simboliche

E’ possibile rappresentare graficamente l’andamento di una funzione simbolica rispetto ad una variabile utilizzando la funzione ezplot(). Ecco un esempio:

>> syms x real
>> y = sin(x);
>> ezplot(y);
symbolic_01

Se invece vuoi vedere qualcosa di più accattivante, prova la funzione ezsurf().

>> syms x y real
>> f = sin(x);
>> g = cos(y);
>> ezsurf(f+g);
symbolic_02

o ache questo…

>> ezsurf('real(atan(x+i*y))');
symbolic_03

Equation solving

Un altro caso utile è la possibilità di trovare le radici di un polinomio. Consideriamo la seguente equazione simbolica:

equation_solving

Si possono ricavare le radici, cioè i valori x che risolvono l’equazione, usando la funzione solve().

>> syms x a b x
>> y = a*x^2-2*b*x+c;
>> solve(y)
ans =
(b + (b^2 - a*c)^(1/2))/a
(b - (b^2 - a*c)^(1/2))/a

 Manipolazione e Semplificazione delle espressioni simboliche

Spesso, quando si lavora con le espressioni simboliche (analitiche), e particolarmente con i polinomi, si ha bisogno di espanderle o semplificarle. La funzione expand() espande una formula dove sia possibile. Per esempio si può riscrivere il prodotto di somme come somme di prodotti.

>> syms x a b;
>> f = (x+a)*(x+b)
>> expand(f)
ans =
a*b + a*x + b*x + x^2

L’operazione opposta all’espansione è la semplificazione e quest’ultima si effettua con al funzione simplify(). Per vedere come sia possibile manipolare le espressioni polinomiali, consideriamo come esempio il cubo di un binomio.

cubic_binomial

Per prima cosa, il binomio può essere espanso nel modo seguente:

cubic_binomial_02

e se poi si effettua una semplificazione sull’espansione precedente, si riotterrà nuovamente il cubo di un binomio.

cubic_binomial_03
>> syms x a;
>> f = (x+a)^3
>> g = expand(f)
g =
a^3 + 3*a^2*x + 3*a*x^2 + x^3
>> simplify(g)
(a + x)^3

Derivate e integrali

Matlab è in grado di calcolare anche molti integrali e derivate che si possono trovare in un corso di Calcolo numerico o in altri corsi avanzati di ingegneria. Le funzioni chiave sono int() per l’integrazione e diff() per le derivate.

Derivate

Consideriamo la funzione seguente:

partial_derivative_03

Supponiamo di essere interessati ad ottenere l’espressione analitica (simbolica) della sua derivata. Per prima cosa sarà necessario specificare la variabile x come simbolo e successivamente l’espressione della funzione che vogliamo derivare. Infine si dovrà passare la funzione appena definita come argomento di diff(). In questa maniera, Matlab restituisce come risultato l’espressione analitica a cui siamo interessati.

>> syms x
>> f = x^3 - cos(x);
>> g = diff(f)
     g = 3*x^2 + sin(x)

Se abbiamo invece bisogno di calcolare la derivata seconda (o maggiore) della funzione, sarà necessario specificare un secondo argomento nella funzione diff(): diff(x,n), dove n è l’ordine della derivata. Per esempio, se vogliamo conoscere la derivata seconda della funzione simbolica f definita in precedenza, dobbiamo immettere le seguenti righe:

>> g = diff(f,2)
     g = 6*x + cos(x)

Derivata parziale

Finora abbiamo usato il comando diff con una funzione ad sola una variabile indipendente x. Quindi il comando diff effettua la derivata rispetto alla variabile x. Se invece abbiamo a che fare con funzioni con più variabili indipendenti, sarà necessario specificare la variabile di derivazione come secondo parametro.

>> diff(f,y)

dove y è la variabile di derivazione. Notate che in questo caso il comando diff(f,y) è equivalente alla formula delle derivate parziali:

partial_derivative

Per esempio, se desideriamo ottenere la derivata parziale della funzione seguente calcolata rispetto alla variabile y:

partial_derivative_02
>> syms x y
>> f = 2*x^2 + (y+7)^3;
>> diff(f,y)
ans= 
    3*(y + 7)^2

Integrali

Allo stesso modo, se abbiamo bisogno di ottenere l’espressione analitica (simbolica) dell’integrale indefinito, utilizzeremo la funzione int() in un maniera simile a come abbiamo fatto con la funzione diff(). Consideriamo la stessa funzione che abbiamo utilizzato per il calcolo delle derivate.

>> syms x y
>> f = 2*x^2 + (y+7)^3;

Anche qui, se la funzione presenta più di una variabile indipendente, sarà necessario specificare la variabile di integrazione come secondo argomento, che nel nostro caso sarà la variabile x. Eseguendo l’integrazione Matlab restituisce il seguente risultato:

>> int(f,x)
ans =
     1/3*x^3+(y+5)^3*x

Come possiamo vedere, abbiamo ottenuto ancora un’espressione simbolica come risultato. Invece, se abbiamo bisogno di calcolare un integrale definito tra due valori (per esempio tra 0 e 10).

definitive_integral

si dovranno specificare altri due argomenti all’interno della funzione int().

 >> int(f,y,0,10)
ans =
    12500+10*x^2

In questo caso il parametro simbolico y è stato sostituito con dei valori numerici.

write_article_matlab_en

Limiti

Anche i limiti possono essere calcolati simbolicamente e i risultati a volte possono risultare particolarmente interessanti. Per il calcolo dei limiti si usa la funzione limit(). Giusto per vedere la potenzialità di questa funzione, prendiamo come esempio uno dei limiti più popolari:

lim_sinx_x
>> syms x
>> limit(sin(x)/x)
ans =
        1

La funzione limit() specificata con un solo argomento, implicitamente considera il caso in cui la variabile (in questo caso x) tende a zero. Invece, se consideriamo il caso più generale in cui la variabile tende ad un altro valore, dovremo specificarlo all’interno della funzione limit() passandolo come secondo argomento.

>> syms x
>> limit(sin(x)/x, inf)
ans =
        0

Serie e sommatorie

Sommatorie

Si può utilizzare Matlab anche per il calcolo delle sommatorie, se esistono, utilizzando la funzione symsum(). Per esempio, è possibile calcolare la sommatoria della seguente serie:

p-series
summation_01
>> syms x k
>> s = symsum(1/k^2,1,inf)
s =
      pi^2/6
summation_02

Un altro esempio simile potrebbe essere la sommatoria di una serie geometrica:

>> syms x k
>> s = symsum(x^k,k,0,inf)
s =
piecewise([1 <= x, Inf], [abs(x) < 1, -1/(x - 1)])

La serie di Taylor 

Anche la serie di Taylor è ottenibile mediante questa toolbox. Infatti è possibile calcolare la serie di Taylor di una generica funzione usando la funzione taylor(). Per esempio, consideriamo la seguente funzione:

logarithm_function

e ora calcoliamo la serie di Taylor:

>> syms x
>> f = taylor(log(1+x))
f =
x^5/5 - x^4/4 + x^3/3 - x^2/2 + x
>> pretty(f)

  5    4    3    2
 x    x    x    x
 -- + -- + -- + -- + x
 5    4    3    2

Da notare il risultato ottenuto mediante l’uso aggiuntivo della funzione pretty(). Questa funzione stampa un output simbolico in modo simile a come si presenta visualmente l’espressione della formula matematica. I seguenti comandi Matlab ci permettono di mostrare un grafico in cui vengono messi a paraganone l’andamento dell’approssimazione di Taylor con la funzione reale.

>> xd = 1:0.05:5; yd = subs(f,x,xd);
>> ezplot(f, [1, 3]); hold on;
>> plot(xd, yd, 'r-.')
>> title('Taylor approximation vs. actual function');
>> legend('Taylor','Function')
Taylor series

Calcolo matriciale 

Non c’è alcun bisogno di aggiungere che il pane quotidiano di tutti gli ingegneri è il calcolo matriciale. Ancora di più quando consideriamo il grande potenziale che sta nel calcolare le matrici mantenendo i parametri indefiniti lungo tutti i vari calcoli matriciali.

Consideriamo due matrici generiche 2×3 con tutti gli elementi al loro interno definiti da parametri. Ci riferiremo a queste due matrici come A e B.

matrices

Ora, passando a Matlab, per prima cosa dobbiamo definire le 8 variabili come simboli, ciascuna corrispondente ad un diverso elemento all’interno delle due matrici. Successivamente, definiremo le due matrici come abbiamo sempre fatto con Matlab.

>> syms a b c d e f g h 
>> A = [a,b;c,d];
>> B = [e,f;g,h];

Ora che abbiamo definito tutto ciò di cui abbiamo bisogno, vediamo come addizionare queste due matrici. L’addizione di due matrici parametriche genererà un’ulteriore matrice parametrica 2×2:

>> C = A + B
C = 

[a+e, b+f]

[c+g, d+h]

In maniera simile, anche il prodotto tra le matrici A e B produce una nuova matrice che mantiene al suo interno i parametri iniziali.

>> D = A*B
D =

[a*e+b*g, a*f+ b*h]

[c*e+d*g, c*f+d*h]

Certamente a questo punto ti starai chiedendo: OK, sto lavorando simbolicamente e possono vedere i parametri con cui sono partico, ma ora vorrei sostituirli con dei valori numerici… Ok. Nessun problema. Lavorando simbolicamente con le matrici alla fine otteniamo un insieme di matrici contenenti gli 8 parametri di partenza. Ora è possibile valutare tutte queste matrici numericamente. E’ solamente necessario assegnare agli 8 parametri di partenza un set di valori appropriati e poi con il comando eval ottenere il risultato numerico delle matrici ottenute nei calcoli precedenti.

>> a=1;b=2;c=3;d=4;e=5;f=6;e=7;f=8;g=9;h=0;
>> eval(A)
ans = 
1 2 
3 4

Un’altra operazione molto comune che si fa sulle matrici è il calcolo dell’inversa. Si può ottenere l’inversa di A utilizzando lo stesso comando inv() che si utilizza per le matrici numeriche, ma il risultato in questo caso sarà un’altra matrice simbolica.

>> D = inv(A)
D = 
[ d/(a*d-b*c), -b/(a*d-b*c)]
[-c/a*d-b*c),a/[a*d-b*c)]

Nuovamente, se si desidera valutare numericamente la matrice inversa di A, si può utilizzare anche qui il comando eval().

>> Dn = eval(inv(A))
Dn = 
-2.0000 1.0000
1.5000 -0.5000

Tutte le persone che si avvicinano al mondo della robotica, scopriranno presto (o hanno già scoperto) quanto sia importante l’approccio simbolico (parametrico) nel calcolo matriciale, specialmente durante il calcolo del jacobiano.

Comunque anche per tutti gli altri che generalmente lavorano con Matlab avranno ormai compreso l’importanza di lavorare con le espressioni matematiche “simbolicamente”.

Lascia un commento