PDA

Visualizza la versione completa : [C] valutazione di tanx con sviluppo di taylor


l&lab
04-07-2013, 10:42
Ciao a tutti, qualcuno mi puņ dare delle dritte? Devo trovare il valore della funzione tangente con angolo noto. Ho provato prima a farlo solo per cosx e mi viene:



#include <stdio.h>
#include <math.h>

float cosine(float, float);

int main()
{


float ang,rad,acc;

ang=10;

rad=((ang*3.141592)/180);
acc=4;
printf("Programma per il calcolo del coseno di un angolo\n");
printf("mediante sviluppo in serie di Taylor\n");



printf("Il coseno di %f vale %f\n",ang,cosine(rad,acc));
#ifdef DEBUG
printf("Per confronto la funzione di libreria fornisce il valore %f\n",
cos(rad));
#endif
system("PAUSE");
return 0;
}

float cosine(float rad, float acc)
{
float previsto, corrente, x;
int nfatt=1, sign=1;
int n, nmax=120;


previsto = 1;
x = 1;

for (n=1; n<nmax; n++)
{
nfatt = nfatt*(2*n)*(2*n-1);
sign = sign*(-1);
x = x*rad*rad;
corrente = previsto + (sign*x)/nfatt;
if ( fabs(previsto - corrente) < fabs(acc) ) return corrente;
previsto = corrente;
}

printf("Numero massimo di cicli superato\n");
return corrente;
}


poi ho provato con senx, ma il risultato non so per quale motivo non viene:


#include <stdio.h>
#include <math.h>


float senine(float,float);

int main()
{
float ang,rad,acc;

ang=10;

rad=((ang*3.141592)/180);
acc=4;

printf("Programma per il calcolo di sen(10)\n");
printf("con sviluppo in serie di Taylor\n");
printf("il seno di 10 vale %f\n",ang,senine(rad,acc));
#ifdef DEBUG
printf("Per confronto la funzione di libreria fornisce il valore %f\n",
sen(ang));
#endif

system("PAUSE");
return 0;
}

float senine(float rad, float acc)
{

float pre, cur, y, z;
int fatt=1, segn=1;
int m, ntot=70;

pre = 1;
y=1;
z=1;
for (m=1; m<ntot; m++)
{
fatt = fatt*(2*m+1)*(2*m);
segn = segn*(-1);
y=y*rad*rad;
z=y*rad;
cur = pre + (segn*z)/fatt;
if ( fabs(pre - cur) < fabs(acc) ) return cur;
pre = cur;

}
}

per ultimo ho provato a d unirli per ricavare la tangente tramite senx/cosx....ma non so come implementare tan=senx/cosx:


#include <stdio.h>
#include <math.h>

float coseno(float,float);
float seno(float,float);

int main()
{
float ang,rad,acc,tan;

ang=10;
rad=((ang*3.141592)/180);
acc=4;
tan=(seno(rad,acc)/coseno(rad,acc));
printf("Programma per il calcolo della tangente di 10 gradi sessagesimali\n");
printf("mediante sviluppo in serie di Taylor\n");


printf("la tangente di 10 vale %f\n",tan);

system("PAUSE");
return 0;
}

float coseno(float rad, float acc)
{
float prev, curr, x;
int nfatt=1, sign=1;
int n, nmax=70;

prev = 1;
x = 1;

for (n=1; n<nmax; n++)
{
nfatt = nfatt*(2*n)*(2*n-1);
sign = sign*(-1);
x = x*rad*rad;
curr = prev + (sign*x)/nfatt;
if ( fabs(prev - curr) < fabs(acc) ) return curr;
prev = curr;
}
printf("Numero massimo di cicli superato\n");
return curr;
}



float seno(float rad, float acc)
{
float pre, cur, y, z;
int fatt=1, segn=1;
int m, ntot=70;

pre = 1;
y=1;
z=1;
for (m=1; m<ntot; m++)
{
fatt = fatt*(2*m+1)*(2*m);
segn = segn*(-1);
y=y*rad*rad;
z=y*rad;
cur = pre + (segn*z)/fatt;
if ( fabs(pre - cur) < fabs(acc) ) return cur;
pre = cur;
}
printf("Numero massimo di cicli superato\n");
return cur;
}


mi potete aiutare?? :)

MItaly
05-07-2013, 15:55
Benvenuto sul forum! :) Ti ricordo che:

il codice va specificato tra tag
... , altrimenti perde l'indentazione;
il linguaggio di riferimento va sempre specificato (anche nel titolo, sotto forma di "tag").


Ora correggo io (e mi sono permesso di sistemare l'indentazione, il codice era davvero poco leggibile), in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).
:ciauz:

Loading