Многочлен Лагранжа

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Інтерполяцій́ний многочле́н Лагра́нжамногочлен мінімального степеня, що приймає дані значення у даному наборі точок. Для n+1 пар чисел  (x0,y0),(x1,y1)(xn,yn), де всі  xi різні, існує єдиний многочлен  L(x) степеня не більшого від n, для якого  L(xi)=yi.

У найпростішому випадку n=1 - це лінійний многочлен, графік якого — пряма, що проходить через дві задані точки.

Визначення

Цей приклад представляє інтерполяційний многочлен Лагранжа для чотирьох точок (-9,5), (-4,2), (-1,-2) і (7,9), а також поліноми yj lj(x), кожний з яких проходить через одну з виділених точок, та приймає нульове значення в інших xi

Лагранж запропонував спосіб обчислення таких многочленів:

L(x)=j=0nyjlj(x)

де базисні поліноми визначаються за формулою:

 lj(x)=i=0,jinxxixjxi=xx0xjx0xxj1xjxj1xxj+1xjxj+1xxnxjxn

Очевидно, що lj(x) мають такі властивості:

  • Це поліноми степеня n
  •  lj(xj)=1
  •  lj(xi)=0 при ij

Звідси випливає, що L(x), як лінійна комбінація lj(x), може мати степінь не більший від n, та L(xj)=yj.

Застосування

Поліноми Лагранжа використовуються для інтерполяції, а також для чисельного інтегрування.

Нехай для функції f(x) відомі значення yj=f(xj) у деяких точках. Тоді ця функція може інтерполюватися як

f(x)j=0nf(xj)lj(x)

Зокрема,

abf(x)dxj=0nf(xj)ablj(x)dx

Значення інтегралів від lj не залежать від f(x), тож їх можна обчислювати заздалегідь, знаючи послідовність xi.

Для випадку рівномірного розподілу на відрізку вузлів інтерполяції

У вказаному випадку можна виразити xi через відстань між вузлами інтерполяції h та початкову точку x0:

xjx0+jh,

і, як наслідок,

xixj(ij)h.

Якщо підставити ці вирази у формулу базисного полінома та винести h за знаки множення у чисельнику та знаменнику, отримаємо

li(x)=j=0,ijn(xxj)(xixj)=j=0,ijn(xx0jh)hn1j=0,ijn(ij)=hn1j=0,ijn(xx0hj)hn1j=0,ijn(ij).

Після цього можна ввести заміну змінної

y=xx0h

і отримати поліном від у, який будується з використанням лише цілочисленної арифметики. Недоліком цього підходу є факторіальна складність чисельника та знаменника, що вимагає використання алгоритмів з багатобайтним представленням чисел.

Приклади

Приклад 1

Ми бажаємо інтерполювати ƒ(x) = x2 на діапазоні 1 ≤ x ≤ 3, із відомими трьома точками:

x0=1f(x0)=1x1=2f(x1)=4x2=3f(x2)=9.

Інтерполяційний многочлен такий:

L(x)=1x212x313+4x121x323+9x131x232=x2.

Приклад 2

Ми бажаємо інтерполювати ƒ(x) = x3 на діапазоні 1 ≤ x ≤ 3, із відомими трьома точками:

x0=1 f(x0)=1
x1=2 f(x1)=8
x2=3 f(x2)=27

Інтерполяційний многочлен такий:

L(x)=1x212x313+8x121x323+27x131x232=6x211x+6.

Зауваження

Приклад розбіжності інтерполяційного многочлена Лагранжа.

Як видно з побудови, кожен раз коли вузол xk змінюється, всі базові многочлени Лагранжа необхідно перерахувати. Найкращим варіантом інтерполяційного многочлена для практичних (або обчислювальних) цілей є барицентрична форма інтерполяції Лагранжа або поліном Ньютона.

Лагранжева та інші інтерполяції із рівновіддаленими точками, як у прикладах згори, породжують многочлен, що коливається навколо справжньої функції. Ця поведінка сильніше себе виявляє у випадку більшої кількості заданих точок, призводячи до розбіжності відомої як феномен Рунге; проблему можна усунути обравши для інтерполяції вузли Чебишова.

Базові многочлени Лагранжа можна використати у чисельному інтегруванні для виведення формул Ньютона—Котеса.

Приклад реалізації

Код в Oberon

TYPE Point=RECORD x,y:REAL END;

PROCEDURE PolynomLagrange(p:ARRAY OF Point;x:REAL):REAL;
VAR c,s:REAL;
	i,j:INTEGER;
BEGIN
	s:=0;
	FOR i:=0 TO LEN(p)-1 DO
		c := 1;
		FOR j:=0 TO LEN(p)-1 DO
			IF i#j THEN c:=c*(x-p[j].x)/(p[i].x-p[j].x)END
		END;
		s:=s+c*y[i]
	END;
	RETURN s
END PolynomLagrange;

Код в C#

double L_BI_MI(double x)
{
     double r = 0, ra, rb;
     for (int i = 0; i < n; i++)
     {
           ra = rb = 1;
           for (int j = 0; j < n; j++)
               if (i != j)
               {
                   ra *= x - x_[j];    //(x_[i],y_[i]) - інтерполяційні вузли
                   rb *= x_[i] - x_[j];
               }
            r += ra * y_[i] / rb;
    }
    return r;
}

Див. також

Література