[C++] Approssimare valore di exp(x)

N56VZ
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?

Risposte
vict85
Dovresti usare il tag code e non il tag note... Ad esempio:
[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.

N56VZ
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

vict85
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} \)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.