[C++] Approssimare valore di exp(x)
Ciao ragazzi vorrei approssimare scegliendo un y a piacere il valore che ha il suo esponenziale in base di nepero, vorrei anche usare come base il programma seguente che ho costruito che per fare il fattoriale.
[nota]#include
#include
#include
int fatt(int i){
int f;
if (i<=0)
return 1;
for (f=1;i>1;i--)
f=f*i;
return f;}
int main(){
int x;
puts("Metti un numero per fare il fattoriale\n");
scanf("%d",&x);
printf("Il fattoriale di %d e':%d\n",x,fatt(x));
system ("PAUSE");
return 0;}[/nota]
Non riesco a formattare il testo come su C++, tuttavia se modifico qualcosa nella funzione fatt alla fine mi da errore e non riesco ad inserire una nuova variabile per approssimare il valore di exp(y). Potreste darmi qualche consiglio utile?
[nota]#include
#include
#include
int fatt(int i){
int f;
if (i<=0)
return 1;
for (f=1;i>1;i--)
f=f*i;
return f;}
int main(){
int x;
puts("Metti un numero per fare il fattoriale\n");
scanf("%d",&x);
printf("Il fattoriale di %d e':%d\n",x,fatt(x));
system ("PAUSE");
return 0;}[/nota]
Non riesco a formattare il testo come su C++, tuttavia se modifico qualcosa nella funzione fatt alla fine mi da errore e non riesco ad inserire una nuova variabile per approssimare il valore di exp(y). Potreste darmi qualche consiglio utile?
Risposte
Dovresti usare il tag code e non il tag note... Ad esempio:
Comunque sinceramente non vedo come ti possa aiutare un codice che fa tutt'altro. Se hai fatto e capito quello allora non vedo impedimenti a portarti le conoscenze acquisite per scrivere un nuovo codice.
Detto questo, che metodo di approssimazione pensavi di usare? Le serie Taylor? Sei consapevole che è un metodo di approssimazione locale, vero? Ma forse, dato il codice che vuoi usare come base, intendi sfruttare il fatto che \(\displaystyle e^{x+y} = e^xe^y \). Potresti anche provare a sfruttare questo per fornire una prima approssimazione.
Per prima cosa dovresti però avere bene in mente il prototipo della funzione. Cioè devi avere ben chiaro i parametri, il valore restituito e i tipi di ogni variabile.
[code]metti qui il codice[/code]
Comunque sinceramente non vedo come ti possa aiutare un codice che fa tutt'altro. Se hai fatto e capito quello allora non vedo impedimenti a portarti le conoscenze acquisite per scrivere un nuovo codice.
Detto questo, che metodo di approssimazione pensavi di usare? Le serie Taylor? Sei consapevole che è un metodo di approssimazione locale, vero? Ma forse, dato il codice che vuoi usare come base, intendi sfruttare il fatto che \(\displaystyle e^{x+y} = e^xe^y \). Potresti anche provare a sfruttare questo per fornire una prima approssimazione.
Per prima cosa dovresti però avere bene in mente il prototipo della funzione. Cioè devi avere ben chiaro i parametri, il valore restituito e i tipi di ogni variabile.
A me interessa semplicemente approssimare il valore di exp(y), so perfettamente che in base a che esponente considererò per esempio n avrò: $ sum_(i = \0) y^i/(i!) $.
Pensavo che potevo modificare leggermente la struttura del fattoriale però non so se sia l'idea migliore
Pensavo che potevo modificare leggermente la struttura del fattoriale però non so se sia l'idea migliore
La formula corretta è \(\displaystyle e^y = \sum_{i = 0}^n \frac{y^{i}}{i!} + R_n(y) \) dove tengo conto dell'errore. Il tuo problema è che \(\displaystyle R_n(y) \) può essere molto grande nel caso in cui \(\displaystyle y\gg 0 \). Per questo stavo suggerendo di usare un metodo che scrivesse \(\displaystyle y = k + r \) con \(\displaystyle k\in \mathbb{Z} \) e \(\displaystyle r \) in \(\displaystyle [0,1) \) e calcolasse infine il risultato con il prodotto.
Il fatto che \(\displaystyle R_n(y) \) sia molto grande significa che bisogna stare molto attenti relativamente a che condizione usare per fermare il ciclo. Inoltre bisognerebbe tenere conto che \(\displaystyle e^{1000} \), per esempio, non è rappresentabile con un double. Ma per questo basta controllare che il numero inserito non sia troppo grande (o fregarsene e sfruttare il fatto che il risultato finare sarebbe infinito). Ma è evidente che si debba comunque controllare le condizioni di fine ciclo.
Riguardo a Taylor è comune tra i principianti calcolare potenza i-esima e fattoriale ad ogni turno. Ma è molto meglio calcolare il valore usando quello precedente, cioè attraverso il seguente fatto banale: \(\displaystyle \frac{y^{i+1}}{(i+1)!} = \frac{y^{i}}{i!}\frac{y}{i+1} \)
Il fatto che \(\displaystyle R_n(y) \) sia molto grande significa che bisogna stare molto attenti relativamente a che condizione usare per fermare il ciclo. Inoltre bisognerebbe tenere conto che \(\displaystyle e^{1000} \), per esempio, non è rappresentabile con un double. Ma per questo basta controllare che il numero inserito non sia troppo grande (o fregarsene e sfruttare il fatto che il risultato finare sarebbe infinito). Ma è evidente che si debba comunque controllare le condizioni di fine ciclo.
Riguardo a Taylor è comune tra i principianti calcolare potenza i-esima e fattoriale ad ogni turno. Ma è molto meglio calcolare il valore usando quello precedente, cioè attraverso il seguente fatto banale: \(\displaystyle \frac{y^{i+1}}{(i+1)!} = \frac{y^{i}}{i!}\frac{y}{i+1} \)