вычисляет обычные (не В-типа) сплайны. Примеры ее применения даны ниже:
> Spline([[0,1], [1,2], [2,5], [3,3]], х);
> Spline([0,1,2,3], [1,2,5,3], v, degree=1);
5.9.10. Функция аппроксимации непрерывными дробями
Функция ThieleInterpolation осуществляет интерполяцию на основе непрерывных дробей (Thiele's — интерполяцию). Она задается в виде:
ThieleInterpolation(xydata, v)
ThieleInterpolation(xdata, ydata, v)
Примеры применения данной функции представлены ниже:
> ThieleInterpolation([[1,3],[2,5],[4,75],[5,4]], х);
> ThieleInterpolation([1,2,а], [2,4,3], 3)
5.10. Выбор аппроксимации для сложной функции
5.10.1. Задание исходной функции и построение ее графика
Трудно представить себе область научно-технических расчетов более широкую и почитаемую, чем аппроксимация различных функциональных зависимостей. С получения простой аппроксимации сложной зависимости нередко начинаются (а часто и заканчиваются) научные исследования во многих областях как прикладной, так и фундаментальной науки. Покажем возможности в этом систем Maple на одном из комплексных примеров, давно помещенных в библиотеку пользователей системы Maple V R2, и переработанном для Maple 9.5/10. В этом примере используются многие из описанных выше средств приближения функций.
Воспользуемся ранее описанными возможностями пакета numapprox, для чего, прежде всего, подключим его:
> restart:with(numapprox):
Будем искать приемлемую аппроксимацию для следующей, отнюдь не простой, тестовой функции:
> f := х -> int(1/GAMMA(t), t=0..x ) / х^2;
> plot(f,0..4,color=black);
График этой функции представлен на рис. 5.24. С первого взгляда это простой график, но тут как раз тот случай, когда простота обманчива. Вы сразу заметите, что график строится медленно, поскольку в каждой из множества его точек системе Maple приходится вычислять значение интеграла с подынтегральной функцией, содержащей довольно каверзную гамма-функцию. И делает это Maple по сложному и медленному алгоритму адаптивного численного интегрирования.
Рис. 5.24. График аппроксимируемой функции
Итак, вычисление f(х) по ее интегральному представлению совершенно не эффективно. Наша цель состоит в разработке процедуры вычислений, которая дала бы 6 точных цифр результата в интервале [0..4] и требовала, по возможности, наименьшего числа арифметических операций для каждого вычисления. Втайне не вредно помечтать о том, чтобы после аппроксимации время вычислений уменьшилось бы хотя бы в несколько раз. Что получится на деле, вы увидите чуть позже. А пока войдем в дебри аппроксимации.
5.10.2. Аппроксимации рядом Тейлора
Начнем с аппроксимации функции хорошо известным рядом Тейлора степени 8 относительно середины интервала (точки с
> s := map(evalf, taylor(f(x), х=2, 9));
> TaylorApprox := convert(s, polynom):
Такой ряд позволяет использовать для вычислений только арифметические действия, что само по себе здорово! Для удобства преобразуем аппроксимацию в функцию, чтобы она соответствовала форме, указанной для первоначальной функции f(х). Тогда мы сможем построить график кривой ошибок для аппроксимации полиномом Тейлора:
> TaylorApprox := unapplу(TaylorApprox, х);
Кривая ошибок для аппроксимации полиномом Тейлора строится командой
> plot(f - TaylorApprox, 0..4, color=black);
и имеет вид, представленный на рис. 5.25. Эта кривая нас, прямо скажем, не слишком радует, поскольку погрешность в сотни раз превышает заданную.
Рис. 5.25. Кривая погрешности при аппроксимации рядом Тейлора
Типичное свойство аппроксимации рядом Тейлора состоит в том, что ошибка мала вблизи точки разложения и велика вдали от нее. В данном случае, самая большая ошибка имеет место в левой оконечной точке. Чтобы вычислить значение ошибки в точке х=0, что ведет к делению на нуль (см. определение для f (х)), мы должны использовать значение предела:
> maxTaylorError := abs(limit(f(x), х=0) - TaylorApprox(0));
Итак, в самом начале наших попыток мы потерпели полное фиаско, получив совершенно неприемлемое значение погрешности в сотни раз больше заданной. Но отчаиваться не стоит, ибо, как говорят, «даже у хорошей хозяйки первый блин — комом».