%% Esercitazioni basate sul Tutorial per il calcolo simbolico
%
% Il Symbolic Math Toolbox utilizza molti dei nomi delle funzioni numeriche di MATLAB e per ottenere le informazioni relative alla versione simbolica di una particolare funzione occorre digitare nella Command Window
% >>help sym/nomefunzione. es.

help sym/tan

%
%% Definire variabili simboliche

x = sym('x')          % definisce x come variabile (stringa) simbolica
A = sym('a',3)        % definisce una matrice simbolica 3x3.
                      % N.B. la procedura non crea le variabili simboliche a1_1 etc.
B = sym('b',[2,3,4])  % definisce una matrice simbolica 2x3x4

C = sym('c',3,'real') % è possibile anche assumere che le componenti siano reali, positive, interi, razionali
% per controllare le assunzioni fatte usare assumptions
assumptions
% per eliminare le assunzioni usare
assume(C,'clear')
assumptions

% sym può essere utilizzato per creare numeri simbolici
sym(0.2)
sym(0.2,'r') % rappresentazione razionale (default)
sym(0.2,'f') % rappresentazione floating point
sym(0.2,'d') % espansione decimale 32 cifre
digits(7); sym(0.2,'d') % espansione decimale con 7 cifre

pi = sym(pi) % definisce il simbolo pi come 3.14....

% sym può essere utilizzato per eseguire calcoli in forma simbolica
sym(pi/6) + sym(pi/4)

% un'espressione simbolica può essere rappresentata in forma numerica
double(sym(pi))    % converte l'espressione simbolica in forma numerica
vpa(pi/6) + vpa(pi/4)

clear

%
%% Funzioni simboliche

% possono essere definite utilizzando il comando sym (da function handles)
funzione = @(x) 2*x^2+3*x-4;      % anonimous function
FunzioneSimbolica = sym(funzione) % le funzioni simboliche possono essere manipolate algebricamente
diff(FunzioneSimbolica)           % ad esempio calcolando la derivata
int(FunzioneSimbolica)            % o l'integrale

% oppure con il comando syms
syms f(x) % definisce una funzione f di x, entrambi simbolici
f(x) = x^4-2*x^3+6*x^2-2*x+10
f(2) % valuta f(x=2)

% oppure il comando symfun
syms x y
fsym = symfun(x^2+y^2-2, [x, y])

% oppure definendo prima variabili simboliche e poi funzioni
syms x y
syms z real % anche con assunzioni
funz = 3*(x+y)^2 + 4*(y-z) + 5*sqrt(z)

% derivate
diff(funz)     % derivata rispetto a x (default)
diff(funz,y)   % derivata rispetto a y
diff(funz,y,2) % derivata seconda rispetto a y

% integrali
int(funz)
int(funz,x)
int(funz,y)

% integrale definito
int(x*log(1+x))
int(x*log(1+x),0,1)

% limiti
limit(funz)             % limite della funzione per x che tende a zero (default)
limit(1/x,x,0,'right')  % limite di 1/x per x->0+
limit(1/(x+y),y,0)      % limite di 1(x+y) per y->0

clear

%
%% Manipolare funzioni simboliche

syms x y
funzione = 3*(x-4)^3 - (y-1)^(-1);

pretty(funzione)    % forma matematica della funzione

collect(funzione,x) % raccoglie i coefficienti con la stessa potenza di x
expand(funzione)    % espande l'espressione della funzione
factor(funzione)    % esprime funzione come prodotto di polinomi con coefficienti razionali
simplify(funzione)  % ricerca la forma più semplice della funzione

subs(funzione,x,4)            % sostituisce 4 a x
subs(funzione,x,y)            % sostituisce y a x
subs(funzione,{x,y},{4,2})    % sostituisce 4 a x e 1 a y

poly2sym([1,2,3])       % converte i coefficienti del vettore [1,2,3] in un polinomio simbolico
sym2poly(x^2+2*x+3)     % converte l’espressione x^2+2*x+3 nel vettore di coefficienti

%% Altri da https://it.mathworks.com/help/symbolic/examples/computational-mathematics-in-symbolic-math-toolbox.html
% Apply trigonometric identities to simplifications, for example {\mathrm{sin}}^2 \left(x\right)=\frac{1-\mathrm{cos}\left(2x\right)}{2}.

