Wielomian interpolacyjny - bezsensowne wyniki

Odpowiedz Nowy wątek
2018-12-09 22:42
0

Witam. Napisałem (z użyciem biblioteki Eigen) program, który ma wyznaczyć współczynniki wielomianu interpolacyjnego. Problem w tym, że wyniki zwracane przez ten program są co najmniej dziwne. W programie korzystam z macierzy Vandermonde'a oraz metody LU. Czy możliwe jest, że zagadnienie jest aż tak źle uwarunkowane, że jedyny współczynnik, który się zgadza, ma wartość 1, natomiast pozostałe wyniki to 0 lub -0?

Kod programu:

#include <iostream>
#include <cmath>
#include <iomanip>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/LU>

int main()
{
    const int size=5;

    double x[]={-1.23, -1.19, -0.74, 0.11, 2.56};   //węzły
    double fx[]={1.5129, 1.4161, 0.5476, 0.0121, 6.5536};   //wartości w węzłach

    Eigen::MatrixXd X(size, size);
    Eigen::VectorXd a(size);
    Eigen::VectorXd Y(size);
    //Eigen::IOFormat format(50, 0, ", ", "\n", "[", "]");

    for(int i=0; i<size; ++i)
    {
        for(int j=0; j<size; ++j)
        {
            X(i, j)=std::pow(x[i], size-1-j);
        }

        Y(i)=fx[i];
    }

    Eigen::PartialPivLU<Eigen::MatrixXd> lu(X);

    a=lu.solve(Y);

    for(int k=0; k<size; ++k)
    {
        std::cout<<"a"<<k<<" = "<<a(size-1-k)<<std::endl;
    }
}
edytowany 1x, ostatnio: kst142, 2018-12-09 22:44

Pozostało 580 znaków

2018-12-10 10:48
0

czemu size-1-j? Dla macierzy Vandermonde’a jest inaczej. Czemu odwróciłeś indeksy?

Offtopic: naucz się nadawać symbolom nazwy, które będą ci pomagać, a nie utrudniać czytanie kodu. x i X to jest prośba o kopa w ... .


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-12-10 10:50

Pozostało 580 znaków

2018-12-10 11:06
0

Macierz wypełniłem zgodnie z tym, co podaje wykład. Jeśli dobrze rozumiem, w pierwszej kolumnie powinna być potęga zerowa, natomiast w ostatniej n-1?

Co do offtopa: dzięki za radę. Faktycznie, nazwy mogą być mylne. Zmienię je, gdy tylko będę miał dostęp do komputera.

Pozostało 580 znaków

2018-12-10 12:20
1

Dobra już widzę, w czym problem:
Problem polega na tym, że NIE MA PROBLEMU :), jest dobrze!
Zwróć uwagę, że dane wejściowe dokładnie pokrywają się z funkcją f(x) = x^2 :), więc ma wyjść 0 0 1 0 0 (wartość współczynników a_i).
Niedokładności w reprezentacji tych liczb w systemie binarnym, powodują, że nie wychodzą idealne zera.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-12-10 13:24

Pozostało 580 znaków

2018-12-10 15:12
0

Ok. Dzięki wielkie. Sugerowałem się wynikami z internetowego kalkulatora oraz Mathematici, dlatego nie wpadłem na coś takiego :). Tam pozostałe współczynniki były rzędu 10^-15 i niżej.
Jeszcze z ciekawości wypróbuję metodę z ćwiczeń (wyznaczenie wielomianu, którego wartość w zerze będzie równa a_i oraz wyinterpolowanie jej).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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