МАТЛАБ; Многочлен Лагранжа, интересная ошибка

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

Я использовал полиномиальную функцию Лагранжа:

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 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.0000 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