Опубликован: 18.05.2011 | Доступ: свободный | Студентов: 976 / 106 | Оценка: 4.40 / 4.20 | Длительность: 12:30:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Теги:
Лекция 16:
Приближение сплайнами
Практическое занятие "Аппроксимация функций"
Цель занятия
Практическое проведение интерполяции для конкретных функций и изучение свойств интерполяционных функций.
Практическая задача
В настоящем занятии мы разберем пример построения интерполяционного многочлена в форме Лагранжа. Мы рассмотрим простейшую функцию









Для использования этого многочлена, разумеется, нет необходимости раскрывать скобки. Для работы с этим многочленом мы напишем небольшой код на языке C#.
![\begin{verbatim}
double pi = Math.PI;
int N = 4;
double[] xn = { 0, pi / 6.0, pi / 4.0, pi / 3.0, pi / 2.0 };
double[] fn = { 0, 1.0 / 2.0, 1.0 / Math.Sqrt(2.0),
Math.Sqrt(3.0) / 2.0, 1 };
double[] hn = new double[N + 1];
int i, j;
for (i = 0; i <= N; i++)
{
hn[i] = 1.0;
for (j = 0; j <= N; j++)
{
if (i == j)
{
continue;
}
hn[i] *= xn[i] - xn[j];
}
}
\end{verbatim}](/sites/default/files/tex_cache/120afdbe3d325209f9350dd67c94331d.png)
![\begin{verbatim}
double x = pi / 5.0;
double res = 0;
for (i = 0; i <= N; i++)
{
double y;
y = fn[i] / hn[i];
for (j = 0; j <= N; j++)
{
if (i == j)
{
continue;
}
y *= (x - xn[j]);
}
res += y;
}
Console.WriteLine("sin(pi/5) = {0}; Delta = {1}", res,
Math.Abs(res - Math.Sin(x)));
\end{verbatim}](/sites/default/files/tex_cache/5c8ad59bb89ac0c0040ed16166319ac0.png)
В этой программе мы вычисляем значение нашего интерполяционного
многочлена в промежуточной точке и сравниваем с
"точным" значением
. После запуска мы
получим следующий результат.

Можно считать, что это очень не плохой результат для интерполяции функции по столь малому количеству точек.