Jump to content

[Resolvido] Duvida calculo polinomio


dramos21
 Share

Recommended Posts

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.

Edited by pmg
Falta LP
Link to comment
Share on other sites

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, ...}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ?

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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);
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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 +

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Edited by pmg
Falta LP; indentacao; chavetas
Link to comment
Share on other sites

/**
* 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
Link to comment
Share on other sites

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 +.

Link to comment
Share on other sites

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();
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.