combine(2*sin(x)*cos(x) + (1- cos(2*x))/2 + cos(x)^2,'sincos')

%% Find the functional composition f(g(x)).

f(x) = sqrt(log(x));
g(x) = sqrt(1-x);
h = compose(g,f,x)
clear

%
%% Creare e valutare e creare grafici di espressioni simboliche

syms x;
funzione = (x-1)*(x+2)*(-x+3);

class(funzione)    % restituisce la classe dell'espressione della funzione
symvar(funzione)   % restituisce il mone delle variabili della funzione
findsym(funzione)  % come la precedente, ma funzione più vecchia

numden(funzione)   % restituisce due espressioni simboliche che rappresentano
                   % il numeratore e il denominatore della rappresentazione
                   % razionale della funzione

ezplot(funzione,[-1,1]) % plotta la funzione

fplot(tan(x))
fplot(tan(x),[-2,2])

% 2D contour plot
fcontour(sin(x) + cos(y))

% curva parametrica
syms t
x = t*sin(5*t); 
y = t*cos(5*t);
fplot(x, y)
grid on

% 3D plot
syms x y
fsym = symfun(x^2+y^2-2, [x, y])
fsurf(fsym,[-10 10])

% 3D paramtric curve
syms t
xt = exp(abs(t)/10).*sin(5*abs(t));
yt = exp(abs(t)/10).*cos(5*abs(t));
zt = t;
h = fplot3(xt,yt,zt, [-10,10],'--r');

%
%% Risoluzione di equazioni e sistemi di equazioni algebriche e trascendenti

syms x y
s = solve([x+y==1, x-y==-1],[x, y]) % si veda help sol per maggiori dettagli
% s è una struttura
s.x     % valore x di s
s.y     % valore y di s

% la precedente espressione può essere scritta così:
[solx, soly] = solve([x+y==1, x-y==-1],[x, y]) % assegna le componenti si s a solx e soly

% si possono determinare i punti di intersezione tra funzioni
syms x y1 y2
y1 = x+3; y2 = 3*x;
solve(y1 == y2)

clear

%
%% Equazioni differenziali
% Solve the first order ODE dy/dx = -ax

syms a b y(x)
dsolve(diff(y) == -a*y)

% Solve the same ODE with the intial condition  y(0) = b.

dsolve(diff(y)== -a*y,y(0)==b)

% Solve the system of coupled first order ODEs tx/dt = y and dy/dt = -x.

syms x(t) y(t)
z = dsolve(diff(x) == y, diff(y) == -x);
disp([z.x;z.y])

clear

%
%% Altri comandi notevoli tratti da
% https://it.mathworks.com/help/symbolic/examples/computational-mathematics-in-symbolic-math-toolbox.html

% ---------------
% Make ASSUMPTIONS on symbolic variables. There are 4 solutions to , two real and two complex. Assuming that x is real and , there is only one solution.

syms x
solve(x^4 == 1)

assume(x,'real')
assumeAlso( x > 0)
assumptions(x)

solve(x^4 == 1)

assume(x,'clear')

% ---------------
% Substitution and Solving

syms x xo
subs(x^2+1,x,xo-1)

syms a b c
subs(cos(a) + sin(b) - exp(2*c), [a b c], [pi/2 pi/4 -1])


clear

%
%% Risoluzione di equazioni e sistemi di equazioni differenziali

dsolve('Dy+2*y=12') % risolve y'(t)+2*y(t)=12
dsolve('D2y=c^2*y') % risolve y''(t)=c^2*y(t)
[x,y]=dsolve('Dx=3*x+4*y','Dy=-4*x+3*y') % risolve x'(t)=3*x(t)+4*y(t), y'(t)=-4*x(t)+3*y(t)
dsolve('Dy=sin(b*t)','y(0)=0') % risolve y'(t)=sin(b*t) cone y(0)=0
[x,y]=dsolve('Dx=3*x+4*y','Dy=-4*x+3*y','x(1)=0','y(0)=1') % risolve x'(t)=3*x(t)+4*y(t), y'(t)=-4*x(t)+3*y(t) cone x(1)=0, y(0)=1

clear

%
%% Linear Algebra

syms a b c d
syms x1 x2
x = [x1; x2];
A = [a b ; c d];
b = A*x

det(A)

lambda = eig(A)

[direct, lambda] = eig(A) % le colonne di direct sono gli autovettori

clear