Pages: [1]   Go Down
Print
Author Topic: esercizio e^x (n. di nepero elevato alla x)  (Read 16696 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« on: 20-11-2010, 11:57:27 »

salve ragazzi tentando di fare questo esercizio (non sono programmatore) mi sono venuti dei dubbi..
se non ho capito male dovevamo coistruire la funzione asponenziale del numero di nepero^x fino a quando non fosse minore  ad un numero epsilon
che era uguale a 10^-10...

funzione esponenziale di nepero:

Link Immagine (credo sia questa)

ma la funzione esponenziale di nepero non dovrebbe fare 2.71... ecc ecc??

mentre 10^-10  fa 0.0000000001

quindi non potrebbe mai  essere minore!!

forse ho capito male io.. non saprei XD.. alcuni dicono che la x era a nostro piacimento... ma è peggio ancora
« Last Edit: 20-11-2010, 12:05:37 by Chuck_son » Logged

Aliens Exist
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 20-11-2010, 12:26:17 »

Credo che vi sia stato chiesto di implementare il calcolo del numero di Nepero a partire proprio da quella serie
e=\sum^{\infty}_{n=0}{\frac{1}{n!}}
incrementando il risultato parziale aggiungendo un nuovo termine della serie, fino a che la differenza tra il numero in sè che Java offre (Math.E) e il parziale trovato non sia minore di quella soglia (10^{-10}).

Qualcosa del genere:

fattoriale := 1
indice     := 0
mioNepero  := 0

MENTRE |mioNepero - Math.E| \ge 0.0000000001 ALLORA
    mioNepero  := mioNepero + (1 / fattoriale)
    indice     := indice + 1
    fattoriale := fattoriale * indice

RETURN mioNepero


Quello che vi è stato introdotto come epsilon ha una sua dignità tutta speciale: è chiamato "Epsilon Macchina" e rappresenta il più piccolo valore (in valore assoluto) rappresentabile tramite numero a virgola mobile in una particolare macchina (virtuale, in questo caso, cioè nella JVM). Non è difficile da capire, ma vi verrà spiegato bene nel corso di Formazione Numerica (se esisterà ancora nel vostro piano di studi boh!)

Ma potrei avere completamente malinteso il testo dell'esercizio (non è chiaro in effetti da come è stato spiegato boh)
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #2 on: 20-11-2010, 12:31:25 »

allora noi avevamo nepero elevato alla x:    n^x    la sua sommatoria doveva prima o poi essere minore di questo epsilon... e dovevamo stampare a video quale fosse questo numero..


a noi nepero alla x era stato presentato cosi :   1+  (x/1!) + (x^2/2!) ... e cosi via
« Last Edit: 20-11-2010, 12:33:40 by Chuck_son » Logged

Aliens Exist
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 20-11-2010, 12:52:55 »

In effetti, \fs{3}e=e^1 come caso particolare della più generale formula: \fs{6}e^x=\sum^\infty_{n=0}{\frac{x^n}{n!}}
ponendo appunto x=1.

In tal caso non ti dovrebbe essere difficile modificare il precedente pseudo-codice che ti ho dato per adattarlo a questa variante ...
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #4 on: 20-11-2010, 13:05:29 »

allora io l'ho fatto cosi... ma mi stampa sempre 0.0 ... che palle hahha  

final double EPSILON=Math.pow(10,(-10));
      double nepero_x=1;
      int fattoriale=1;
      int n=1;
   
      while (nepero_x>EPSILON)
      {   
         
         
               
         {
            fattoriale++;
            n=fattoriale;
            while (n!=1)  {fattoriale=fattoriale*(n-1);n--;}
            nepero_x=(1/fattoriale);
            
         }
         
e poi ovviamente la stampa di nepero_x
Logged

Aliens Exist
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #5 on: 20-11-2010, 13:18:22 »

allora noi avevamo nepero elevato alla x:    n^x    la sua sommatoria doveva prima o poi essere minore di questo epsilon... e dovevamo stampare a video quale fosse questo numero..
e^x è una funzione crescente. La sua sommatoria sarà minore di 10^{-10} solo per valori molto negativi di x...

Non è che forse vi è stato chiesto di verificare quale fra i termini della sommatoria \frac{x^n}{n!} (e non la sommatoria in sè) è minore di 10^{-10}, piuttosto che di calcolare e stesso ?

Te lo chiedo perché il codice che hai esposto (anche se c'è qualche errore non banale) sembra calcolare questo
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #6 on: 20-11-2010, 13:27:17 »



Non è che forse vi è stato chiesto di verificare quale fra i termini della sommatoria \frac{x^n}{n!} (e non la sommatoria in sè) è minore di 10^{-10}, piuttosto che di calcolare e stesso ?



ahhah allora a questo punto non saprei neppure io... allora il codice che ho scritto io l'ho inteso come incremento solo del fattoriale...  perche secondo il mio ragionamento se facevo la sommatoria non arrivava mai minore a epsilon  ok hhaah forse sto sbagliando tutto non saprei ahha

« Last Edit: 20-11-2010, 13:29:06 by Chuck_son » Logged

Aliens Exist
Vilelm
Matricola
*
Offline Offline

Gender: Male
Posts: 13



« Reply #7 on: 20-11-2010, 16:32:12 »

Non ho presente il testo dell'esercizio, ma da quanto ho capito una cosa del genere dovrebbe funzionare:
Code:
import javax.swing.*;

public class Nepero
{
public static void main(String[]args)
{
double nepero=0;
double elemento=1;
final double EPSILON=Math.pow(10,(-10));
int fattoriale=1;
int n=0;
int x=0;


x=Integer.parseInt(JOptionPane.showInputDialog("Inserisci x: "));

while(elemento>EPSILON)
{
nepero+=elemento;
fattoriale*=++n;
elemento=Math.pow(x,n)/fattoriale;
}
System.out.println("e^"+x+"= "+nepero);
}
}

Praticamente calcoca e^x ciclando fin quando l'elemento n della serie non diventa minore di epsilon=10^-10
Logged
SkyWolf
Matricola
*
Offline Offline

Gender: Male
Posts: 90



« Reply #8 on: 21-11-2010, 03:07:49 »

L'esercizio diceva esattamente di approssimare il valore di e^x tramite la Serie di Taylor (o come cappero si chiama xD), finchè l'ennesimo valore della detta serie non assumeva un valore molto piccolo (io ad esempio ho scritto 10E-10, ma potrebbe anche essere stato 10E-9) e di confrontare il valore ottenuto con l'e^x calcolato usando il valore del numero di Nepero restituito dall'apposita costante matematica contenuta nella libreria Math.

Il codice per la risoluzione del problema è il seguente:

(ovviamente mancano tutta una serie di controlli per x negativo, zero, e così via, però la base è questa)
Code:
import javax.swing.JOptionPane;
public class SerieDiTaylor {
public static void main(String []args) {
int n = 0, b = 0;
double x = 0, passo = 0, approssimazione = 0;
long fattoriale;

try {
x = Double.parseDouble(JOptionPane.showInputDialog("Inserisci il numero \"x\" per cui approssimare la funzione Math.pow(Math.E,x);:"));
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null,"Numero inserito non valido, l'esecuzione del programma verrà terminata.");
System.exit(0);
}

do {
fattoriale = 1;
b = n;
while (b > 0) {
fattoriale *= b;
b--;
}
passo = Math.pow(x,n) / fattoriale;
approssimazione += passo;
n++;
} while (passo > 10E-10);
JOptionPane.showMessageDialog(null,"L'approssimazione della funzione Math.pow(Math.E,x);, per x=" + x + " attraverso la Serie di Taylor è risultata essere:\n" + approssimazione + "\nmentre la funzione vera e propria ha restituito:\n" + Math.pow(Math.E,x) + "\nl'errore d'approssimazione è stato pertanto di:\n" + Math.abs(Math.pow(Math.E,x) - approssimazione));
System.exit(0);
}
}

l'unico neo riscontrato è il non funzionamento per alcuni valori numerici, che tendono a far sballare qualche variabile facendo sbagliare il calcolo all'intero programma.

Infatti (ad esempio) per x=100 la funzione d'approssimazione restituirà -2.302.............E23 e il numero negativo probabilmente (anche se non ho fatto le dovute prove) proviene dal fattoriale che (long) è soggetto al complemento a due e quindi ad arrivare ad assumere valori negativi.

Saluti,
Danilo.

EDIT:
Infatti, confermo; questo è l'andamento del fattoriale:
1
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
-4249290049419214848
che ovviamente farà cambiare segno a tutta la sommatoria.

EDIT2:
e anche mettendolo double, sforiamo di brutto il limite consentito, raggiungendo il caro "Infinity".

Saluti.
« Last Edit: 21-11-2010, 03:18:01 by SkyWolf » Logged

Danilo Catalano.
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #9 on: 21-11-2010, 11:43:14 »

L'esercizio diceva esattamente di approssimare il valore di e^x tramite la Serie di Taylor (o come cappero si chiama xD), finchè l'ennesimo valore della detta serie non assumeva un valore molto piccolo (io ad esempio ho scritto 10E-10, ma potrebbe anche essere stato 10E-9) e di confrontare il valore ottenuto con l'e^x calcolato usando il valore del numero di Nepero restituito dall'apposita costante matematica contenuta nella libreria Math.


danilo ma alla fine la sommatoria si doveva fare???
Logged

Aliens Exist
salvin
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 259



« Reply #10 on: 21-11-2010, 14:40:05 »

Usando double per tutto deve funzionare, anche perché la successione della serie  esponenziale converge relativamente presto a 0.per ogni x.
Comunque, non ricalcolare il fattoriale ogni volta, puoi inizializzarlo fuori e moltiplicarlo solo per n, dai un occhiata allo pseudocodice di Reverse sopra.
Poi la condizione dovrebbe essere passo<1E-10 che significa 1*10^{-10}

Nel caso dei double l'epsilon macchina è circa 1E-16, potete provare che sommando fino a 1E-32 non cambia nulla rispetto al sommare fino a 1E-16, cosa che non è vera sommando al contrario, dai valori più piccoli ai più grandi, ma questo lo capirete a numerica.
Logged
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #11 on: 21-11-2010, 15:28:06 »

alla fine ho fatto cosi.. come ero partito..  sembra funzionare

Code:
import javax.swing.*;

public class sommatoria_nepero
{
public static void main (String [] args)
{
double x=Integer.parseInt(JOptionPane.showInputDialog("Inserire valore x"));
final double EPSILON=10E-10;
double nepero_x=1;
double fattoriale=1d;
double n=1;
double i=1;

while (nepero_x>EPSILON)
{

if (fattoriale>1)
{
while (n!=1)  
{fattoriale=fattoriale*(n-1);n--;}

}

nepero_x=(Math.pow(x,i)/fattoriale);
System.out.println(nepero_x + " il fattoriale è "+ fattoriale);
i++;
fattoriale=i;
n=fattoriale;

}

JOptionPane.showMessageDialog(null, "Il numero di Nepero^x < di epsilon "+ ("(") + EPSILON+ (")") + " è:  " + nepero_x);
System.exit(0);
}
}


i risultati sono:
Code:

per x=1

>java -cp . sommatoria_nepero
1.0 il fattoriale è 1.0
0.5 il fattoriale è 2.0
0.16666666666666666 il fattoriale è 6.0
0.041666666666666664 il fattoriale è 24.0
0.008333333333333333 il fattoriale è 120.0
0.001388888888888889 il fattoriale è 720.0
1.984126984126984E-4 il fattoriale è 5040.0
2.48015873015873E-5 il fattoriale è 40320.0
2.7557319223985893E-6 il fattoriale è 362880.0
2.755731922398589E-7 il fattoriale è 3628800.0
2.505210838544172E-8 il fattoriale è 3.99168E7
2.08767569878681E-9 il fattoriale è 4.790016E8
1.6059043836821613E-10 il fattoriale è 6.2270208E9
>Exit code: 0


per x=5

5.0 il fattoriale è 1.0
12.5 il fattoriale è 2.0
20.833333333333332 il fattoriale è 6.0
26.041666666666668 il fattoriale è 24.0
26.041666666666668 il fattoriale è 120.0
21.70138888888889 il fattoriale è 720.0
15.500992063492063 il fattoriale è 5040.0
9.68812003968254 il fattoriale è 40320.0
5.3822889109347445 il fattoriale è 362880.0
2.6911444554673722 il fattoriale è 3628800.0
1.2232474797578965 il fattoriale è 3.99168E7
0.5096864498991235 il fattoriale è 4.790016E8
0.19603324996120136 il fattoriale è 6.2270208E9
0.07001187498614334 il fattoriale è 8.71782912E10
0.02333729166204778 il fattoriale è 1.307674368E12
0.007292903644389931 il fattoriale è 2.0922789888E13
0.0021449716601146854 il fattoriale è 3.55687428096E14
5.958254611429682E-4 il fattoriale è 6.402373705728E15
1.5679617398499165E-4 il fattoriale è 1.21645100408832E17
3.919904349624791E-5 il fattoriale è 2.43290200817664E18
9.333105594344741E-6 il fattoriale è 5.109094217170944E19
2.1211603623510775E-6 il fattoriale è 1.1240007277776077E21
4.6112181790240806E-7 il fattoriale è 2.585201673888498E22
9.606704539633503E-8 il fattoriale è 6.204484017332394E23
1.921340907926701E-8 il fattoriale è 1.5511210043330984E25
3.6948863613975003E-9 il fattoriale è 4.032914611266057E26
6.842382150736113E-10 il fattoriale è 1.0888869450418352E28
« Last Edit: 21-11-2010, 15:44:18 by Chuck_son » Logged

Aliens Exist
salvin
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 259



« Reply #12 on: 21-11-2010, 16:19:17 »

Adesso prova a leggere cosa ho scritto e a sistemare tutti i restanti errori...
Logged
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #13 on: 21-11-2010, 16:23:02 »

Adesso prova a leggere cosa ho scritto e a sistemare tutti i restanti errori...

è il massimo che posso fare hahaha
Logged

Aliens Exist
SkyWolf
Matricola
*
Offline Offline

Gender: Male
Posts: 90



« Reply #14 on: 21-11-2010, 17:32:26 »

Comunque, non ricalcolare il fattoriale ogni volta, puoi inizializzarlo fuori e moltiplicarlo solo per n, dai un occhiata allo pseudocodice di Reverse sopra.
Poi la condizione dovrebbe essere passo<1E-10 che significa 1*10^{-10}

Si effettivamente la soluzione di far persistere il fattoriale (moltiplicando ogni volta n) piuttosto che ricalcolarlo ogni volta è sicuramente più efficiente, devo ammettere che non ci avevo pensato boh. Grazie.

E per quanto riguardava la condizione avevo già specificato che non ricordavo di quanto doveva essere la tolleranza, però si fa presto a correggerlo.

Danilo.
Logged

Danilo Catalano.
Pages: [1]   Go Up
Print
Jump to: