Riassunto In questa esercitazione e` stato introdotto l`ambiente

Riassunto
In questa esercitazione e' stato introdotto l'ambiente MatLab ed e' stato mostrato l'ambiente in funzione
riepilogando i comandi di base come l'assegnamento di scalari, array e matrici a variabili, operazioni
tra matrici, ecc. Per maggiori riferimenti su questi comandi consultare la dispensa del corso.
Successivamente sono stati svolti gli esercizi che trovate in fondo alla pagina.
Slide presentate.
Gli esercizi svolti sono i seguenti:
1.
2.
3.
4.
5.
6.
Un esempio di cinematica
Equazioni di secondo grado
Sistemi di equazioni lineari
Confronti
Vettori logici
Cosa Stampa?
Esercizio1.Un esempio di cinematica
Due treni partono da due stazioni adiacenti, che distano 15km, viaggiando a velocità di 50m/s e 30m/s
in direzione opposta
Costruire un grafico che mostra il loro movimento, fino a quando il più veloce raggiunge la
destinazione
Il più veloce impiega 15000/50=300s
DistanzaTreno1=50·t;
DistranzaTreno2=15000-30·t; (per mostrare la
provenienza dalla direzione opposta)
Soluzione
t=0:1:300;
p1=50 * t;
p2=15000 – 30 * t;
plot(t,p1);
hold on %adesso è possibile inserire nuove
curve sul grafico
plot(t,p2)
hold off
Esercizio 2. (Equazioni di secondo grado)
Si chieda l'inserimento dei tre coefficienti di una equazione di secondo grado:
ax2+bx+c=0
e si stampi il valore delle radici reali.
Soluzione
Bisogna calcolare il discriminante dell'equazione con la formula: b2-4ac
Se e' positivo abbiamo due radici distinte, se e' nullo le radici sono reali e coincidenti, se e' negativo le
radici non sono reali.
Codice
a=input('Inserire a: ');
b=input('Inserire b: ');
c=input('Inserire c: ');
delta=b^2-4*a*c;
if delta < 0
disp('L''equazione non ha soluzioni reali');
elseif delta==0
disp(['x=' num2str(-b/(2*a))]);
else
disp(['x1=' num2str((-b-sqrt(delta))/(2*a)) ' x2=' ...
num2str((-b+sqrt(delta))/(2*a))]);
end
Esecuzione
Inserire a:
Inserire b:
Inserire c:
L'equazione
1
1
1
non ha soluzioni reali
Inserire a: 1
Inserire b: 2
Inserire c: 1
x=-1
Inserire a: 1
Inserire b: 1
Inserire c: -1
x1=-1.618 x2=0.61803
Esercizio 3. (Sistemi di equazioni lineari)
Si scriva uno script che chieda l'inserimento dei coefficienti e dei termini noti di un sistema di
equazioni di primo grado in M equazioni e N incognite. Dopodiche' si calcoli la soluzione del sistema.
Si consideri solo il caso in cui M e' uguale a N.
Soluzione
Il sistema puo' essere rappresentato in forma di matrice:
Dall'algebra lineare sappiamo che i valori delle incognite che corrispondono alla soluzione del sistema
sono contenuti nella matrice data dalla moltiplicazione dell'inverso della matrice dei coefficienti A per
il vettore dei termini noti.
La soluzione e' quindi S=A-1b che in Matlab equivale all'operazione di divisione sinistra: S=A\b
Codice
N=input('Inserire il numero di equazioni e di incognite: ');
x = 1;
while x <= N % righe (equazioni)
y = 1;
while y <= N % colonne (incognite)
A(x,y)=input(['inserire coefficiente incognita ' num2str(y)
.
' dell''equazione ' num2str(x) ': ']);
y = y + 1;
end
b(x)=input(['inserire termine noto equazione ' num2str(x) ': ']);
x = x+1;
end
A
b
S=A\b'
Esecuzione
inserire
inserire
inserire
inserire
inserire
inserire
inserire
numero di equazioni e di incognite: 2
coefficiente incognita 1 dell'equazione
coefficiente incognita 2 dell'equazione
termine noto equazione 1: 4
coefficiente incognita 1 dell'equazione
coefficiente incognita 2 dell'equazione
termine noto equazione 2: -1
A =
1
-6
2
5
4
-1
b =
S =
1.2941
1.3529
1: 1
1: 2
2: -6
2: 5
Esercizio 4. (Confronti)
Si scriva uno script che chiede di inserire una sequenza di N numeri, dopodiche' si inserisca un
ulteriore numero e si dica se tutti i numeri della sequenza sono minori, uguali o maggiori di tale
numero.
Soluzione
Sono presenti due modi per risolvere questo problema. Il secondo evita l'utilizzo del ciclo ed e' piu'
efficiente e leggibile.
Codice
N=input('inserire N: ');
x = 1;
while x <= N
a(x) = input('inserire numero: ');
x = x +1;
end
x = 1;
M=input('inserire M: ');
minori=true;
maggiori=true;
uguali=true;
while x <= N
if a(x)>M
minori=false;
uguali=false;
elseif a(x)<M
maggiori=false;
uguali=false;
else
maggiori=false;
minori=false;
end
x = x +1;
end
if minori
disp('I numeri della sequenza sono minori del numero dato');
else
disp('I numeri della sequenza non sono minori del numero dato');
end
if maggiori
disp('I numeri della sequenza sono maggiori del numero dato');
else
disp('I numeri della sequenza non sono maggiori del numero dato');
end
if uguali
disp('I numeri della sequenza sono uguali al numero dato');
else
disp('I numeri della sequenza non sono uguali al numero dato');
end
Codice alternativo (piu' efficiente) per il ciclo
if sum(a<M) < N
minori = false;
end
if sum(a>M) < N
maggiori = false;
end
if sum(a==M) < N
uguali = false;
end
Esecuzione
inserire
inserire
inserire
inserire
inserire
inserire
inserire
I numeri
I numeri
I numeri
N: 5
numero: 1
numero: 2
numero: 3
numero: 4
numero: 5
M: 6
della sequenza sono minori del numero dato
della sequenza non sono maggiori del numero dato
della sequenza non sono uguali al numero dato
Esercizio 5. (Vettori logici)
Si scriva uno script che chieda l'inserimento di una sequenza di N numeri.
1.
2.
3.
4.
Si stampino i valori dei numeri in posizione pari;
Si stampino i valori dei numeri in posizione dispari;
Si stampino i valori dei numeri pari;
Si stampino i valori dei numeri dispari.
Soluzione
Codice
N=input('inserire N: ');
clear a;
x = 1
while x <= N
a(x) = input('inserire numero: ');
end
% stampo soluzione punto 1
a(2:2:N) % stampo soluzione punto 2
a(1:2:N)
% stampo soluzione punto 3
a(mod(a,2)==0)
% stampo soluzione punto 4
a(mod(a,2)==1)
Esecuzione
inserire
inserire
inserire
inserire
inserire
inserire
N: 5
numero:
numero:
numero:
numero:
numero:
ans =
1
4
ans =
3
8
ans =
8
4
ans =
3
1
3
1
8
4
9
9
9
Esercizio 6. (Matrici logiche misteriose)
Date le seguenti matrici a e b si dica cosa stampano le seguenti istruzioni.
a=
1
4
7
2
5
8
3
6
9
b=
9
6
3
8
5
2
7
4
1
1.
2.
3.
4.
5.
6.
a(3,1)
a(8)
a(a==b)
b(a>b|b>a)
a(b)
c=a;c(a>b)=b(a?b).^2
Soluzione 1
>> a(3,1)
ans =
7
L'istruzione accede al valore memorizzato nella riga 3 e colonna 1 della matrice a.
Soluzione 2
>> a(8)
ans =
6
L'istruzione accede al valore memorizzato nell'ottavo elemento della matrice. Gli elementi vengono
contati per colonna. La prima colonna ha i primi 3 elementi, la seconda colonna ha gli altri 3 e cosi' via
fino al nono elemento. In questo caso l'ottavo elemento coincide con l'elemento della seconda riga e
della terza colonna.
Soluzione 3
>> a==b
ans =
0
0
0
0
1
0
0
0
0
In questo caso il vettore logico a==b e' vero (1) soltanto per l'elemento di riga 2 e colonna 2 della
matrice (infatti e' l'unico elemento di a che e' uguale al corrispondente elemento di b).
Soluzione 4
>> a>b
ans =
0
0
0
0
0
1
1
1
1
Questo esercizio e' simile al precedente. Viene prodotta la matrice logica per cui "a>b", cioe' che il
numero di a sia maggiore di b .
Soluzione 4
>> c= b.^2 %(elevamento al quadrato di ogni elemento di b)
c =
81
36
9
64
25
4
49
16
1
>> c= b^2 %(prodotto righe per colonne di b * b)
c =
150
96
42
126
81
36
102
66
30
Soluzione 5
>> c= b.^a %(ogni elemento di b viene elevato al corrispondente elemento di a)
c =
9
1296
2187
64
3125
256
343
4096
1
Nota: non ha senso b^a! Produce: error: can't do A ^ B for A and B both matrices