Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C] Interpolacja wielomianowa - dziwne/błędne wyniki.

HuMaNThe 15 Mar 2010 23:51 2169 2
  • #1
    HuMaNThe
    Level 2  
    Witam, otóż mam do zrobienia następujące zadanie:
    zastosuj metodę wielomianu interpolacyjnego Lagrange'a do interpolacji funkcji y=|x|.
    Napisałem program, jednak wprowadzając więcej niż 3 argumenty do obliczenia przez wielomian interpolacyjny funkcji dostaje wartości "-1.#IND00". Zaś jak wprowadzę 3 bądź mniej argumentów, wyniki są dziwne, tzn dla 1 dostaje np 7 (powinno być chyba 1 z racji, że |1|=1?).
    Poniżej kod programu, z góry przepraszam, jeśli błąd wynika z mojego braku wymaganej wiedzy - uczę się sam, także nie wszystko jest jeszcze dla mnie jasne :)
    Code:

    #include <stdio.h>
    #include <math.h>
    double lagr(double x[], double y[], int n1, double xx);
    void main()
    {
       int i, n;
       double xd[100], yd[100], xp, xk, dx, xb, yb;
       FILE *p2=fopen("wynik.txt","w");
       FILE *p1=fopen("dane.txt","w");
       //generowanie wezlow interpolacji
       scanf("%lf %lf %lf",&xp, &xk, &dx);
       n=(xk-xp)/dx+1;
       xb=xp;
       for(i=0; i<n; i++)
       {
          yd[i]=fabs(xb);
          xd[i]=xb;
          xb=xb+dx;
       fprintf (p1,"%lf    %lf \n",xd[i],yd[i]);
       printf ("xd=%lf    yd=%lf \n",xd[i],yd[i]);
       }
       //interpolacja
    scanf("%lf %lf %lf",&xp,&xk,&dx);
    n=(xk-xp)/dx+1;
    xb=xp;
    for(i=0;i<n;i++)
    {
    yb=lagr(xd,yd,n,xb);
    printf("xb=%lf    yb=%lf\n",xb, yb);
    fprintf(p2,"%lf    %lf\n",xb, yb);
    xb=xb+dx;
    }
    }
    double lagr(double x[], double y[], int n1, double xx)
    {
       int i, j;
       double yy, li;
       yy=0;
       for(i=0;i<n1;i++)
       {
          li=1;
          for(j=0;j<n1;j++)
          {
             if(j!=i)
             {
                li=li*(xx-x[j])/(x[i]-x[j]);
             }
             yy=yy+li*y[i];
          }
       }
       return yy;
    }
  • Helpful post
    #2
    pallid
    Level 20  
    Niepoprawnie zaimplementowany algorytm obliczania interpolacji w danym punkcie. Zgodnie ze wzorem:
    [C] Interpolacja wielomianowa - dziwne/błędne wyniki.
    instrukcja:
    Code:
    yy=yy+li*y[i];

    powinna byc w zewnetrznej petli for(;;)
  • #3
    HuMaNThe
    Level 2  
    Już działa :) Dzięki za pomoc