PDA

Visualizza la versione completa : [C] Derivata polinomio


slashino
10-12-2011, 19:12
Salve,
ho scritto questa funzione che data una matrice contenente i coefficienti di un certo numero di polinomi di terzo grado ( disposti come vettori riga ) ne calcoli la derivata, ovvero riempia un'altra matrice con i coefficienti del polinomio derivato.Purtroppo mi da valori sbagliati, per esempio la derivata di x^3 = 0 :( Vi posto il codice :


void derivata(int mat[][c],float deriv[][c], int r)
{
int i,k;
int z;
for(i=0;i<r;i++)
{
z=3;
for(k=0;k<c;k++)
{
deriv[i][k]=z*mat[i][k];
z=z-1;
}
}
}

Ps: questa solo una parte di un programma, suppongo che l'errore stia qui dal momento che le altre funzioni sembrano funzionare bene ( legge il vettore e dopo aver calcolato la derivata ne calcola le soluzioni ).

oregon
10-12-2011, 19:23
Perch la matrice di partenza di interi e la derivata di float ?

slashino
10-12-2011, 19:56
perch poi successivamente devo calcolare le soluzioni operando sui coefficienti che stanno nella matrice della derivata...e le soluzioni possono essere anche float..se vuoi posso postare tutto il programma!

oregon
10-12-2011, 19:59
Ma i coefficienti dei polinomi non possono essere float ?

Ad esempio 2/3 ?

slashino
10-12-2011, 20:11
Nella mia versione del programma ho imposto che siano interi...

oregon
10-12-2011, 20:13
Originariamente inviato da slashino
Nella mia versione del programma ho imposto che siano interi...

Ah ... ok.

Ma il codice della funzione che hai proposto segue un algoritmo che, secondo te, corretto?

Non ho una precisa idea di quale regola tu abbia implementato con quei cicli ma se corretta "teoricamente" allora si d un'occhiata al codice altrimenti da rivedere l'algoritmo ...

slashino
10-12-2011, 20:16
L'algoritmo sembra essere corretto. Ho fatto anche una simulazione su carta e funziona bene...penso debba essere un problema di codice!


#include<stdio.h>
#include<stdlib.h>
#define c 4
#define m 30
#include<math.h>
int lettura(int mat[][c]);
void derivata(int mat[][c], float deriv[][c],int r);
void caccolo(float soluzioni[][2], float deriv[][c], int r);
void stampa( int mat[][c], float deriv[][c], float soluzioni[][2], int r);


main()
{
int colonne,righe;
int prima[m][c], matder[m][c];
float zeri[m][2], dopo[m][c];;
righe=lettura(prima);
derivata(prima, dopo, righe);
caccolo(zeri,dopo,righe);
stampa(prima, dopo, zeri, righe);
system("pause");






}


int lettura(int mat[][c])
{
int r,i,k;
printf("Inserire il numero di polinomi\n");
scanf("%d", &r);
printf("inserire i coefficienti del polinomio di terzo grado\n");
for(i=0;i<r;i++)
{
for(k=0;k<c;k++)
{
scanf("%d", &mat[i][k]);
}
}
return r;
}

void derivata(int mat[][c],float deriv[][c], int r)
{
int i,k;
int z;
for(i=0;i<r;i++)
{
z=3;
for(k=0;k<c;k++)
{
deriv[i][k]=z*mat[i][k];
z=z-1;
}
}
}

void caccolo(float soluzioni[][2], float deriv[][c], int r)
{
int i,k;
float delta;
for(i=0;i<r;i++)
{
delta=(deriv[i][1]*deriv[i][1])-4*(deriv[i][0]*deriv[i][2]);
if(delta<0)
{
soluzioni[i][0]=0;
soluzioni[i][1]=0;
}
else
{
if(delta>0)
{
soluzioni[i][0]=(deriv[i][1]*(-1)-sqrt(delta))/(2*deriv[i][0]);
soluzioni[i][1]=(deriv[i][1]*(-1)+sqrt(delta))/(2*deriv[i][0]);
}
else
{
soluzioni[i][0]=(deriv[i][1]*(-1))/(2*deriv[i][0]);
soluzioni[i][1]=(deriv[i][1]*(-1))/(2*deriv[i][0]);
}
}
}
}

void stampa( int mat[][c], float deriv[][c], float soluzioni[][2], int r)
{
int i;
for(i=0;i<r;i++)
{
printf("Polinomio di terzo grado\t");
printf("(%d)x^3+(%d)x^2+(%d)x+(%d)\n", mat[i][0],mat[i][1],mat[i][2],mat[i][3]);
printf("Derivata prima:\t");
printf("(%d)x^2+(%d)x+(%d)\n", deriv[i][0],deriv[i][1],deriv[i][2]);
if(((deriv[i][1]*deriv[i][1])-4*(deriv[i][0]*deriv[i][2]))>=0)
{
printf("Le soluzioni sono:\t");
printf("%f %f", soluzioni[i][0], soluzioni[i][1]);

}
else
{
printf("Non ci sono massimi e minimi\n");
}
}
}


Non far caso al nome della funzione "caccolo " xD

Loading