MATLAB; Полином на Лагранж, интересна грешка

В домашното ми беше дадена задача, която изискваше да изчисля полином на Лагранж. Наборът от данни (x,y) включва x = 0,1,2....20, докато y = x - 0,3*rand() + 1; След това бяхме помолени да наблюдаваме феномена на Рунге. След това бяхме помолени да изчислим Chebyshev Nodes около ръба, за да премахнем това явление. Е, тук някак си заседнах. Полиномът на Лагранж, който изчислявам в този момент, не минава през всяка точка от данни.

Използваната от мен полиномна функция на Лагранж е,

function P = lagrangepoly(x, y)
   %checks if two inputs vectors are obtained
   if nargin ~= 2
      error('The function accepts only two arguments of equal length'); 
   end
   
   sz = size(x); %size of x
   sz2 = size(y); % size of y
   
   %checks if size of x and size of y matches and they are row vectors
   if (sz(1) ~= sz2(1)) || (sz(2) ~= sz2(2)) || (sz(1) ~= 1)
       error('Mismatch in length or unsupported arguments.');
   end
   
   %takes the length of thevectors
   len = sz(2);
   
   %creating a emplt 1xlen container
   P = zeros(1, len);
   for i=1:1:len
       %poly evaluates all the convolution of [1 -x(j)] except at x(i)
       %prod evaluates all the product of (x(i) - x(j)) except at x(i)
       P = P + (poly(x((1:len)~=i)) ./ prod(x(i)-x((1:len)~=i))) .* y(i);
   end
end

Наборът от данни, който използвам за това, е: xn = [0 0,5000 1,0000 2,0000 3,0000 4,0000 5,0000 6,0000 7,0000 8,0000 9,0000 10,0000 11,0000 12,0000 13,0000 14. 0000 15,0000 16,0000 17,0000 18,0000 19,0000 19,5000 20,0000];

yn =[0.7363 1.4701 1.7802 2.8232 3.9698 4.9934 5.9747 6.8635 7.9435 8.9775 9.9013 10.9318 11.8988 12.8343 13.7095 14.9318 15.8800 16.7028 17.8614 18.7046 19.8505 20.2849 20.7036];

Кривата, която получавам, може да се види тук

Синята крива дава оригиналния набор от данни, а зелената крива дава точките, оценени от полинома. Може ли някой да ми даде предложение как да премахна тази грешка. Мисля, че това е някаква грешка в прецизността. Благодаря предварително.


person ponir    schedule 08.05.2013    source източник


Отговори (1)


Честито! Вие сте 10-милионният (и 3) човек, който се е сблъсквал с този проблем. :)

Това е прецизност. Полином на Лагранж през 21 точки ще бъде полином от 20-та степен.

Така че вие ​​повишавате числа от порядъка на 20 на 20-та степен. След това ги добавяте и изваждате от други числа, които може да са от порядъка на 1. (Както и да оценявате този полином, той ще причини същите проблеми.)

Какъв е диапазонът от числа, с който може да се справи двойникът? Около 16 десетични цифри. Очаквайте да видите цифрови боклуци. Не е изненада, ти го направи.

Как го избягвате? Не използвайте полиноми от висок ред! (Между другото, причината, поради която ви беше даден този пример, е да видите точно този резултат. Всеки първи клас в числените методи има такъв пример в него.)

person Community    schedule 08.05.2013