...

Polinomi, integrazione e ottimizzazione

by user

on
Category: Documents
8

views

Report

Comments

Transcript

Polinomi, integrazione e ottimizzazione
Polinomi, integrazione e
ottimizzazione
Polinomi


Nell’ambito dell’algebra dei polinomi, alcune funzioni possono
risultare di una certa utilità.
La funzione roots funziona roots(v), dove v è un vettore con i
coefficienti della incognita, dal termine di più alto grado al
termine noto, ed estrae le radici del polinomio. Ad esempio se
abbiamo il polinomio x5-x4-7x3+7x2+12x-12 e vogliamo trovarne
le radici, ossia i valori di x che la azzerano, dobbiamo scrivere
roots([1
-1
-7
7
12 -12])
e MATLAB calcola tutte le radici, reali o complesse che siano.
NB1: nel caso non vi sia un termine va posto zero!!
NB2: l’ultimo è il termine noto.
Polinomi

La funzione polyval funziona polyval(v,k), dove v è un vettore
con i coefficienti della incognita, dal termine di più alto grado al
termine noto, k è un numero e calcola il polinomio in
corrispondenza di k (ossia sostituisce x=k). Ad esempio se
abbiamo il polinomio -3x4-2x3+6x2+2x-1 e vogliamo calcolarlo in
x=-1, dobbiamo scrivere
polyval([-3 -2 6 2 -1],-1)
e MATLAB restituisce 2.
Polinomi

La moltiplicazione tra due polinomi, indicati sempre attraverso i
vettori contenenti i coefficienti, avviene con il comando conv;
se moltiplico x3-2 per x2+3x-5 devo fare:
x=[1 0 0 -2];
y=[1 3 -5];
z=conv(x,y);

e MATLAB restituisce 1
3 -5 -2 -6 10, ossia il
polinomio (ovviamente di 5° grado) x5+3x4-5x3-2x2+6x+10.
La divisione tra due polinomi, indicati sempre attraverso i
vettori contenenti i coefficienti, avviene con il comando
deconv,che funziona come conv e dà anche un vettore con
l’eventuale resto.
Integrazione numerica

Per quanto riguarda l’integrazione numerica in 2 variabili, il
valore di un integrale definito del tipo
b
 f ( x)dx
a
dove f:R=> R, ossia funzione reale di variabile reale, può
essere calcolato con la funzione quad8, dove quad sta per
formula di quadratura, ossia di integrazione numerica. Per
integrare una funzione va usato il comando inline, che
introduce una variabile nel command senza passare dall’edit.
Se vogliamo quindi calcolare 
e
0
3 x
cos( 2 x )dx
Integrazione numerica
definiamo la funzione e la calcoliamo nel modo seguente
>> f=inline(‘exp(-3*x).*cos(2*x)’);
>> quad8(f,0,π);
e MATLAB calcola 0.2308. Notiamo che:
 La funzione inline riconosce x come variabile e vuole il
suo argomento (la funzione) tra ‘;
 La funzione quad8 funziona quad8(funzione, estremo inf,
estremo sup)

