вычисляет обычные (не В-типа) сплайны. Примеры ее применения даны ниже:

> 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 относительно середины интервала (точки с х=2):

> s := map(evalf, taylor(f(x), х=2, 9));

s := 0.4065945998 - 0.1565945998(x-2) + 0.00209790791(х-2)2 + 0.01762626393(х- 2)3 - 0.006207547150(x-2)4 + 0.00057335662(x-2)5 + 0.00024331163 (x-2)6 - 0.00010010534(x-2)7 + 0.00001414211(х-2)8 + O((x-2) 9)

> TaylorApprox := convert(s, polynom):

Такой ряд позволяет использовать для вычислений только арифметические действия, что само по себе здорово! Для удобства преобразуем аппроксимацию в функцию, чтобы она соответствовала форме, указанной для первоначальной функции f(х). Тогда мы сможем построить график кривой ошибок для аппроксимации полиномом Тейлора:

> TaylorApprox := unapplу(TaylorApprox, х);

TaylorApprox := x→0.7197837994 - 0.1565945998x + 0.00209790791(x-2)2 + 0.01762626393(x-2)3 - 0.006207547150(x-2)4 + 0.00057335662(x-2)5 + 0.00024331162(x-2)6 - 0.00010010534(x-2)7 + 0.0000141421(x-2) 8

Кривая ошибок для аппроксимации полиномом Тейлора строится командой

> plot(f - TaylorApprox, 0..4, color=black);

и имеет вид, представленный на рис. 5.25. Эта кривая нас, прямо скажем, не слишком радует, поскольку погрешность в сотни раз превышает заданную.

Рис. 5.25. Кривая погрешности при аппроксимации рядом Тейлора

Типичное свойство аппроксимации рядом Тейлора состоит в том, что ошибка мала вблизи точки разложения и велика вдали от нее. В данном случае, самая большая ошибка имеет место в левой оконечной точке. Чтобы вычислить значение ошибки в точке х=0, что ведет к делению на нуль (см. определение для f (х)), мы должны использовать значение предела:

> maxTaylorError := abs(limit(f(x), х=0) - TaylorApprox(0));

maxTaylorError := 0.0015029608

Итак, в самом начале наших попыток мы потерпели полное фиаско, получив совершенно неприемлемое значение погрешности в сотни раз больше заданной. Но отчаиваться не стоит, ибо, как говорят, «даже у хорошей хозяйки первый блин — комом».

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату