Esercizi matlab
1)dato un intervallo $[a,b]$ costruire un vettore di due elementi presi a caso nell'intervallo, poi disegnare il grafico della funzione $a^3-(cos(a)/(|a|+1))$
la parte del grafico non mi è riuscita,per il vettore ho scritto:
n=(a*rand) : (b*rand)
x=a:n:b
ma non so se va bene, come posso fare a completarlo
2)dato l'intervallo $[1000,2000]$ scrivere la somma di tutti i quadrati dei numeri divisibili per 9
ho scritto:
i=1000
for i=1000:2000
if rem(i,9)=0
break
i=$i^2+(i+1)^2$
end
potreste correggermi se sono sbagliati?
la parte del grafico non mi è riuscita,per il vettore ho scritto:
n=(a*rand) : (b*rand)
x=a:n:b
ma non so se va bene, come posso fare a completarlo
2)dato l'intervallo $[1000,2000]$ scrivere la somma di tutti i quadrati dei numeri divisibili per 9
ho scritto:
i=1000
for i=1000:2000
if rem(i,9)=0
break
i=$i^2+(i+1)^2$
end
potreste correggermi se sono sbagliati?
Risposte
Attento direi che non va bene nessuno dei due:
per il primo ti conviene prendere un numero casuale tra 0 e 1 poi "spostarlo" nel tuo intervallo
per il secondo:
i=1000 %non ti serve indicizzarlo
for i=1000:2000
if rem(i,9)=0
break %se fai break esci dal ciclo for e tu invece vuoi andare avanti senza considerarlo;
i=i2+(i+1)2 %attenzione qui usi i ma la i è il contatore del ciclo for, così alteri il ciclo non va bene, ti conviene definire un'altra variabile e fare per esempio s=s+i^2
end
per il primo ti conviene prendere un numero casuale tra 0 e 1 poi "spostarlo" nel tuo intervallo
per il secondo:
i=1000 %non ti serve indicizzarlo
for i=1000:2000
if rem(i,9)=0
break %se fai break esci dal ciclo for e tu invece vuoi andare avanti senza considerarlo;
i=i2+(i+1)2 %attenzione qui usi i ma la i è il contatore del ciclo for, così alteri il ciclo non va bene, ti conviene definire un'altra variabile e fare per esempio s=s+i^2
end
così invece può andare bene?
for i=1000:2000
if rem(i,9)==0
i=i^2
s=s+i^2
end
end
for i=1000:2000
if rem(i,9)==0
i=i^2
s=s+i^2
end
end
come mai metti questa istruzione:
i=i^2
credo non ti serva: il quadrato lo metti già nella formula dopo per il calcolo della somma, anzi così facendo sarebbe come elevare alla quarta il tuo valore; se metti i=i^2 dovresti metterlo dopo che hai calcolato s (comunque non ti viene richiesto, io lo toglierei) oppure se lo metti prima hai per la somma s=s+i (perchè i lo hai definito come i^2)
Ah! ricordati prima del ciclo for di definire s=0
i=i^2
credo non ti serva: il quadrato lo metti già nella formula dopo per il calcolo della somma, anzi così facendo sarebbe come elevare alla quarta il tuo valore; se metti i=i^2 dovresti metterlo dopo che hai calcolato s (comunque non ti viene richiesto, io lo toglierei) oppure se lo metti prima hai per la somma s=s+i (perchè i lo hai definito come i^2)
Ah! ricordati prima del ciclo for di definire s=0
avevo sbagliato a scrivere doveva essere s=s+i
grazie per l'aiuto, l'altro esercizio come lo posso risolvere?
grazie per l'aiuto, l'altro esercizio come lo posso risolvere?
function v=random(a,b,n)
v=zeros(1,n);
for i=1:n
v(i)=(a+b)/2+((b-a)*(rand-.5)/2);
end
questo è una function che ti crea un vettore riga con n colonne dove gli elementi sono casuali ma appartengono al tuo intervallo [a,b]; se non è chiaro cerco di spiegartelo... ricorda che rand restituisce un valore tra 0 e 1; ultima cosa: io l'ho pensato così ma non sono sicuro vada bene!
v=zeros(1,n);
for i=1:n
v(i)=(a+b)/2+((b-a)*(rand-.5)/2);
end
questo è una function che ti crea un vettore riga con n colonne dove gli elementi sono casuali ma appartengono al tuo intervallo [a,b]; se non è chiaro cerco di spiegartelo... ricorda che rand restituisce un valore tra 0 e 1; ultima cosa: io l'ho pensato così ma non sono sicuro vada bene!
grazie lo stesso ma non ho capito bene perchè v(i)=(a+b)/2+((b-a)*(rand-.5)/2);
v(i)=(a+b)/2+((b-a)*(rand-.5)/2);
in realtà mi accorgo ora di un errore...
io pensavo: prendo un numero casuale (questo apparterrà all'intervallo (0,1), puoi verificarlo con l'help di matlab), lo traslo in modo da centrarlo in zero e poi comprimo/dilato a seconda dell'ampiezza del mio intervallo;
l'errore che ho fatto sta nel dividere per 2; se abbiamo un punto $x_0\in[-1,1]$ e vogliamo portarlo in [a,b] basterà fare $x_1=x_0*(b-a)/2$ e così ho scritto quella formula; in realtà il nostro punto non apparteniene a [-1,1] ma a [-0.5, 0.5] quindi devo moltiplicare per due...
v(i)=(a+b)/2+((b-a)*(rand-.5));
grazie dell'osservazione... se c'è qualcos'altro dimmi pure!!
in realtà mi accorgo ora di un errore...
io pensavo: prendo un numero casuale (questo apparterrà all'intervallo (0,1), puoi verificarlo con l'help di matlab), lo traslo in modo da centrarlo in zero e poi comprimo/dilato a seconda dell'ampiezza del mio intervallo;
l'errore che ho fatto sta nel dividere per 2; se abbiamo un punto $x_0\in[-1,1]$ e vogliamo portarlo in [a,b] basterà fare $x_1=x_0*(b-a)/2$ e così ho scritto quella formula; in realtà il nostro punto non apparteniene a [-1,1] ma a [-0.5, 0.5] quindi devo moltiplicare per due...
v(i)=(a+b)/2+((b-a)*(rand-.5));
grazie dell'osservazione... se c'è qualcos'altro dimmi pure!!
"andreo":
v(i)=(a+b)/2+((b-a)*(rand-.5)/2);
in realtà mi accorgo ora di un errore...
io pensavo: prendo un numero casuale (questo apparterrà all'intervallo (0,1), puoi verificarlo con l'help di matlab), lo traslo in modo da centrarlo in zero e poi comprimo/dilato a seconda dell'ampiezza del mio intervallo;
l'errore che ho fatto sta nel dividere per 2; se abbiamo un punto $x_0\in[-1,1]$ e vogliamo portarlo in [a,b] basterà fare $x_1=x_0*(b-a)/2$ e così ho scritto quella formula; in realtà il nostro punto non apparteniene a [-1,1] ma a [-0.5, 0.5] quindi devo moltiplicare per due...
v(i)=(a+b)/2+((b-a)*(rand-.5));
grazie dell'osservazione... se c'è qualcos'altro dimmi pure!!
non riesco a seguirti: nell esercizio l'intervallo è formato da a e b che devono essere presi a caso, non tra 0 e 1 e credo la funzione debba dipendere dall'intervallo scelto
Sì certo, la funzione rand restituisce valori nell'intervallo (0,1).
Noi vogliamo che i nostri valori siano in [a,b]; per fare questo traslo l'intervallo dei numeri rand in -1,1; per farlo uso (rand-.5)*2
successivamente ho dilatato i valori su un intervallo della stessa ampiezza di quello cercato (cioè [a,b]) centrato però in 0; per farlo ho usato ((b-a)/2)*(rand-.5)*2
infine ho traslato i valori in modo che l'intervallo a cui appartengono (di ampiezza b-a) abbia centro in (a+b)/2; per farlo ho sommato (a+b)/2 a quello di prima;
Spero di essere stato d'aiuto!
Noi vogliamo che i nostri valori siano in [a,b]; per fare questo traslo l'intervallo dei numeri rand in -1,1; per farlo uso (rand-.5)*2
successivamente ho dilatato i valori su un intervallo della stessa ampiezza di quello cercato (cioè [a,b]) centrato però in 0; per farlo ho usato ((b-a)/2)*(rand-.5)*2
infine ho traslato i valori in modo che l'intervallo a cui appartengono (di ampiezza b-a) abbia centro in (a+b)/2; per farlo ho sommato (a+b)/2 a quello di prima;
Spero di essere stato d'aiuto!
ok allora ricapitolando:
function v=random(a,b,n)
v=zeros(1,n)
for i=1:n
v(i)=(a+b)/2+((b-a)/2*(rand 0.5)*2)
end
questo per costruire il vettore
invece per disegnare il grafico di $a^3-(cos(a)/(|a|+1))$ con a preso a caso(deve essere lo stesso valore scelto nel vettore) tra $[a,b]$ va bene se faccio:
n=100
h=(b-a)/n
x=[]
y=[]
x(a)=a
y(a)= $a^3-(cos(a)/(|a|+1))$
for i=0:n
x(i)=a+i*h
x=[X x]
y(i)=$a^3-(cos(a)/(|a|+1))$
y=[Y y]
end
plot (x,y)
function v=random(a,b,n)
v=zeros(1,n)
for i=1:n
v(i)=(a+b)/2+((b-a)/2*(rand 0.5)*2)
end
questo per costruire il vettore
invece per disegnare il grafico di $a^3-(cos(a)/(|a|+1))$ con a preso a caso(deve essere lo stesso valore scelto nel vettore) tra $[a,b]$ va bene se faccio:
n=100
h=(b-a)/n
x=[]
y=[]
x(a)=a
y(a)= $a^3-(cos(a)/(|a|+1))$
for i=0:n
x(i)=a+i*h
x=[X x]
y(i)=$a^3-(cos(a)/(|a|+1))$
y=[Y y]
end
plot (x,y)
mi da errore in questa riga come mai?
v(i)=((a+b)/2)+((b-a)/2)*((rand 0.5)*2)
e mi da errore anche nel primo:
s=0
for i=1000:2000
if rem(i,9)==0;
s=s+i^2;
end
end
mi sembra di non aver sbagliato
v(i)=((a+b)/2)+((b-a)/2)*((rand 0.5)*2)
e mi da errore anche nel primo:
s=0
for i=1000:2000
if rem(i,9)==0;
s=s+i^2;
end
end
mi sembra di non aver sbagliato
cominciamo dagli errori;
la riga v(i)=((a+b)/2)+((b-a)/2)*((rand - 0.5)*2) è sbagliata perchè manca il meno (che ti ho messo in rosso)
per il secondo, a me non dà errore, ho provato a utilizzare proprio quello che hai scritto nel messaggio precedente, l'unica nota è che ti restituisce il valore zero perchè non hai messo il ; dopo s=0 e perchè non abbiamo messo dopo il ciclo for qualcosa come display(s); se ti dà errore magari è perchè provi usare il valore che ti restituisce come un numero (magari facendo altre operazioni) ma questo lo puoi fare solo definendo una function.
Per il grafico sinceramente non capisco la richiesta: se il valore a è un numero che prendiamo a caso allora otterremo la funzione costante...nel tuo algoritmo invece non è preso a caso sono tutti valori equispaziati dell'intervallo [a,b].
la riga v(i)=((a+b)/2)+((b-a)/2)*((rand - 0.5)*2) è sbagliata perchè manca il meno (che ti ho messo in rosso)
per il secondo, a me non dà errore, ho provato a utilizzare proprio quello che hai scritto nel messaggio precedente, l'unica nota è che ti restituisce il valore zero perchè non hai messo il ; dopo s=0 e perchè non abbiamo messo dopo il ciclo for qualcosa come display(s); se ti dà errore magari è perchè provi usare il valore che ti restituisce come un numero (magari facendo altre operazioni) ma questo lo puoi fare solo definendo una function.
Per il grafico sinceramente non capisco la richiesta: se il valore a è un numero che prendiamo a caso allora otterremo la funzione costante...nel tuo algoritmo invece non è preso a caso sono tutti valori equispaziati dell'intervallo [a,b].
per il grafico deve prendere lo stesso valore a usato nella function e trovare il grafico dell'equazione $a^3-cos(a)/(|a|+1)$
per l'esercizio della somma dei quadrati ho trovato anche questa soluzione:
i=1000
s=0
while rem(i,9)==0
s=s+i^2
i=i+1
end
disp(s)
è corretta?
i=1000
s=0
while rem(i,9)==0
s=s+i^2
i=i+1
end
disp(s)
è corretta?
No, se usi così il ciclo while è come se gli dicessi "fai le operazioni che scrivo sotto fino a che non trovi un numero che sia divisibile per nove". Attento è molto diverso da quello che volevi.... tu volevi considerare solo quelli divisibili per nove (non tutti) e inoltre volevi andare avanti fino a 2000!!
in questo caso non mi sembra utile scomodare il ciclo while; mi pare più semplice con il for e con un controllo if come lo avevamo fatto prima;
Ne approfitto per spigarti i miei dubbi sul grafico.... facciamo la nostra function per trovare i numeri casuali nell'intervallo, ora prendiamo uno di questi numeri e lo chiamiamo a; poi vogliamo calcolare la tua funzione nel punto a il che mi restituisce un valore; se poi disegnamo quanto ottenuto avremo una retta orizzontale che al variare di x ci darà sempre l'unico valore che abbiamo calcolato! non credo sia veramente così l'esercizio.... se vuoi possiamo disegnare la funzione come una funzione nella variabile a oppure dati n punti casuali cerchiamo di tracciare il grafico partendo da questi (ma 2 mi sembrano un po' pochi)
in questo caso non mi sembra utile scomodare il ciclo while; mi pare più semplice con il for e con un controllo if come lo avevamo fatto prima;
Ne approfitto per spigarti i miei dubbi sul grafico.... facciamo la nostra function per trovare i numeri casuali nell'intervallo, ora prendiamo uno di questi numeri e lo chiamiamo a; poi vogliamo calcolare la tua funzione nel punto a il che mi restituisce un valore; se poi disegnamo quanto ottenuto avremo una retta orizzontale che al variare di x ci darà sempre l'unico valore che abbiamo calcolato! non credo sia veramente così l'esercizio.... se vuoi possiamo disegnare la funzione come una funzione nella variabile a oppure dati n punti casuali cerchiamo di tracciare il grafico partendo da questi (ma 2 mi sembrano un po' pochi)
l'esercizio non è molto chiaro, io l'ho interpretato di calcolare il grafico nell'estremo $a$ dell'intervallo