Una premessa: la prossima volta che porrai una domanda, inserisci il codice direttamente come testo (possibilmente all'interno dei tag "code" disponibili nella toolbar) invece che come immagine.
Con riferimento alle tre domande:
1) Non capisco perché matlab, quando devo chiedere all'utente di scrivere un valore n, matlab automaticamente mi restituisce [] come matrice nulla (vedi img)
Le due istruzioni che hai scritto, sono corrette, non capisco perchè risulti n=[]
2) Affinché l'approssimazione del numero di Nepero dia 2,71.... , n deve essere un valore intero positivo e dunque è richiesto di farne un controllo, ma non lo so impostare, cioè so che devo usare la struttura di controllo if and else ma non so come fare.
Di default i "numeri" in MatLab sono di tipo "double" quindi anche se inserisci, ad esempio, "3", MatLab lo considererà come "3.0000",
Esistono anche i tipi "
int8", "
int16", "
int32", "
int64" ed i relativi "unsigned": "
uint8", "
uint16", "
uint32", "
uint64", ma non vengono riconosciuti come validi dalla funzione "
factorial" per cui, anche se facessi un "
cast" del valore in input, questo genererebbe un errore
Di conseguenza, i controlli che puoi fare sono:
[*] verificare che il valore che hai inserito sia positivo
[*] verificar che il valore che hai inserito non abbia "cifre dopo la virgola"
Nel primo caso, la verifica è semplice:
if(n < 0)
Nel secondo caso puoi verificare se sia nulla la differenza tra il valore inserito ed il suo valore arrotondato
if((n-ceil(n)))
La funzione "
input" accetta anche variabili precedentemente calcolate; se, ad esempio. hai precedentemente calcolato
a=sin(pi/3)
alla richiesta dell'input puoi inserire "a".
Analogamente se hai definito "a" come una struttura, puoi inserire come input una struttura.
Lo sesso se hai definito "a" come un cellarray.
Questo per dire che, nel controllo dell'input pupi verificare altre condizioni.
3) E' richiesto un ulteriore controllo riguardo al valore 1/n perché se n è troppo grande e dunque 1/n è troppo piccolo tale da superare il valore dell'eps macchina, allora 1/n non darà più contributo alla sommatoria. Ho scritto la struttura di controllo ma non so perché matlab mi dia errore (vedi img)
Nell'immagine non viene riportato nessun messaggio di errore.
Così come dovresti inserire il codice come testo, dovresti anche inserire (sempre come testo) tutti i messaggi di errore.
Le domande, quindi, sone:
[*] quale messaggio di errore viene generato?
[*] hai provato a debuggare il codice?
[*] in quale iterazione viene generato il messaggio di errore?
[*] quali sono i valori delle variabili al momento della generazione del messaggi di errore?
Con riferimento al codice che hai scritto, qual è il motivo per il quale nell'"if" calcoli il fattoriale di (i-1) e nell'"else" il fattoriale di (i)?
L'istruzione nell'"else" dovrebbe essere semplicemente "break" per interrompere il ciclo for.
Di seguito, una proposta di implementazione dei suggerimenti sopra descritti.
Ho inserito dei commenti all'interno del codice che, spero, chiariscano i vari passaggi.
Fammi sapere se non lo sono e se hai bisogno di chiarimenti.
% Definizione del cellarray contenente i possibili "tipi" dell'input
tipo={'double', 'single', 'logical', 'char', 'int8', 'int16', 'uint8', ...
'uint16', 'int32', 'uint32', 'int64', 'uint64', 'cell', 'struct'};
% Definizione della stringa di testo per la richiesta del valore di input
prompt='Scrivere un valore n intero positivo: ';
% Richiesta del valore di input
n=input(prompt)
% Loop per la verifica della validità dell'input: se l'input non è del tipo
% corretto, la richiesta viene iterata
while(1)
% Identificazione del "tipo" del'input inserito
tipo_in=find(strcmp(tipo,class(n)));
% Controlo della validità dell'input
switch(tipo_in)
% Se è stato inserito un valore di tipo "double" questo viene
% ulteriormente analizzato
case 1
% Se è un vettore, la richiesta viene iterata
if(length(n) ~= 1)
disp('ERRORE: Il valore inserito è un aray')
n=input(prompt)
elseif(n < 0)
% Se è un valore negativo, la richiesta viene iterata
disp('ERRORE: Il valore inserito è negativo')
n=input(prompt)
elseif((n-ceil(n)))
% Se è un valore decimale, la richiesta viene iterata
disp('ERRORE: Il valore inserito è di tipo float')
n=input(prompt)
else
% Se è un valore intero si forza l'uscita dal loop e si passa
% al calcolo del numero di Nepero
break
end
otherwise
% Se il valore di input non è di "tipo "double", la richiesta
% viene iterata
disp(['ERRORE: Il valore inserito è di tipo ' tipo{tipo_in}])
n=input(prompt)
end
end
% Calcolo del numero di Nepero
% Inizializzazione del numero di Nepero
nepero=0;
% Loop sul numero degli elementi della sommatoria
for i=0:n
% Calcolo dell'inverso del fattoriale
inv_fattoriale=1/factorial(i);
% Controllo del valore dell'inverso del fattoriale rispetto a "eps"
if(inv_fattoriale > eps)
nepero=nepero+1/factorial(i);
else
% Se il valore dell'i-esimo elemeto della sommatoria è inferiore a
% "eps" il calcolo viene interrotto
disp(['n= ' num2str(i) ' Raggiunto limite "eps"'])
break
end
end
% Stampa a video del numero di Nepero
fprintf('Numero di nepero= %18.15f\n',nepero);
Hope this helps.