Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

dramos21

[Resolvido] Duvida calculo polinomio

Mensagens Recomendadas

dramos21

Boa noite pessoal, eu estou a fazer um trabalho sobre polinomios e gostava de ter a vossa ajuda.

É assim, eu tenho um polinomio, e fiz uma funcao para calcular os pontos de 1 a 20 nesse polinomio.

Desenvolvi uma funcao para fazer isso e fiz um ciclo para percorrer esses 20 pontos de valor 1 a 20.

os primeiros dois pontos têm o valor correcto, a partir do 3, começa a aumentar duma maneira que eu nao percebo o valor.

paplica é o vector onde vao ficar guardados os valores para cada ponto. k é o grau do polinomio.

na main chamei a funcao, e fiz apenas o ciclo de 1 a 20 para imprimir o ponto com o valor calculado à frente para cada um.

void aplicaP2(double p[],double paplica[], int k)
{
   int i,j;
   double termoX=1.0;
   for(j=1; j<=20; j++){
       for(i=0; i<= k; i++){
           paplica[j]=paplica[j] + p[i]*termoX;
           termoX=termoX*j;
       }
   }
   return;
}

Se me conseguirem ajudar de alguma maneira,

Desde já obrigado.

Editado por pmg
Falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O primeiro elemento de cada array tem o indice 0.

No teu snippet, o elemento com indice 0 do array paplica[] nao esta a ser utilizado.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Como assim codificar? eu peço ao utilizador um conjunto de valores para formar um polinomio. na funcao corresponde ao p[k].

e o vector paplica guarda o valor de cada ponto de 1 a 20 aplicado a esse polinomio. nao sei se te ajudei a perceber.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Por exemplo, o polinomio "-3*x^6 + x^2 -100x + 4", como e que o codificas?

Qual o resultado que esperas obter dos 20 valores???


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Como assim codificar? eu peço ao utilizador um conjunto de valores para formar um polinomio. na funcao corresponde ao p[k].

e o vector paplica guarda o valor de cada ponto de 1 a 20 aplicado a esse polinomio. nao sei se te ajudei a perceber.

fizeste, obrigada.

Por exemplo, o polinomio "-3*x^6 + x^2 -100x + 4", como e que o codificas?

parece que seja :

{4, -100, 1, 0, 0, 0, -3, 0, ...}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

pmg, faço isso porque eu quero calcular os pontos de 1 a 20. eu uso em termoX=termoX*j o valor de 1 a 20. se iniciasse a 0, automaticamente dava zero para tudo. mas por exemplo. se eu iniciar o vector com 20 elementos e for de 1 a 20, a posicao 20 nao vai existir ainda assim?

pmg, para quando o ponto é 1, quero obter o valor -98 para esse polinomio que disseste. que é substituindo o x por 1.

HappyHippy nao consegui perceber a resposta que deste ao que o pmg disse, onde foste buscar esses valores? para x=1 quero um valor, para x=2 quero outro, e assim sucessivamente até 20.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

vou ver se percebi ao apresentar uma solução usando o polinómio perguntado pelo @pmg

#include <math.h>
// p = {4, -100, 1, 0, 0, 0, -3, 0, ...}
// k = 6
void aplicaP2(double p[],double paplica[], int k)
{
   int i,j;
   for(j=1; j<=20; j++){                       // para X de 1 a 20
       paplica[j-1] = 0,0;
       for(i=0; i<= k; i++){                   // para cada Xi
           paplica[j-1] += p[i] * pow(j, i);   // p[i] = Ai e pow(j, i) = X^i, para X = j
       }
   }
   return;
}

é isso ?

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Hippy, sim percebi a tua maneira de fazeres, possivelmente mais simples e facil de entender que a minha. vou testá-la. já te digo se consegui que resultasse ou nao. Obrigado!

Funciona perfeitamente, agradeço-te HappyHippy e pmg pela ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se está correcto, então o melhor que farias era a técnica de dividir para conquistar, isto porque como verás dar-te-á a possibilidade de reutilização de código:

double calc_pol(double X, double coef[], int grau)
{
 int i = 0;
 double result = 0.0;

 for (i = 0; i <= grau; i++) // de X0 a Xgrau
   result += coef[i] * pow(X, i);

 return result;
}

