Programma in C per calcolare Sviluppi di Mclaurin e Taylor

magliocurioso
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
lucas14
RIPETO E CONFERMO CHE 6 UN MASOKISTA!!!! :-D

david_e1
Spostato nella sezione "Informatica".

zorn1
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

magliocurioso
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

david_e1
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.... :-D

magliocurioso
Ovviamente mi limiterò solamente agli sviluppi elementari [non sono così masochista da scrivere programmi per sviluppare qualsiasi cosa]

david_e1
Ah ok, quindi intendi memorizzare la formula degli sviluppi delle funzioni piu' elementari e quindi usarla per calcolare i coefficienti?

magliocurioso
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 :(

david_e1
Memorizzi i coefficienti del polinomio fino all'ordine appropriato e poi fai un ciclo di stampa. Tipo:

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.

magliocurioso
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

david_e1
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:

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... :-D).

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

david_e1
"magliocurioso":
Ok no problem :D Stavo 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! :-D Rendono, infatti, il codice meno efficiente...

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

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