Matlab integra fino ad un massimo di 3 variabili (funzione
dblquad; per più di 3 variabili dobbiamo ricorrere alla
simulazione numerica (Monte Carlo).
Ottimizzazione non vincolata

Per risolvere un problema di ottimizzazione non vincolata (max
o min) e quindi di programmazione lineare del tipo
max f(x)
x
oppure
min f(x)
x
possiamo utilizzare 2 funzioni:
- fminsearch, che sfrutta una variante del metodo del simplesso
- fminunc, che sfrutta il calcolo del gradiente.
Ottimizzazione non vincolata

Definita una inline function che contenga la funzione obiettivo:
g(x)=(x1+3)2 + (x2-2)2
possiamo calcolare il minimo della funzione (per calcolare il max
basta fare min(-g(x)) ) digitando:
>> f=inline('(x+3)^2 + (x(2)-2)^2');
>> s1= fminsearch(f,[1 1]);
>> s2 = fminunc(f,[1 1]);
dove [1,1] è un punto iniziale dal quale far partire l’algoritmo.
MATLAB fornisce la soluzione. Non sempre è detto che le due
soluzioni coincidono, dipende dalla forma del gradiente!
Ottimizzazione vincolata

Per risolvere un problema di ottimizzazione vincolata di
1°grado, ossia di programmazione lineare del tipo
max
 sub




min c' x

Ax  b
 sub Ax  b
oppure 
Ax  b
Ax  b


ixs
ixs
c' x
dove c’x è la funzione obiettivo, utilizziamo il comando
linprog. Questo considera un problema di minimizzazione,
per cui la massimizzazione si ottiene sempre facendo
min(-f(x)).
Ottimizzazione vincolata

Linprog funziona:
X=LINPROG(c,A,b,Aeq,Beq,LB,UB,X0,OPTIONS), dove:









c è il vettore dei pesi delle variabili
A è la matrice in Ax<b
b è il vettore in Ax<b
Aeq è la matrice in Ax=b
beq è il vettore in Ax<b
lb è l’estremo inferiore dell’intervallo di x
ub è l’estremo superiore dell’intervallo di x
X0 è il punto di partenza dell’algoritmo
options => v. optimset functions
Ottimizzazione vincolata

Dovendo risolvere il problema
min 2 x 1  3x2

sub x 1  x 2  3

x1  0

impostiamo con linprog:
>> s=linprog([2 -3],[1 1],3,[],[],[0]);
dove le parentesi vuote indicano che quel tipo di vincolo non
è presente. Un solo zero in quanto è solo x1 ad essere
vincolata.
Ottimizzazione vincolata

Per risolvere un problema di ottimizzazione vincolata di
2°grado, ossia di programmazione quadratica del tipo

max

sub



1
1

x' Hx  c' x
min
x' Hx  c' x

2
2

Ax  b
oppure sub Ax  b

Ax  b
Ax  b

ixs
ixs

dove (x’Hx)/2+c’x è la funzione obiettivo, utilizziamo il
comando quadprog. Questo considera un problema di
minimizzazione, la massimizzazione si ottiene sempre
facendo min(-f(x)).
Ottimizzazione vincolata

quadprog funziona:
x=quadprog(H,f,A,b,Aeq,beq,LB,UB) dove:








H è la matrice dei pesi nella forma quadratica
c è il vettore dei pesi delle variabili di 1° grado
A è la matrice in Ax<b
b è il vettore in Ax<b
Aeq è la matrice in Ax=b
beq è il vettore in Ax<b
lb è l’estremo inferiore dell’intervallo di x
ub è l’estremo superiore dell’intervallo di x
Ottimizzazione vincolata

Dovendo risolvere il problema
min

sub




x  3x 2  3x1  x 2
2
1
2
x1  0
x2  0
x 1  2 x2  4
impostiamo con quadprog i singoli elementi del problema di
ottimizzazione:
Ottimizzazione vincolata
>>
>>
>>
>>
>>
>>
H = [2 0 ; 0 6];
c = [3 -1];
Aeq=[1 2];
beq=4;
lb=[0 0];
x = quadprog(H,c,[],[], Aeq,beq,lb)
Il risultato è
x=
0.2857
1.3571
Soluzione di equazioni non lineari


Talvolta siamo di fronte ad equazioni non lineari, ossia equazioni
che non possono essere invertite per esprimere la x in funzione
di altre variabili. Es. se so che y = 3x+e1-x, ovviamente non
possiamo invertire questa relazione e scrivere x=… per cui
dobbiamo ricorrere a metodi numerici che facciano dei
“tentativi” fino a che non troviamo il valore di x. Ad es. se
sappiamo che y=3, possiamo trovare il valore di x che rende
y=3 (ossia lo zero della funzione) con il comando fzero. La
funzione di cui stiamo cercando lo zero può essere introdotta
con un m-file o con un comando inline. Poiché noi stiamo
cercando lo zero, dovremo scrivere la funzione come y-3, perché
è di questa che cerchiamo lo zero!!
Quindi il codice in MATLAB può essere il seguente:
Soluzione di equazioni non lineari
>> f=inline(‘3*x+exp(1-x)-3’);
>> fzero(f,2)
dove 2 è un numero dal quale faccio partire l’algoritmo (initial
guess), che è basato su una variante del metodo di bisezione. Il
risultato è: 0.3809. In corrispondenza di tale valore di x la y vale
3.
Fly UP