Programma in C per calcolare Sviluppi di Mclaurin e Taylor
Ciao a tutti. Sto cercando di scrivere in linguaggio C [ovviamente uso il KDevelop di Linux Suse 10.2] diversi programmini che, ottenendo in input l'ordine dello sviluppo. stampino a video lo sviluppo di taylor delle funzioni elementari [per intenderci $cosx$, $sinhx$, $e^x$ e le altre]. Qualcuno ha qualche consiglio da darmi? Posso pretendere rigore e formalismo mamatico da un semplice programmino a scopo "didattico" ?
Risposte
RIPETO E CONFERMO CHE 6 UN MASOKISTA!!!!

Spostato nella sezione "Informatica".
Uhm, calcolare derivate di ordine elevato può provocare problemi di stabilità, potresti usare gli sviluppi noti ma non è la strada che usa il calcolatore per calcolare le funzioni elementari
mmmm, dici? Nel mio programmino però dovrei stampare a video seplicemente il polinomio che approssima la funzione. ho già trovato l'algoritmo per calcolarmi i fattoriali. non sò però cosa inventarmi per stampare i vari termini fino all'ordine desiderato
Fammi capire un po' meglio che cosa intendi fare. Vuoi fare un programma che stampa a video gli sviluppi di Taylor di funzioni note, oppure qualche cosa in grado di fare degli sviluppi un po' più articolati come lo sviluppo di $sin(cos(x))$ o di $sin(x) e^{-x}$?
Sui fattoriali occhio che hanno la brutta tendenza a mandare fuori dal range le variabili intere....
Sui fattoriali occhio che hanno la brutta tendenza a mandare fuori dal range le variabili intere....

Ovviamente mi limiterò solamente agli sviluppi elementari [non sono così masochista da scrivere programmi per sviluppare qualsiasi cosa]
Ah ok, quindi intendi memorizzare la formula degli sviluppi delle funzioni piu' elementari e quindi usarla per calcolare i coefficienti?
Io più che altro avevo pensato ad una cosa di questo tipo
all'avvio del programma si chiede all'utente stabilire fino a che ordine intende sviluppare. Se ad esempio il primo programma sviluppa $e^x$ e l'utente immette come ordine di sviluppo 3 il programma stamperà a video
$e^x = 1/(0!) + x/(1!) + x^2/(2!) + o(x^3)$ per $(x->0)$
ho trovato una specie di "algoritmo" per calcolarmi tutti i fattoriali compresi tra [0, n], dove n è l'ordine di sviluppo stabilito dall'utente. Da qui in poi però non sò come andare avanti
all'avvio del programma si chiede all'utente stabilire fino a che ordine intende sviluppare. Se ad esempio il primo programma sviluppa $e^x$ e l'utente immette come ordine di sviluppo 3 il programma stamperà a video
$e^x = 1/(0!) + x/(1!) + x^2/(2!) + o(x^3)$ per $(x->0)$
ho trovato una specie di "algoritmo" per calcolarmi tutti i fattoriali compresi tra [0, n], dove n è l'ordine di sviluppo stabilito dall'utente. Da qui in poi però non sò come andare avanti

Memorizzi i coefficienti del polinomio fino all'ordine appropriato e poi fai un ciclo di stampa. Tipo:
O qualche cosa di un po' piu' esteticamente decente nella stampa...
L'unico guaio e' che numericamente avrai delle grosse approssimazioni numeriche dato il range dei valori in gioco quando si usano i fattoriali.
for(int i=0;i<n;++i) { cout << coeff[i] << " x^" << i << " "; } cout << " + o(x^" << n << ")" << endl;
O qualche cosa di un po' piu' esteticamente decente nella stampa...
L'unico guaio e' che numericamente avrai delle grosse approssimazioni numeriche dato il range dei valori in gioco quando si usano i fattoriali.
io avevo scritto così:
...
long double decimali[o];
for (j=0; j<=o; j++)
{
t = 1;
for (i=1; i<=j; i++)
{
t = t * i;
}
decimali[j] = t;
}
printf("\nLo sviluppo di Taylor di e^x arrestato al %d° ordine vale:\n", o);
printf("\ne^x = ");
for (j=0; j
{
printf(" / %Lf + ", decimali[j]);
}
printf("o(x^%d) per x--->0\n\n", o);
...
però ho il problema di stampare i vari termini x^n
il primo e il secondo termine dello sviluppo temo di doverli fare a parte con cicli if else però mi pare non poco ortodosso
...
long double decimali[o];
for (j=0; j<=o; j++)
{
t = 1;
for (i=1; i<=j; i++)
{
t = t * i;
}
decimali[j] = t;
}
printf("\nLo sviluppo di Taylor di e^x arrestato al %d° ordine vale:\n", o);
printf("\ne^x = ");
for (j=0; j
printf(" / %Lf + ", decimali[j]);
}
printf("o(x^%d) per x--->0\n\n", o);
...
però ho il problema di stampare i vari termini x^n
il primo e il secondo termine dello sviluppo temo di doverli fare a parte con cicli if else però mi pare non poco ortodosso
Ah gia' che avevi detto di farlo in C... io mi sono buttato sul C++... no spiacente di printf e scanf non mi ricordo piu' nulla... Comunque per i primi due termini puoi anche scrivere le istruzioni "a mano" prima dell'if:
una cosa del genere. (Ovviamente i print non si scrivono cosi, ma passamela...
).
print(coeff[0]); print(coeff[1]); for(int i=2;i<o;++i) { .... }
una cosa del genere. (Ovviamente i print non si scrivono cosi, ma passamela...

Ok no problem
Stavo però pensando se c'era un algoritmo un pò più elegante piuttosto che un rude istruzione a mano

"magliocurioso":
Ok no problemStavo però pensando se c'era un algoritmo un pò più elegante piuttosto che un rude istruzione a mano
Puoi mettere un if nel ciclo for, ma non e' il massimo della vita avere gli if annidati nel cicli... mi hanno insegnato a temerli come la morte!

appunto per quello che non sò cosa inventarmi...