void calc_pol_1_a_20(double coef[], int grau, double results[])
{
 int i;

 for (i = 1; i <= 20; i++)
   results[i] = calc_pol(i, ceof, grau);
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

sim sim, eu ja tinha feito isso mesmo que meteste aí. Essa parte do meu trabalho felizmente já está resolvida.

Só me falta uma parte para acabar todo o trabalho e não consigo sair dali.

é simplesmente um printf que nao consigo fazer.

Tendo os valores do polinomio por exemplo:

p=[0, 2, 3, 0, 0, 1]; 0 + 2x + 3x^2 + 0x^3 + 0x^4 + x^5, tenho que fazer um printf do tipo:

2 x**1 + 3 x**2 + x**5.

em que os valores que têm zero nao devem comparecer. mas o meu problema não é esse. é os '+' . tipo:

printf("%f x** %d + "); 

tendo em conta que o ultimo termo nao vai ter um +. e o facto de os que tem 0 tambem nao aparecerem +

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

isso já é outra questão

o que necessitas ter é

para i de grau a 1
 se coeficiente for diferente de 0 então
   apresenta termo
apresenta termo de grau 0


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Sim, o que esse codigo que me mostraste faz é apenas mostrar os valores que sao diferentes de 0 certo? eu tenho tambem que imprimir a posicao desse mesmo vector, que corresponde ao grau daqueles que sao diferentes de 0. os que são iguais a 0 não vêm para a formula. o problema é eu ter que apresentar uma formula. consigo imprimir cada valor diferente de 0 , tipo:

2 x**1 3 x**4 5x**6

mas para meter os "+" entre cada valor, é que eu nao consigo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Entao o que eu tenho, é uma funcao que imprime a Formula, visto que preciso de usar a Formula varias vezes.

void imprimeFormula(double p[], int k[]) {
   int i;
   for (i = 0; i < k; i++) {
       if (p[i] != 0) {
           printf(" %f x** %d + ", p[i], i);
       } else {
           printf(" ");
       }
   }
   return;
}

Este codigo nao faz muito sentido, mas eu nao o consigo por de maneira certa.

Editado por pmg
Falta LP; indentacao; chavetas

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
/**
* Função de apresentação de um polinómio.
*
* exemplo:
*   p = {10, -20, 0, 0, 50}
*   k = 4
*
* output = +50.00 x**4 -20.00 x**1 +10.00
*
* @param p Array com os coeficentes do polinómio codificados de grau 0 até N, por esta ordem
* @param k Grau do polinómio a ser apresentado
*/
void imprimePolinomio(double p[], int k)
{
 int i;

 /* ciclo de itera de grau até 0 inclusivé */
 for(i=k; i>=0; i--)
 {
   /* verificar se o coeficiente é diferente de 0 */
   if(p[i] != 0)
   {
     /* verificar se é para apresentar o de grau 0, porque este não apresente o x**0 */
     if (i != 0)
     {
       /* apresentar o copmponente do polinómio */
       printf("%c%.2f x**%d ",       // formato do componente a ser apresentado
              p[i] < 0 ? ' ' : '+',  // apresentar o caracter '+' se o coeficiente for positivo
              p[i],                  // apresentar o coeficiente (absoluto para remover o sinal)
              i);                    // apresentar o grau
     }
     else
     {
       printf("%c%.2f",              // formato do componente a ser apresentado
              p[i] < 0 ? ' ' : '+',  // apresentar o caracter '+' se o coeficiente for positivo
              p[i]);                 // apresentar o coeficiente (absoluto para remover o sinal)
     }
   }
 }
 printf("\n");

 return;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Ok, não tinha sequer pensado em strings, foi isso que usaste para os + certo? ainda não estou muito dentro do assunto porque achava nem ser preciso para este trabalho que estou a fazer. esclarece-me só o que faz os ? e o : quando apresentas o caracter +.

Pelo que percebi, p<0 ? ' ' faz que se o numero for menor que 0 nao imprime nada porque o proprio numero ja tem o sinal - . e o : é caso p>0 , para imprimir o +.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Ok, não tinha sequer pensado em strings, foi isso que usaste para os + certo?

nop, são caracteres.

vê que o delimitador é um apóstrofe e não aspas.

"string" <---- string

'c' <---- caracter (só pode ter um elemento dentro dos delimitadores)

são muito diferentes !!! tem cuidado !!!

esclarece-me só o que faz os ? e o : quando apresentas o caracter +.

isso é o que se chama um operador ternário

é como se fosse um if, mas como é um operador, devolve um valor

o significado é este:

<resultado> = (<condição> ? <verdadeiro> : <falso>)

a <condição> é uma instrução que será avaliada como se fosse o argumento de um if

agora o interessante é que o <verdadeiro> e o <falso> podem ser um conjunto de instruções que poderam ser usadas como resultado

exemplo :

if (idade >= 18)
 pode_beber = "tudo";
else
 pode_beber = "agua";

// isto é a mesma coisa que
pode_beber = idade >= 18 ? "tudo" : "agua";

// para se ler melhor :
pode_beber = (idade >= 18 ? "tudo" : "agua");

ps : não é obrigatório usar o resultado do operador !!

exemplo:

idade >= 18 ? entra_no_bar_strip() : chamar_a_policia();

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

certo, consegui entender, agora não consigo testar no meu trabalho porque estou num computador onde nao tenho nenhum compilador. Assim que tenha acesso, vou adaptar o que me deste ao meu trabalho e logo te direi se resultou, mas deverá resultar. Obrigado por me teres tirado as duvidas que tinha.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

consegui exactamente igual ao que reproduziste no que me mostraste. Obrigado.

Quando compilo o trabalho e depois o executo ele demora um bocado, não penso que seja normal, acho que me está a usar memoria a mais quando o executo, o que é que dá para melhorar no trabalho para que isso seja reduzido?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

#include <stdio.h>
#include <math.h>
#define DIM 10
#define DIMX 20

/* Definicao das Funcoes */
double aplicaPolinomio(double p[], int k, double pontos);
int derivadaPolinomio(double p[], int k,double derivada[]);
int somaPolinomios(double p[],double p1[], double psoma[],int k, int k1);
int prodPolinomios(double p[],double p1[], double pmult[],int k, int k1);
void Formula(double p[], int k);
void aplicaP2(double p[],double paplica[], int k, float pontos[]);


int main(void)
{
int grau1,grau2, cont=0, n_pontos1,n_pontos2;
double pontos, polinomio1[DIM],derivada[DIM-1],c;
double polinomio2[DIM], psoma[DIM], pmult[DIM*2];
double paplica[DIMX];
float pontos2[DIMX];

/* Esqueleto do Trabalho */

printf("Bemvindo ao programa dos polinomios\n");
printf("Indique o grau do polinomio1( menor que 10)\n");
scanf("%d",&grau1);

printf("Indique os %d coeficientes do polinomio1,"
        " por ordem crescente de expoente\n",grau1+1) ;
for(cont=0;cont<=grau1; cont++) {
   scanf("%lf",&polinomio1[cont]);
}

/* numero de pontos a avaliar no polinomio 1 */
printf("Indique o numero de pontos em que quer avaliar o polinomio 1"
"(menor que 20)\n");
scanf("%d",&n_pontos1);

/* imprimir pontos aplicados ao polinomio*/
printf("Indique os %d pontos em que quer avaliar o polinomio\n",n_pontos1);

for(cont=0; cont <n_pontos1; cont++){
   scanf("%lf",&pontos);
   if(cont==0){
    printf(" X Polinomio1(X)\n");
   }
   printf("%.2f %14.2f\n",pontos,aplicaPolinomio(polinomio1,grau1,pontos));
}

/* Derivada do polinomio 1 */
printf(" primeira derivada do polinomio1 \n");
printf(" Grau : %d\n",derivadaPolinomio(polinomio1,grau1,derivada));
Formula(derivada,grau1-1);
printf("\n");


/* Definicao do Polinomio 2 */
printf("Indique o grau do Polinomio2\n");
scanf("%d", &grau2);

printf("Indique os %d coeficientes do polinomio2,"
        " por ordem crescente de expoente\n",grau2+1) ;
for(cont=0;cont<=grau2; cont++) {
   scanf("%lf",&polinomio2[cont]);
}

/* numero de pontos a avaliar no polinomio 2 */
printf("Indique o numero de pontos em que quer avaliar o polinomio 2"
"(menor que 20)\n");
scanf("%d",&n_pontos2);

/* imprimir pontos aplicados ao polinomio2*/
printf("Indique os %d pontos em que quer avaliar o polinomio\n",n_pontos2);

for(cont=0; cont <n_pontos2; cont++){
   scanf("%lf",&pontos);
   if(cont==0){
    printf(" X Polinomio2(X)\n");
   }
   printf("%.2f %14.2f\n",pontos,aplicaPolinomio(polinomio2,grau2,pontos));
}

/* soma de polinomios */
printf(" Indique o valor para a constante real c\n");
scanf("%lf",&c);

for(cont=0; cont<=grau2; cont++){
   polinomio2[cont]=-c*polinomio2[cont];
}

printf(" Grau: %d\n", somaPolinomios(polinomio1,polinomio2, psoma,grau1, grau2));
printf("Formula: ");
if(grau1>grau2){
   Formula(psoma, grau1);
}
if(grau2>grau1){
   Formula(psoma, grau2);
}
if(grau2==grau1){
   Formula(psoma, grau2);
}
printf("\n");


/* produto de polinomios */
if(c!=0){
   for(cont=0; cont<=grau2; cont++){
    polinomio2[cont]=(polinomio2[cont])/-c;
   }
}
printf(" polinomio1 * polinomio2 \n");
printf(" Grau: %d\n", prodPolinomios(polinomio1,polinomio2,pmult ,grau1 ,grau2));
Formula(pmult,grau1+grau2);
printf("\n");


/* Avaliar o polinomio 2 em 20 pontos */
aplicaP2(polinomio2,paplica,grau2,pontos2);
printf("X Polinomio2(X)\n");
for(cont=0; cont<DIMX; cont++){
   printf("%.2f %14.2f\n", pontos2[cont], paplica[cont]);
}


return 0;


}

double aplicaPolinomio(double p[], int k, double pontos)
{

int i;
double p_aplica=0.0;

   for(i=0; i<= k; i++){
    p_aplica+= p[i] * pow(pontos,i);
   }


return p_aplica;
}


int derivadaPolinomio(double p[], int k,double derivada[])
{
int i,max_grau=0;
int grau[k];
for(i=0; i<k; i++){
   derivada[i]=p[i+1]*(i+1);
   if(derivada[i]!=0){
    grau[i]=i;
   }
   else{
    grau[i]=0;
   }
   if(grau[i]>max_grau){
    max_grau=grau[i];
   }
}

return max_grau;
}




int somaPolinomios(double p[],double p1[], double psoma[],int k, int k1)
{
int i;
int max_grau=0;

if(k>k1){
   int grau[k];
   for(i=0; i<=k1; i++){
    psoma[i]=p[i]+p1[i];
   }
   for(i=k1+1;i<= k; i++){
    psoma[i]=p[i];
   }
   for(i=0; i<=k; i++){
    if(psoma[i]!=0){
grau[i]=i;
    }
    else{
grau[i]=0;
    }
    if (grau[i]>max_grau){
max_grau=grau[i];
    }
   }
}
if(k<k1){
   int grau[k1];
   for(i=0; i<=k; i++){
    psoma[i]=p[i]+p1[i];
   }
   for(i=k+1;i<= k1; i++){
    psoma[i]=p1[i];
   }
   for(i=0; i<=k1; i++){
    if(psoma[i]!=0){
grau[i]=i;
    }
    else{
grau[i]=0;
    }
    if (grau[i]>max_grau){
max_grau=grau[i];
    }
   }
}
if(k==k1){
   int grau[k1];
   for(i=0; i<=k; i++){
    psoma[i]=p[i]+p1[i];
   }
   for(i=0; i<=k1; i++){
    if(psoma[i]!=0){
grau[i]=i;
    }
    else{
grau[i]=0;
    }
    if (grau[i]>max_grau){
max_grau=grau[i];
    }
   }
}
return max_grau;
}


int prodPolinomios(double p[],double p1[], double pmult[],int k, int k1)
{
int i,j,max_grau=0,grau[k+k1];

for(i=0; i<=k+k1; i++){
   pmult[i]=0;
}
for(i=0; i<=k; i++){
   for(j=0; j<=k1; j++){
    pmult[i+j]=pmult[i+j] + p[i]*p1[j];
   }
}
for(i=0; i<=k+k1; i++){
   if(pmult[i]!=0){
    grau[i]=i;
   }
   else{
    grau[i]=0;
   }
   if(grau[i]>max_grau){
    max_grau=grau[i];
   }
}
return max_grau;
}

void Formula(double p[], int k)
{
int i;

for(i=0; i<=k; i++){
   if( p[i] != 0){

    if(i != 0){
printf("%c %.2f x**%d ", p[i]<0 ? ' ' : '+',p[i], i);
    }
    else{
printf("%c%.2f ", p[i]<0 ? ' ' : '+', p[i]);
    }
   }
}
printf("\n");
return;
}

void aplicaP2(double p[],double paplica[], int k, float pontos[])
{

int i,j;
for(j=1; j<=20; j++){
   paplica[j-1]= 0.0;
   pontos[j-1]=j;
   for(i=0; i<= k; i++){
    paplica[j-1] += p[i] * pow(pontos[j-1] , i);
   }
}
return ;
}

nao tou a conseguir meter como codigo :s

Editado por pmg
Flata LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

eu nao estou a conseguir meter como codigo. assim é complicado eu sei. Mas não faz mal. Não há-de ser um problema o facto de ocupar mais memória

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

Tenho mais uma dúvida, Sobre a maneira como o HappyHippy me disse para imprimir a formula, o primeiro termo que aparece no printf. por exemplo:

um vector com os valores [ 1 2 3 ] da um polinomio de 1 + 2x + 3x^2.

E vai imprimir +1 +2x +3x^2, e eu queria saber como retirar o + do primeiro termo, visto que não é suposto aparecer no meu trabalho e já dei voltas e voltas e não consigo chegar lá.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.