Wątek przeniesiony 2017-04-07 20:42 z Newbie przez furious programming.

Interpolacja Lagrange'a na węzłach Czebyszewa - wyznacza prostą.

0

Witam.
Poniżej będą znajdować tylko wyrywki kodu, ponieważ przypuszczam, że gdzieś w nich leży problem, jednak w załączniku znajdować będzie się cały program oraz wzory
Mam zadanie na studiach ( zamieszczone w tytule tematu ), jednak szukam błędu od 2 dni i już nie mam pojęcia gdzie go szukać.
Na końcu działania programu za pomocą gnuplota powinien rysować wykres wielomianu wyznaczonego metodą interpolacji, jednak on rysuje tą funkcje pierwotną ( węzły są wyznaczane na podstawie węzłów Czebyszewa, zaś wartości dla tych węzłów na podstawie funkcji ).

Algorytm wyznaczania węzłów Czebyszewa

  • int węzły - liczba węzłów podawana przez użytkownika
  • int a,b - zakres na jakim mają być wyznaczane te węzły
void wezly_czebyszewa(double *x, int wezly, int a, int b) // przekazywana jest pusta tablica
{
    double gora,dol;
    gora = 2*wezly+1;
    double tmp;

    for ( int i = 0; i<wezly; i++)
    {
        dol = 2*i +1;
        tmp = cos(gora * 3.14 / dol);
        x[i] = 0.5 * ((b-a)*tmp + (a+b));
    }

}

Wartości funkcji są wyznaczane na podstawie otrzymanych "x" z powyższego algorytm, to działa dobrze.

*tab_x, tab_y - są to tablicy z "x" i wartościami dla tych "x" potrzebne do interpolacji Lagrange'a

double interpolacja (double *tab_x, double *tab_y, double x, int wezel){
       double wynik =0.0;
       double t;
       double gora,dol;
        for ( int k =0 ; k < wezel; k++){
                gora = dol =1.0;
            for (int j =0; j < wezel; j++){

                if (j != k){
            gora = gora * (x - tab_x[j]);
            dol = dol *(tab_x[k] - tab_x[j]);
                    }
            }
            wynik += tab_y[k] * (gora/dol);
        }
        return wynik;

}

I problem wygląda tak, że wyznacza on wartości ( nie tylko dla węzłów ) dokładnie takie same jak dla funkcji dla której węzły były policzone.

Np. Wyznaczam węzły Czebyszewa i liczę dla nich wartość z funkcji liniowej ( 3x -7 ) i potem,gdy gunplot rysuje wykres dla tego wielomianu to wychodzi linia prosta dokładnie taka sama jak dla tej funkcji liniowej. :/
Dodam, że winą nie jest gnuplot, bo gdy biorę na sucho wyznaczanie wartości wielomianu dla jakieś zadanego x ( różnego do węzła ) to wychodzi dokładne taka sama jak dla funkcji liniowej, stąd gnuplot rysuje linie prostą.

1

Pierwszy wzór jest bezsensu:
title
Pomieszane są symbole, co doprowadziło cię do dziwnej interpretacji.
Pewnie miało być tak:
x_m = cos( \frac{2 \cdot m + 1}{2 \cdot n + 1}) \textrm{, gdzie:  }  m = 0, 1, 2, 3, ..., n

Definicja ym też jest dziwna, bo ym zależy liniowo od xm, co dla interpolacji nie jest ciekawe.
Z tego powodu wychodzi ci prosta, bo coś nie tak jest z treścią zadania.

0

Znaczy ten y_n to powinien być x_n dla dowolnego przedziału po prostu bo ten wzór zależny od cosinusa, wyznaczy nam liczby z przedziału [-1,1], więc aby móc policzyć "x" dla dowolnego przedziału to stosujemy ten wzór na y_n.

Niestety nadal błędy nie znalazłem. Nie orzumiem czemu we wzorze na Interpolacje mimo dobrze zaimplementowanego wzoru on wyznacza tą funkcje pierwotną..

1 użytkowników online, w tym zalogowanych: 0, gości: 1