I’m doing a C program, which consists of implementing the Lagrange interpolation method

Asked

Viewed 107 times

-3

I’m doing a C program, which consists of implementing the Lagrange interpolation method. Where the user enters the table data (values of x and fx, and I have to return the value of lx and px, only when I calculate the value of lx, the result of 0, the way I am allocating the values of x and fx are correct ?.

One of the tests to see if the program works is: quantity of terms = 3 x0 = 0 X1 = 1 x2 = 3 fx0 = -5 fx1 = 1 fx2 = 25

exit: lx0 = -0.333 lx1 = 1 lx2 = 0.33333 px = 11

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

//Estruturas
typedef struct tabela {
    int termos;
    float *x;
    float fx;
    float ponto;
}tabela;

typedef struct conta {
    float *lxi;
    float *lxf;
    float px;
}conta;

//FUNCOES
float intro(tabela *p_tabela, int qtd);
void alocaTabela(tabela **p, int tamanho);
void alocaConta(conta **p, int tamanho);
float calculaL(conta*p_conta, tabela*p_tabela);

int main(){
    int qtd;
    //PONTEIROS
    tabela *p_tabela;
    conta *p_conta;

    printf("\nDigite a quantidade de termos da sua tabela: ");
    scanf("%d", &qtd);

    //FUNCOES
    alocaTabela(&p_tabela, qtd); 
    alocaConta(&p_conta, qtd);
    intro(p_tabela,qtd);
    calculaL(p_conta, p_tabela);
   
    
}

void alocaTabela(tabela **p, int tamanho) {
    if ((*p = (tabela *) malloc(tamanho * sizeof(tabela))) == NULL) {
        printf("\nErro na alocacao. O programa sera encerrado!\n");
        exit(1);
    }
}

void alocaConta(conta **p, int tamanho) {
    if ((*p = (conta *) malloc(tamanho * sizeof(conta))) == NULL) {
        printf("\nErro na alocacao. O programa sera encerrado!\n");
        exit(1);
    }
}


float intro(tabela *p_tabela, int qtd){
    int i, j;

    //ATRIBUINDO VALOR DE QTD PARA TERMOS
    p_tabela->termos=qtd; 
    
    //ARMAZENAMENTO DOS VALORES DE X
    for (i = 0; i < p_tabela->termos; i++) {
        printf("\nDigite os valores de X: ");
        printf("\nX(%d): ", i);
        scanf("%f", (p_tabela->x+i));
    }

    printf("\n\n");    
    printf("-------------------------------------");
    printf("\n\n");

    //ARMAZENAMENTO DOS VALORES DE FX
    for (j = 0; j < p_tabela->termos; j++) {
        printf("\nDigite os valores de F(x): ");
        printf("\nF(X[%d]): ", j);
        scanf("%f", &(p_tabela+j)->fx);
            
    }

    printf("\n\n");    
    printf("-------------------------------------");
    printf("\n\n");

    //ARMAZENAMENTO DO PONTO 
    printf("\nDigite o ponto a ser interpolado: ");
    scanf("%f", &(p_tabela->ponto));

}

float calculaL(conta*p_conta, tabela*p_tabela){
    //Lx = (x-xj)/(xi-xj) * ................ sendo x = ponto
    
    int i, j;

    for(i=0; i < p_tabela->termos;i++){
        for(j=0;j<=p_tabela->termos;j++){
            if(j!=i)
                j++;  
            *(p_conta->lxi+(j)) *= (p_tabela->ponto) - *(p_tabela->x+(j++)) / *(p_tabela->x+(i)) - *(p_tabela->x+(j++)); 
        }
        printf("\n\nL(X[%d]): %f", i, *(p_conta->lxf+(j)));
    }
    
}

1 answer

-3

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

// Structs do softwaresm para assim organizar da melhor forma

typedef struct sum
{
    double x[100];
    double fx[100];
    int size;
    int xp;

} sum;

// Funcoes do software
void aloca(sum **p, int tam);
void Ln(float p);
void lagrangeInterpolation(double x[], double fx[], int n, double xp);

int main()
{
    //ponteiro de sum para Xa
    sum *xa;

    int n, i, j;
    double x[100], fx[100], xp;

    printf("----------------------------------------------\n");
    printf(" FACULDADE DE ENGENHARIA DE SOROCABA  - FACENS \n\n ");
    printf(" Engenharia de Computacao \n\n");

    printf("----------------------------------------------\n");

    printf("\n");
    printf("\n");

    //Input da quantidade de termos desejada no programa

    printf("Digite o numero de pontos da tabela de x e f(x): ");
    scanf("%d", &n);
    printf("\n");

    aloca(&xa, n);
    xa->size = n;

    //Loop que ira obter os valores do X, para quantidades de termos desejada

    printf("Digite o valor de cada ponto de x: ");
    printf("\n");

    for (i = 0; i < n; i++)
    {
        printf("x%d: ", (i + 1));
        scanf("%lf", &x[i]);
    }

    printf("\n");
    printf("\n");

    //Loop que ira obter os valores do F(x), para quantidades de termos desejada

    printf("Digite o valor de cada ponto de f(x): ");
    printf("\n");

    for (j = 0; j < n; j++)
    {

        printf("f(x%d): ", (j + 1));
        scanf("%lf", &fx[j]);
    }

    printf("\n");
    printf("\n");

    printf("Digite o ponto a ser interpolar: ");
    scanf("%lf", &xp);

    //Retorna o resultado do calculo e dessa forma retornando o function lagrangeInterpolation

    lagrangeInterpolation(x, fx, n, xp);
    return 0;
}

//Funcao que realiza o o calculo de F(x) retornando o valor e realizando os calculos

void lagrangeInterpolation(double x[], double fx[], int n, double xp)
{
    double intp = 0, m;

    int i, j;
    for (i = 0; i < n; i++)
    {
        m = 1;
        for (j = 0; j < n; j++)
        {
            if (i != j)
                m = m * (xp - x[j]) / (x[i] - x[j]);
        }
        m = m * fx[i];
        intp = intp + m;
    }

    printf("\n O resultado de f(%lf) e %lf\n", xp, intp);
}

//A Durante esse processo aconteu a alocação do termo sum
//assim ocorrendo uma validacao se alocacao ocorre correto
//se nao occorre erro no porcedimento retorna a alocacao malloc

void aloca(sum **p, int tam)
{
    if ((*p = (sum *)malloc(tam * sizeof(sum))) == NULL)
    {
        printf("\n Alocation Error! \n");
        exit(1);
    }
};

Browser other questions tagged

You are not signed in. Login or sign up in order to post.