PDA

View Full Version : [C] Algoritmo Di Horner


dengel_1
26-04-2007, 19:13
2 domande..

Allora il programma deve prendere in input grado massimo del polinomio,valore max,minimo e scarto e stampare il ciclo in questo modo:ES

Grado Max: 2
Coeff di x^2:2
Coeff di x^1:3
Coeff di x^0:2

Il polinomio ha questa forma: 2x^2+3x^1+2x^0

Prima domanda: E'Possibile togliere quell' x^0 che è inutile e lasciare +2?

Poi il programma prosegue...ES:
Inserire Valore Iniziale:3
Inserire Valore Finale: 10 x
Scarto: 4 allora stamperà:========> 3(val iniziale)
7(+ 4 perchè è lo scarto)
10(arrivo)

Ora devo stampare la colonna della y i cui valori saranno i risultati che si otterranno sostituendo le x al polinomio
ES:iniziamo con 3: 2x^2+3x^1+2x^0=2*9+3*3+2=29

2° Domanda: Come faccio a sostituire questi valori alla x???

Vi posto il source code

/* Tabulazione di un polinomio con l'argoritmo di Horner: Immettere da tastiera
il grado max di un polinomio,immettere ordinatamente i coeff delle potenze
di x, immettere il valore minimo e massimo di x con l'incremento di x.*/

#include <stdio.h>
#include <conio.h>
#define DIM 20
void main(void){

int grado,i,flag;
int inc,max,min;
int n[DIM];


do
{
clrscr();
printf ("\nInserire grado massimo del polinomio: ");
scanf("%d",&grado);


for ( i=0; i<grado+1; i++)
{
printf("\nCoefficiente di x^ %d: ",grado-i);
scanf ("%d", &(n[i]));
}

printf("\n Il polinomio avra la seguente forma: ");


for ( i=0; i<grado+1; i++)
{
printf("+");

printf("%dx^%d",n[i],grado-i);
}


printf("\nInserire Valore Iniziale ==> ");
scanf("%d",&min);

printf("\nInserire Valore Finale ==> ");
scanf("%d",&max);

printf("\nInserire Valore Scarto ==> ");
scanf("%d",&inc);

for (i=min; i<=max; i=i+inc){
printf("\n [%d]",i);

}


} while(flag == 's');
getch();
}

wingman87
26-04-2007, 19:59
Prima domanda: E'Possibile togliere quell' x^0 che è inutile e lasciare +2?
basta che controlli se grado-i==0 e in quel caso scrivi solo n[i]


2° Domanda: Come faccio a sostituire questi valori alla x???

ad esempio:
float f=0;
int j;

for (i=min; i<=max; i=i+inc){
for(j=0;j<=grado;j++)
f=f+n[j]*pow(i,grado-j);
//stampi il ris

f=0;
}

Ps: non ho guardato cosa sia l'algoritmo di Horner, quindi non so se sta soluzione può andar bene

dengel_1
27-04-2007, 12:55
Ho applicato quello che mi hai detto

for (i=min; i<=max; i=i+inc){
for(j=0;j<=grado;j++){
f=f+n[j]*pow(i,grado-j);
printf("\n [%f]",f); }
f=0; }

Ma mi stampa il ciclo della x normalmente e poi delle y in questo modo ES

Polinomio: 2x^2+1x^1+1 ES con 1: 2*1^2+1*1^1+1=4 con 6: 2*6^2+1*6^1+1=79

Dovrebbe stampare solo 4 e 79 ma invece 6 valori di cui 2 corretti..ci siamo quasi :)
1 =====> 2.0
6 =====> 3.0

e altri valori 4.0 72.00 78.00 79.00(ovviamente in verticale)

shinya
27-04-2007, 15:23
Posto che non penso di aver capito bene il tuo problema, il codice mostrato non mi sembra vada bene se l'esercizio consiste nell'applicare lo schema di horner.

Lo schema di horner si può riassumere all'incirca così: dato un polinomio tipo

a1*x^3 + a2*x^2 + a3*x + a4 (questo è di grado 3 per fare un esempio)

invece di valutarlo nel modo in cui lo scrivi, cioè elevando a potenza, sommando e moltiplicando, lo valuti cosi:

((((a1*x+a2)*x+a3)*x+a4

il programma che ne risulta per valure il polinomio per una certa x è (pseudo-all'incirca):

result = a1;
for i = a2 to aN
result = result * x + ai
end
print result


Si usa spesso per convertire un numero da una base x a base 10, perchè si valutano solo n moltiplicazioni e n addizioni.

wingman87
27-04-2007, 23:48
Ho applicato quello che mi hai detto



Ma mi stampa il ciclo della x normalmente e poi delle y in questo modo ES

Polinomio: 2x^2+1x^1+1 ES con 1: 2*1^2+1*1^1+1=4 con 6: 2*6^2+1*6^1+1=79

Dovrebbe stampare solo 4 e 79 ma invece 6 valori di cui 2 corretti..ci siamo quasi :)
1 =====> 2.0
6 =====> 3.0

e altri valori 4.0 72.00 78.00 79.00(ovviamente in verticale)
Perchè hai riscritto male il mio codice (quando posti del codice usa il tag CODE invece del QUOTE). Se noti nel mio codice non ho messo le graffe nel for più interno.
Comunque come ti avevo detto non ho neanche guardato in cosa consiste l'algoritmo di horner, ho semplicemente calcolato come si farebbe normalmente. Ora rifallo come ti ha detto shinya.

dengel_1
28-04-2007, 12:09
No il tuo codice è giusto..c'erano delle parentesi in + :stordita: