Maple 9.5/10 в математике, физике и образовании - Владимир Дьяконов
Шрифт:
Интервал:
Закладка:
opts — не обязательный параметр в форме одного или более выражений вида order=k или knots=knotlist.
Примеры применения функции BSplineCurve с порядком, заданным по умолчанию и с третьим порядком (кубический B-сплайн), представлены на рис. 5.19.
Следует отметить, что при малом числе точек стыковки аппроксимация B-сплайнами дает невысокую точность, что хорошо видно из рис. 5.19.
Рис. 5.19. Применение функции BSplineCurve
5.9.4. Сравнение полиномиальной и сплайновой аппроксимаций
Когда аппроксимируется гладкая функция, представленная парами данных с равномерным расположением узлом, то данные как полиномиальной, так и сплайновой аппроксимаций различаются незначительно. В этом случае применение куда более сложной сплайновой аппроксимации, как правило, кажется мало обоснованным.
Однако если точки данных расположены неравномерно, то применение полиномиальной аппроксимации может оказаться совершенно неприемлемым. Это отчетливо показывает пример, представленный на рис. 5.20. Здесь задана на первый взгляд (судя по расположению точек) не слишком сложная и чуть колебательная зависимость. Однако полиномиальная аппроксимация (представлена тонкой кривой), особенно в начале — в интервале первых трех точек, дает явно ошибочные сильные выбросы. А вот сплайновая аппроксимация (показана более жирном линией) ведет себя куда более приемлемо.
Рис. 5.20. Сравнение полиномиальной и сплайновой аппроксимаций для функции, заданной парами данных при неравномерном расположении узлов
Причина лучшего поведения сплайновой аппроксимации здесь вполне очевидна — напоминая поведение гибкой линейки, сплайновая функция эффективно сглаживает выбросы кривой в промежутках между точками.
5.9.5.Сплайновая аппроксимация при большом числе узлов
При большом числе узлов (десятки-сотни и выше) данные представленные точками выглядят нередко не представительно. Например, на рис. 5.21 показан документ, иллюстрирующий сплайновую аппроксимацию функции синуса, представленной 31 отсчетом, но без вывода графика сплайновой функции. Несмотря на равномерное расположение узлов по графику точек невозможно определить, что это функция синуса.
Рис. 5.21 Пример представления функции синуса 31 узловыми точками при равномерном расположении узлов
Рисунок 5.22 отличается от рис. 5.21 только построением сплайновой функции, представленной графическим объектом g1 (на рис. 5.19 он исключен из параметров функции display). После построения графика сплайновой аппроксимирующей функции становится вполне ясным, что точки представляют функцию синуса, которая прекрасно представляется отрезками полиномов сплайн-функции.
Рис. 5.22. Пример сплайновой аппроксимации синусоидальной функции
Здесь полезно обратить внимание на то, что за пределами области узловых точек значения, возвращаемые сплайновой функцией в пакете CurveFitting равны нулю. Так что экстраполяция по ней невозможна (в тоже время функция spline такой возможностью обладает).
5.9.6. Функция реализации метода наименьших квадратов LeastSquares
До сих пор мы рассматривали методы числовой аппроксимации функций или данных, при которых порядок полиномов определялся числом отсчетов функции.
Функция LeastSquares служит для реализации аппроксимации по методу наименьших квадратов. При этом методе происходит статистическая обработка данных (самих по себе или представляющих функцию) исходя из минимума среднеквадратической погрешности для всех отсчетов. Эта функция реализуется в формах:
LeastSquares(xydata, v, opts)
LeastSquares(xdata, ydata, v, opts)
Все входящие в нее параметры были определены выше (см. параметры функции BSplineCurve). Параметр opts задается в форме выражений weight=wlist, curve=f или params=pset.
Следующие примеры иллюстрируют применение функции LeastSquares:
> with(CurveFitting):
LeastSquares([[0,.5], [1,2], [2,4], [3,8]], v);
-.050000000000 + 2.44999999999999974 v> LeastSquares([0,1,2,3], [1,2,4,6], v, weight-[1,1,1,10]);
> LeastSquares([0,1,3,5,6], [1,-1,-3,0,5], v, curve=a*v^2+k*v+c);
Наглядную иллюстрацию приближения группы точек кривой (в данном случае представленной полиномом четвертой степени) дает рис. 5.23. Кривая в облаке точек располагается таким образом, что площади квадратов над кривой и под ней в сумме равны нулю.
Рис. 5.23. Графическое представление метода наименьших квадратов
В конце этой главы мы вернемся к реализации метода наименьших квадратов при выполнении регрессионного анализа, построенного па этом методе.
5.9.7. Функция полиномиальной аппроксимации
Функция Polynomial Interpolation реализует полиномиальную интерполяцию и может использоваться в виде:
PolynomialInterpolation(xydata, v)
PolynomialInterpolation(xdata, ydata, v)
Параметры функции были определены выше. Параметр v может быть как именем, так и численным значением. Примеры применения функции представлены ниже
> with(CurveFitting):
PolynomialInterpolation([[0,0], [1,2], [2,4], [3, 3]], z);
> PolynomialInterpolation([0, 2, 5, 8], [2, a, 1, 3], 3);
5.9.8. Функция рациональной аппроксимации
Функция рациональной интерполяции задается в виде:
RationalInterpolation(xydata, z, opts)
RationalInterpolation(xdata, ydata, z, opts)
где необязательный параметр opts задается выражениями method=methodtype или degrees=[d1,d2]. Функция возвращает результат в виде отношения двух полиномов.
Параметр methodtype может иметь значения lookaround или subresultant, задающие учет или пропуск сингулярных точек.
Пример применения функции RationalInterpolation (загрузка пакета опущена, но предполагается):
> xpoints := [0,1,2,3,4,-1]: ypoints := [0, 3, 1, 3, а, 1/11]:
f := RationalInterpolation(xpoints, ypoints, x);
> for i from 1 to 6 do normal(eval(f,x=xpoints[i])-ypoints[i]) end do;
5.9.9. Функция вычисления обычных сплайнов Spline
Функция
Spline(xydata, v, opts)
Spline(xdata, ydata, v, opts)
вычисляет обычные (не В-типа) сплайны. Примеры ее применения даны ниже:
> 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] и требовала, по возможности, наименьшего числа арифметических операций для каждого вычисления. Втайне не вредно помечтать о том, чтобы после аппроксимации время вычислений уменьшилось бы хотя бы в несколько раз. Что получится на деле, вы увидите чуть позже. А пока войдем в дебри аппроксимации.