Интерполяция

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
О функции, см.: Интерполянт.

Интерполя́ция, интерполи́рование — в вычислительной математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений.

Многим из тех, кто сталкивается с научными и инженерными расчётами, часто приходится оперировать наборами значений, полученных опытным путём или методом случайной выборки. Как правило, на основании этих наборов требуется построить функцию, на которую могли бы с высокой точностью попадать другие получаемые значения. Такая задача называется аппроксимацией. Интерполяцией называют такую разновидность аппроксимации, при которой кривая построенной функции проходит точно через имеющиеся точки данных.

Существует также близкая к интерполяции задача, которая заключается в аппроксимации какой-либо сложной функции другой, более простой функцией. Если некоторая функция слишком сложна для производительных вычислений, можно попытаться вычислить её значение в нескольких точках, а по ним построить, то есть интерполировать, более простую функцию. Разумеется, использование упрощенной функции не позволяет получить такие же точные результаты, какие давала бы первоначальная функция. Но в некоторых классах задач достигнутый выигрыш в простоте и скорости вычислений может перевесить получаемую погрешность в результатах.

Следует также упомянуть и совершенно другую разновидность математической интерполяции, известную под названием «интерполяция операторов». К классическим работам по интерполяции операторов относятся теорема Рисса — Торина (Riesz-Thorin theorem) и теорема Марцинкевича (Marcinkiewicz theorem), являющиеся основой для множества других работ.

Определения[править | править вики-текст]

Рассмотрим систему несовпадающих точек ~x_i (i\in{0,1,\dots,N}) из некоторой области ~D. Пусть значения функции ~f известны только в этих точках:

y_i = f(x_i),\quad i=1,\ldots,N.

Задача интерполяции состоит в поиске такой функции ~F из заданного класса функций, что

F(x_i) = y_i,\quad i=1,\ldots,N.
  • Точки ~x_i называют узлами интерполяции, а их совокупность — интерполяционной сеткой.
  • Пары ~(x_i,y_i) называют точками данных или базовыми точками.
  • Разность между «соседними» значениями ~\Delta x_i=x_i-x_{i-1} — шагом интерполяционной сетки. Он может быть как переменным, так и постоянным.
  • Функцию ~F(x) — интерполирующей функцией или интерполянтом.

Пример[править | править вики-текст]

1. Пусть мы имеем табличную функцию, наподобие описанной ниже, которая для нескольких значений ~x определяет соответствующие значения ~f:

~x ~f(x)
0 0
1 0,8415
2 0,9093
3 0,1411
4 −0,7568
5 −0,9589
6 −0,2794

Интерполяция помогает нам узнать, какое значение может иметь такая функция в точке, отличной от указанных точек (например, при x = 2,5).

К настоящему времени существует множество различных способов интерполяции. Выбор наиболее подходящего алгоритма зависит от ответов на вопросы: как точен выбираемый метод, каковы затраты на его использование, насколько гладкой является интерполяционная функция, какого количества точек данных она требует и т. п.

2. Найти промежуточное значение (способом линейной интерполяции).

6000 15.5
6378  ?
8000 19.2

?=15.5+\frac{6378-6000}{(8000-6000)}* \frac{19.2-15.5}{1}=16.1993

В языках программирования[править | править вики-текст]

Пример линейной интерполяции для функции y=3x+x^2. Пользователь может ввести число от 1 до 10.

Fortran[править | править вики-текст]

 
program interpol
integer i
real x,y,xv,yv,yv2
dimension x(10)
dimension y(10)
call prisv(x,i)
call func(x,y,i)
write(*,*) 'vvedite chislo'
read(*,*) xv
if ((xv>=1).and.(xv<=10)) then
call funcv(xv,yv)
call sver(x,y,yv2,xv)
write(*,*) yv2
else
write(*,*) 'false'
end if
read(*,*)
end
subroutine prisv(x,i)
real x
dimension x(10)
integer i
do i=1,10
x(i)=1*i
end do
end subroutine
 
subroutine func(x,y,i)
real x,y
dimension x(10)
dimension y(10)
integer i
do i=1,10 
y(i)=3*x(i)+x(i)**2
end do 
end subroutine
 
subroutine funcv(xv,yv)
real xv,yv
yv=3*xv+xv**2
write(*,*) yv 
end subroutine
 
subroutine sver(x,y,yv2,xv)
real x,y,xv,yv2
dimension x(10)
dimension y(10)
integer i
do i=1,10
if ((x(i)<=xv).and.(x(i+1)>xv)) then
yv2=((xv-x(i))*(y(i+1)-y(i))/(x(i+1)-x(i)))+y(i)
end if
end do 
end subroutine

C++[править | править вики-текст]

 
main ()
{
system("COLOR 0A");
double ob, x1 , x2 , y1 , y2, p1 , p2 , pi , skolko , status;
 
    system("echo Интерполяция X1 - X2 ");
    system("echo Ввести число:");
    cin >> ob;
 
    system("echo Например 62, C1 = 60, L1 = 1.31 ,C2 = 80 , L2 = 1.29");
    cout << "C1 = ";
           cin >> x1;
    cout << "L1 = " ;
           cin >> x2;
    cout << "C2 = " ;
           cin >> y1;
    cout << "L2 = " ;  
           cin >> y2;
 
      p1 = y1 - x1;
      p2 = y2 - x2;
 
    pi = p2 / p1;
      skolko = ob - x1;
      status = x2 + (pi * skolko);
 
    cout << "_______________________________________________________________";
    cout << endl <<  ob << " = " << status;
    _getch ();
    system("CLS");
 
    return 0;
}

Способы интерполяции[править | править вики-текст]

Интерполяция методом ближайшего соседа[править | править вики-текст]

Простейшим способом интерполяции является интерполяция методом ближайшего соседа.

Интерполяция многочленами[править | править вики-текст]

На практике чаще всего применяют интерполяцию многочленами. Это связано прежде всего с тем, что многочлены легко вычислять, легко аналитически находить их производные и множество многочленов плотно в пространстве непрерывных функций (теорема Вейерштрасса).

Обратное интерполирование (вычисление x при заданной y)[править | править вики-текст]

Интерполяция функции нескольких переменных[править | править вики-текст]

Другие способы интерполяции[править | править вики-текст]

Смежные концепции[править | править вики-текст]

  • Экстраполяция — методы нахождения точек за пределами заданного интервала (продление кривой)
  • Аппроксимация — методы построения приближённых кривых

См. также[править | править вики-текст]