Интерполяция сплайнами.
При большом количестве узлов интерполяции сильно возрастает степень интерполяционных многочленов, что делает их неудобными для проведения вычислений. Высокой степени многочленов можно избежать, разбив отрезок интерполирования на несколько частей, с построением в каждой части своего интерполяционного полинома. Такой метод называется интерполяцией сплайнами. Наиболее распространенным является построение на каждом отрезке [xi, xi+1], i=0..n-1 кубической функции. При этом сплайн – кусочная функция, на каждом отрезке заданная кубической функцией, является кусочно-непрерывной, вместе со своими первой и второй производной. Будем искать кубический сплайн на каждом из частичных отрезков [xi, xi+1] в виде: , где ai,bi,ci,di – неизвестные. Из того что Si(xi)=yi получим: В силу непрерывности потребуем совпадения значений в узлах, т.е.: ,i=0..n-1; (1) Также потребуем совпадения значений первой и второй производной: ,i=0..n-2; (2) ,i=0..n-2; (3) Из (1) получим n линейных уравнений с 3n неизвестными ,i=0..n-1; (1*) Из (2) и (3) получим 2(n-1) линейных уравнений с теми же неизвестными: ,i=0..n-1; (2*) ,i=1..n-1; (3*) Недостающие два уравнения определим следующим образом. Предположим, что в точках х0 и хn производная равна нулю и получим еще два уравнения. Получим систему из 3*n линейных уравнений с 3*n неизвестными. Решим ее любым из методов и построим интерполяционную функцию, такую что на отрезке [xi, xi+1] она равна Si.
Метод Лагранжа procedure TForm1.Button1Click(Sender: TObject); type tip=array of real; var x,y:tip; i,j,n:byte; p,s,xx:real; begin n:=edt.Count; setlength(x,n); setlength(y,n); for i:=0 to n-1 do x[i]:=edt.massiv[i];edt.Lines.Delete(0); for i:=0 to n-1 do y[i]:=edt.massiv[i];edt.Lines.Delete(0); xx:=strtofloat(edt.Text); edt.Lines.Delete(0); s:=0; for i:=0 to n-1 do begin p:=1; for j:=0 to n-1 do if i<>j then p:=p*(xx-x[j])/(x[i]-x[j]); p:=p*y[i]; s:=s+p; end; edt.writer('',1); edt.writer('',s,1); end; Сплайн – интерполяция (программа составляет систему линейных уравнений, решая которую находим коэффициенты кубических сплайнов). procedure TForm1.Button1Click(Sender: TObject); var b,c,d,x,y:array of real; urm:array of array of real; i,j,k,n :byte; begin n:=edt.Count; setlength(x,n);setlength(y,n); for i:=0 to n-1 do x[i]:=edt.massiv[i];edt.Lines.Delete(0); for i:=0 to n-1 do y[i]:=edt.massiv[i];edt.Lines.Delete(0); setlength(b,n-1);setlength(c,n-1);setlength(d,n-1); setlength(urm,3*(n-1),3*(n-1)+1); for i:=0 to 3*(n-1)-1 do for j:=0 to 3*(n-1) do urm[i,j]:=0; for i:=0 to n-1 do edt.writer(' ',y[i],0); for i:=0 to n-2 do begin urm[i,3*i+0]:=x[i+1]-x[i]; urm[i,3*i+1]:=(x[i+1]-x[i])*(x[i+1]-x[i]); urm[i,3*i+2]:=(x[i+1]-x[i])*(x[i+1]-x[i])*(x[i+1]-x[i]); urm[i,3*(n-1)]:=y[i+1]-y[i]; end; for i:=0 to n-3 do begin urm[i+n-1,3*i+0]:=1; urm[i+n-1,3*i+1]:=2*(x[i+1]-x[i]); urm[i+n-1,3*i+2]:=3*(x[i+1]-x[i])*(x[i+1]-x[i]); urm[i+n-1,3*i+3]:=-1; end; for i:=0 to n-3 do begin urm[i+2*n-3,3*i+1]:=1; urm[i+2*n-3,3*i+2]:=3*(x[i+1]-x[i]); urm[i+2*n-3,3*i+4]:=-1; end; urm[3*n-5,0]:=1; urm[3*n-5,3*(n-1)]:=0; urm[3*n-4,3*(n-1)-3]:=1;urm[i+2*n-3,3*(n-1)-2]:=2*(y[n-1]-y[n-2])] urm[3*n-4,3*(n-1)-1]:=3*(y[n-1]-y[n-2]) *(y[n-1]-y[n-2]); urm[i+2*n-3,3*(n-1)]:=0 for i:=0 to 3*(n-1)-1 do begin edt.writer('',1); for j:=0 to 3*(n-1) do edt.writer(' ',urm[i,j],0); end; end; Выполнить интерполяцию сплайнами третьей степени. Построить график и отметить на нем узлы интерполяции.
Решение. Будем искать кубический сплайн на каждом из частичных отрезков [xi, xi+1], i=0..2 в виде: , где ai,bi,ci,di – неизвестные. Из того что Si(xi)=yi получим: В соответствии с теоретическим положениями изложенными выше, составим систему линейных уравнений, матрица которой будет иметь вид:
При этом мы потребовали равенства производной нулю. Решая систему уравнений получим вектор решений [b1,c1,d1,b2,c2,d2]: Подставляя в уравнение значения b1,c1,d1, получим на отрезке [7..9]: Если выражение упростить то: Аналогично подставляя в уравнение значения b2,c2,d2, получим на отрезке [9..13]: или График имеет вид: Метод Ньютона procedure TForm1.Button1Click(Sender: TObject); type tip=array of real; var x,y:tip; i,j,n:byte; p,s,xx,t,h:real; kp:array of array of real; begin n:=edt.Count; setlength(x,n); setlength(y,n); for i:=0 to n-1 do x[i]:=edt.massiv[i];edt.Lines.Delete(0); for i:=0 to n-1 do y[i]:=edt.massiv[i];edt.Lines.Delete(0); xx:=strtofloat(edt.Text); edt.Lines.Delete(0); setlength(kp,n,n); for i:=0 to n-1 do for j:=0 to n-1 do kp[i,j]:=0; for i:=0 to n-1 do kp[0,i]:=y[i]; for i:= 1 to n-1 do for j:=0 to n-i-1 do kp[i,j]:=kp[i-1,j+1]-kp[i-1,j]; for i:= 0 to n-1 do begin for j:=0 to n-1 do edt.writer(' ',kp[i,j],0); edt.writer('',1); end; edt.writer('',1); h:=0.5; t:=(xx-x[0])/h; s:=y[0]; for i:=1 to n-1 do begin p:=1; for j:=0 to i-1 do p:=p*(t-j)/(j+1); s:=s+p*kp[i,0]; end; edt.writer('',s,1);; end; Построить интерполяционный многочлен Ньютона. Начертить график и отметить на нем узлы интерполяции. Вычислить значение функции в точке х=1.25.
Решение. Построим таблицу конечных разностей в виде матрицы: Воспользуемся интерполяционной формулой Ньютона: Pn ( x )= y 0 + t Δ y 0 + t( t-1) /2! Δ 2 y0+...+ t(t-1)...(t-n+1) / n! Δ n y0 Подставив значения получим многочлен пятой степени, упростив который получим: P5(x)=2.2x5-24x4+101.783x3-20.2x2+211.417x-80.7 Вычислим значение функции в точке x=1.25; P(1.25)=2.0488; График функции имеет вид: Построить интерполяционный многочлен Лагранжа. Начертить график и отметить на нем узлы интерполяции. Вычислить значение в точке х=1.2.
Решение. Построим интерполяционный многочлен Лагранжа L4( x), подставив значения из таблицы в формулу: Напишем программу и вычислим значение многочлена в точке х=1.2: L4(1.2)=5.657; Полученный многочлен имеет четвертую степень. Упростим его и получим: Построим график полученного полинома:
Популярное: Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Почему стероиды повышают давление?: Основных причин три... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (273)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |