Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
SCRIPT PER FARE IL GRAFICO DI UNA FUNZIONE
Posso creare vettori di componenti equidistanti
x= linspace (a,b,n) a e b sono estremi dell’intervallo n è il numero di punti (se non metto n mi crea 100 punti di default)
x = a : incremento : b se a < b l’incremento > 0 se a > b l’incremento < 0
% script di esempio sui grafici di funzione
clear % eliminare tutte le variabili che potrebbero darci fastidio
close all % chiudiamo tutte le eventuali figure presenti (grafici prima)
f=@(x) 0.2-1.5*sin(x); % la funzione seno è gia vettorizzata
% fplot(f) comando che crea il grafico della funzione
% quando lancierò questo script non apparirà nulla sulla command window
% ma uscirà una finestra aggiuntiva con il grafico
% se voglio aumentare lo spessore delle righe del grafico scrivo così
fplot(f,'linewidth',2) % spessore da 0 a 4
% di default il colore del grafico è il blu
% se non definisco un intervallo MATLAB prenderà i valori da -5 a 5
hold on % conservo il primo grafico, sovrascivendolo con il secondo
% prendo ora solo alcuni valori che metterò in un vettore
x=[0 2 4 6]; % ascisse
y=f(x); % ordinate
% plot(x,y) non più fplot perchè conosco sia le ascisse che le ordinate
% facendo così mi unisce i punti
plot(x,y,'o') % così metterò in risalto i punti sul grafico precedente
% senza unirli con i segmenti
figure % apro una figura successiva a quella già creata
a=0; b=2; % estremi dell'intervallo su cui voglio fare il grafico
x=linspace(a,b);
y=f(x);
plot(x,y,'linewidth',2)
% ora vedrò due figure
% voglio andare a fare sul secondo grafico l'asse delle ascisse e il
% grafico della bisettrice
hold on % il primo hold on mi serviva per sovrascrivere la prima figura,
% ora ne devo scrivere un altro
x1=[a,b] % vettore ascisse
y1=[0,0] % vettore ordinate
plot (x1,y1,'linewidth',2) % asse delle ascisse
plot (x,x,'linewidth',2) % bisettrice essendo y=x
xlabel ('asse delle ascisse') % etichetta su asse x
ylabel ('asse delle ordinate') % etichetta su asse y
title ('Esperimenti di grafici') %titolo della figura
plot(x,y,'o') % così metterò in risalto i
punti sul grafico precedente
plot (x1,y1,'linewidth',2) % asse delle
ascisse
plot (x,x,'linewidth',2) % bisettrice
essendo y=x
xlabel ('asse delle ascisse') % etichetta
su asse x
ylabel ('asse delle ordinate') % etichetta
su asse y
title ('Esperimenti di grafici') %titolo
della figura
LEZIONE 24 MARZO
RIPASSO DELLA STRUTTURA CONDIZIONALE IF
1^ tipo di struttura
Se (if) la proposizione logica che andiamo a scrivere è vera allora abbiamo delle istruzioni (una o più) da eseguire, altrimenti
(else) possiamo fare altre istruzioni. Fine (END)
2^ tipo di struttura
Se (if) la proposizione logica è vera allora abbiamo delle istruzioni da eseguire, altrimenti (else) se (if) abbiamo un’altra
proposizione logica abbiamo da eseguire altre istruzioni, (posso fare ‘altrimenti se’ quante volte voglio), poi ci saranno le
istruzioni finali. Fine (END)
CICLO FOR
In genere io faccio variare un indice intero e al variare di esso faccio determinate istruzioni
FOR i= 1 : 10 [oppure 1 : 1 (incremento) : 10] istruzioni END
L’operatore : ci permette di creare un vettore di componenti equidistanti. Se scrivo x= 1 : 2 : 10, matlab mi creerà un vettore con
componenti (1 3 5 7 9), ovvero un vettore da 1 a 10 con componenti equidistanti di passo 2.
Se io volessi creare un vettore di passo 1, invece di scrivere x= 1 : 1 : 10 mi basta scrivere x = 1 : 10 (di default usa 1 come
incremento)
In generale il ciclo for è: FOR i = (vettore riga) istruzioni END
Quando entro nel ciclo, la i è uguale alla prima componente del vettore, eseguo le istruzioni, torno indietro al ciclo FOR e i
diventa la seconda componente ed eseguo le istruzioni, ecc.
Quando scrivo somma=0 ho inizializzato una variabile = 0. Io voglio fare questa somma di i _ n=25). come se facessi
(i=1,….,n
somma = somma + 1 = 0 + 1 = 1
somma = somma + 2 = 1 + 2 = 3
somma = somma + 3 = 3 + 3 = 6 e così per farlo con matlab basta che creo uno script con scritto for i=1:n e somma =
via….
somma + i (partendo ovviamente da somma = 0).
clear %cancello tutte le variabili esistenti
for i=1:10 %inizio il ciclo for creando un vettore i di passo 1
disp('imparo il ciclo for') %scrivo una stringa che verrà ripetuta 10 volte
disp(i) % visualizzo il contenuto della variabile
end %termino il ciclo
% facciamo la somma data da i primi n numeri interni
% somma = 1+2+3+4+...+n
n=25; %numero scelto a caso
%voglio ogni volta aggiungere un termine alla somma
somma=0; %introduco questa variabile in cui avrò il rusltato delle operazioni
disp('************') % per separare i due esempi di cicli for
for i=1:n
somma=somma+i;
disp(somma)
end
x=[0.5 0.25 0.125]; %creo un vettore riga
for a=x
disp('sto usando in modo particolare il ciclo for')
disp(a)
end
CICLO WHILE
while (fin tanto che) è vera una proposizione logica, esegui determinate istruzioni, END. (altrimenti stop)
Quindi per partire la proposizione deve essere vera, però se questa proposizione rimane sempre vera si andrà avanti all’infinito.
Le istruzioni che andrò a scrivere dovranno andare a influenzare la proposizione logica e in alcune situazioni questa proporzione
logica dovrà diventare per forza falsa.
Analizziamo il ciclo while tramite un esempio di schema di punto fisso di g(x) = cos (x) con uno script.
%%%%%%%%%%%%%%%%%%%%%%%%% ciclo while %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
toll=1.e-10; %posso anche scrivere 10^(-10)
x0=1;
itmax=100; %numero massimo di iterazioni
% fin tanto che lo scarto è > di una toll prefissata e il numero delle iter
% sono < del valore massimo itmax allora eseguo una nuova iterazione dello
% schema di punto fisso
scarto=2*toll; %un valore più grande di toll e fittizzio per entrare nel
% ciclo while
iter=0;
while scarto > toll && iter < itmax
x1=cos(x0); % aggiorno x0 con una nuova variabile
iter=iter+1; % devo aggiornare la variabile iter
scarto=abs(x1-x0); %adesso lo scarto lo valuto veramente
x0=x1;
disp(x1); % mostra il valore trovato in ogni singola iterazione
disp(iter); % mostra il numero di iterazione
disp(scarto); % mostra lo scarto
end
SCRIPT GENERALE PER LO SCHEMA DI PUNTO FISSO
Devo definire una function handle associata alla funzione di punto fisso (così che possa essere sia coseno, sia seno, sia un
polinomio di secondo grado, qualsiasi funzione quindi).
Preallocazione di memoria: precedentemente dò spazio alla memoria per questo vettore
Per fare il grafico in scala semi logaritmica sull’asse delle y il comando è semilogy.
Per fare il grafico in scala semi logaritmica sull’asse delle x il comando è semilogx.
Per fare il grafico in scala logaritmica su entrambi gli assi è loglog.
clear % elimino tutte le variabili
close all % per le figure
g=@(x) cos (x); % function handle
x0=1;
toll=1.e-10; % tolleranza
itmax=100; % numero massimo di iterazioni
scarto=2*toll; % definisco lo scarto
% dopo voglio fare un grafico di convergenza per capire come decrescono gli
% scarti ad ogni iterazione, se il metodo converge o no (quindi esplodono)
iter=0;
vettscarti=zeros(itmax,1); % crea una matrice di tutti 0 in base agli indici che metto in ()
xold=x0;
while scarto > toll && iter < itmax
xnew=g(xold);
iter=iter+1;
scarto=abs(xnew-xold); % valuto lo scarto
vettscarti(iter)=scarto; %salvo lo scarto nella componente iter del vettore vetscarti
xold=xnew;
end
% taglio il vettore prendendo solo le prime iter componenti (quelle che mi
% interessano)
vettscarti=vettscarti(1:iter); %taglio il vettore in base a quello che mi serve a me
%%%%%%%%%%%%%%% finita la parte dell'algoritmo %%%%%%%%%%%%%%%%%%%%%%%
disp(xnew)
disp(iter)
%%%%%%%%%%%%%%% faccio un grafico di convergenza %%%%%%%%%%%%%%%%%%%%%%
% sull'asse delle ascisse ci saranno le iterazioni fatte mentre sull'asse
% delle ordinate gli scarti a ogni iterazione
% in scala semi logaritmica sull’asse delle ordinate
% mi aspetto che se lo schema converge linearmente (p=1) avrò una retta
% se lo schema converge quadraticamente (newton raphson p=2) avrò una curva
vettiter=1:iter;
semilogy(vettiter,vettscarti,'linewidth',2)
xlabel('iterazioni fatte')
ylabel('scarto a ogni iterazione')
title('Grafico di convergenza')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure %cosi ne creo un'altra e non la sovrascrivo
a=0; b=2; % estremi dell'intervallo per fare il grafico della funzione
fplot(g,[a,b]) % per fare il grafico della funzione
hold on
plot ([a,b],[a,b],'linewidth',2) % per tracciare la bisettrice
LEZIONE 31 MARZO
FUNCTION
Le function sono simili agli script ma sono più duttili.
Caratteristiche SCRIPT FUNCTION
● ●
all’inizio metto tutti i dati che mi servono per creo qualcosa di più generico che può essere
risolvere un problema utilizzato in tutti gli script che voglio in maniera più
● lo script mi dà i risultati di questo problema semplice rispetto a dover fare 100 script
leggermente diversi tra loro
Per capire l’importanza delle function supponiamo che debba lavorare con una funzione matematica f(x) che abbia però diversi
valori a seconda di dove varia la x:
f(x) = x per x > 0
f(x) = -x per -1 < x < 1
f(x) = x^2 per x < -1 …
In questo caso non posso utilizzare una function di tipo handle, non posso scrivere f = @ (x) perché la mia funzione a
seconda di come varia x assumerà un valore diverso.
Allora io ho bisogno di scrivere un sottoprogramma (denominato function) che mi permette di dare in input 1 o + variabili, nel
caso particolare di questa funzione mi interessa dargli la x e il risultato sia la y (che dipende da x). Quindi posso scrivere un
sottoprogramma di dire se x > 0 la f(x) deve valere x, se 1 < x < 1 la f(x) deve valere – x altrimenti varrà x^2.
Questa struttura se la facessi all’interno di uno script, dato che devo richiamare la x più volte dovrei ripetere le stesse istruzioni in
più parti dello script e questo mi appesantisce lo script. Se io invece scrivo le istruzioni una sola volta e poi le richiamo quante
volte voglio (attraverso la function) mi velocizzo il problema.
Come va strutturata una function?
Abbiamo dei dati input, abbiamo un algoritmo (una funzione matematica compli