Approssimazione numero di Nepero

di il
1 risposte

Approssimazione numero di Nepero

Buon pomeriggio a tutti.

Da Settembre ho iniziato a studiare Matlab e ho difficoltà a far partire un programma che ci ha assegnato la prof. Vi dico che per molti di voi è facile ma per io che sto alle prime armi non lo è xD Il programma è basato sul calcolo del approssimazione del numero di Nepero attraverso la formula:

lim (1+1/n)^n = e
x---> inf

dove n è un qualsiasi valore che l'utente deve mettere e da esso si basa l'approssimazione. Sapendo che matlab non opera con i limiti, allora baso il programma attraverso la sommatoria di 1/n!. Ho riscontrato alcuni problemi:

1) Non capisco perché matlab, quando devo chiedere all'utente di scrivere un valore n, matlab automaticamente mi restituisce [] come matrice nulla (vedi img)

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.

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)

Ringrazio chiunque mi aiuti e buon fine settimana
Allegati:
18444_942dd569e855dc69b540e24fd796b9fe.png
18444_942dd569e855dc69b540e24fd796b9fe.png

1 Risposte

  • Re: Approssimazione numero di Nepero

    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.
Devi accedere o registrarti per scrivere nel forum
1 risposte