Иллюстрированный самоучитель по Mathematica
Численные расчеты — пакет NumericalMath
Пакет расширения
NumericalMath содержит множество полезных функций для тех, кто имеет дело с
численными расчетами. В их числе функции для выполнения высокоточных аппроксимаций
рациональными функциями, численного интегрирования и дифференцирования, вычисления
пределов функций, решения уравнений, разложения в ряд и т. д. Ниже описано подавляющее
большинство функций этого расширения. Исключены лишь отдельные функции, представляющие
ограниченный интерес и несложные для самостоятельного изучения (в подпаке-mах
Butcher, Microscope и ComputerArithmetic).
Аппроксимация аналитических функций — Approximations
Подпакет
Approximations содержит ряд функций для улучшенной рациональной аппроксимации
аналитических функций. Для рациональной интерполяции и аппроксимации функций
по заданным значениям абсцисс служит следующая функция:
-
Rationallnterpolation
[f, {x,m, k}, {x
1
, x
2
, ...,.x
m+k+1
} ] — возвращает
аппроксимирующее функцию f выражение в виде отношения полиномов а степенью
полинома числителя m и знаменателя k в абсциссах, заданных списком {x
l
,x
2
,...,x
m+jt+1
}.
Пример применения
этой функции:
<<NumericalMath `Approximations`
ril =
Rationallnterpolation[ Exp[x], {х, 2, 4}, {0, 1/3, 2/3, 1, 4/3, 5/3, 2}]
Построим
график погрешности аппроксимации, то есть график разности функ
ии ril и Ехр
[х] — он представлен на рис. 11.22.
Нетрудно
заметить, что если в центральной части области аппроксимации
погрешность мала
(менее 5-10-
7
), то у правого края она резко возрастает.
Представленная
функция может использоваться и в иной форме:
Rationallnterpolation[f,{х,
m, k},{x, xmin, xmax}]
Рис.
11.22.
График погрешности рациональной аппроксимации экспоненциальной
функции
В данном
случае выбор абсцисс осуществляется автоматически в интервале от xmin до
mах.
В отличие от первого случая, когда абсциссы могли быть расположены неравномерно,
в данном случае расположение их будет равномерным. Приведем пример аппроксимации
функции синуса в интервале от n до n:
ri2 = RationalInterpolation[Sin[x],{x,3,4},{x,-Pi,Pi}]
Интересно
оценить погрешность аппроксимации. Для этого достаточно построить график разности
аппроксимирующей и аппроксимируемой функций. Это построение представлено на
рис. 11.23. Любопытно, что хотя максимальная погрешность и значительна, резких
выбросов погрешности в данном случае нет.
Рис.
11.23.
График погрешности аппроксимации синусоидальной функции
При рациональной
аппроксимации можно задать опции WorkingPrecision и Bias со значениями по умолчанию
$MachinePrecision и 0 соответственно. Опция Bias обеспечивает автоматическую
расстановку узлов интерполяции. При Bias->0 обеспечивается симметрирование
выбросов погрешности, дающее наименьшее ее значение в пиках. Ниже приведен пример
интерполяции (аппроксимации) экспоненциальной функции в интервале изменения
х от 0 до 2:
ri3
= RationalInterpolation[Exp[x],{x,2,4},{x,0,2},Bias->.25]
Построение
графика погрешности (рис. 11.24) показывает, что правильным выбором центра интерполяции
можно существенно уменьшить ее погрешность. Теперь большая погрешность наблюдается
в левой части графика. Однако резкого выброса погрешности в данном случае нет.
Рис.
11.24.
Погрешность аппроксимации экспоненты при выборе опции Bias->.25
Из приведенных
примеров ясно, что рациональная аппроксимация способна дать существенное уменьшение
погрешности при некотором оптимальном расположении узлов аппроксимации и выравнивании
погрешностей по абсолютной величине в точках минимумов и максимумов кривой погрешности.
Это лежит в основе так называемой минимаксной аппроксимации. Она реализуется
следующей функцией:
-
MiniMaxApproximation[f,{x,{xmin,xmax},m,k}]
— возвращает рациональную функцию минимаксной аппроксимации f при степени
полиномов числителя и знаменателя {m, k} ив интервале изменения х от xmin
до xmax:
-
MiniMaxApproximation
[f, approx, {x, {xmin, xmax} ,m, k} ] —возвращает рациональную функцию минимаксной
аппроксимации f при степени полиномов числителя и знаменателя
{m, k} ив интервале
изменения х от xmin до xmax с возможностью выбора метода аппроксимации
approx.
Эта аппроксимация
использует итерационный алгоритм вычислений. Они начинаются с первого шага,
на котором используется функция Rational
Interpolation. Затем аппроксимация
последовательно улучшается применением алгоритма Ремеза, лежащего в основе этого
вида аппроксимации.
Функция MiniMaxApproximation
возвращает два списка — первый с координатами абсцисс, при которых наблюдается
максимальная погрешность, второй содержит рациональную функцию аппроксимации.
Ниже представлен пример аппроксимации экспоненциальной функции:
mmlist
= MiniMaxApproximation[Ехр[х], {х, {0, 2}, 2, 4}]
Выделим формулу
аппроксимации:
mmfunc
= mmlist[[2, 1]]
Теперь можно
построить график погрешности аппроксимации (рис. 11.25).
Рис.
11.25.
График погрешности при минимаксной аппроксимации экспоненциальной
функции
Следует отметить,
что малость абсолютной ошибки для ряда функций (например, тригонометрических)
может приводить к большим относительным погрешностям в точках, где функции имеют
нулевые значения. Это может привести к отказу от выполнения аппроксимации вследствие
исчерпания числа итераций (опция Maxlterations по умолчанию имеет значение 20).
Такой случай наблюдается, например, при исполнении следующей команды:
MiniMaxApproximation[Cos[x],
{х, {1, 2}, 2, 4}]
Делением функции
на (x-Pi/2) можно исключить эту ситуацию:
MiniMaxApproximation[Cos[x]/(x-Pi/2),{*,{1!,2},2,4}]
[[2,1]]
График погрешности
для этого примера представлен на рис. 11.26. Обратите внимание на то, что в
этом примере погрешность аппроксимации не превышает (б...7)-10-
10
.
В приложении
дан список функций общей рациональной интерполяции (аппроксимации) для аналитических
зависимостей, заданных параметрически. Примеры применения этого довольно редкого
вида аппроксимации можно найти в справочной базе данных системы
Mathematica.
Там же можно найти дополнительные соображения по уменьшению погрешности аппроксимации.
Рис.
11.26.
График погрешности при минимаксной аппроксимации функции косинуса
Нули функций Бесселя — BesselZeros
В подпакете
BesselZeros определены функции, дающие список аргументов функций Бесселя в их
первых п нулевых точках: BesselJZeros [mu, n],
Bessel-YZeros[mu,n], BesselJPrimeZeros[mu,n], BesselYPrimeZeros[mu,n] и др. Ввиду редкого использования функций этого класса
ограничимся парой примеров их применения:
<<NumericalMath`BesselZeros`
BesselJZeros[0,
5]
{2.40483, 5.52008,
8.65373, 11.7915, 14.9309}
BesselJYJYZeros[2,
6/5, 3, WorkingPrecision -> 20]
{15.806622444176579073,
31.46556009153683, 47.1570167108650315}
Поиск корней уравнений с интерполяцией — InterpolateRoot
Подпакет
InterpolateRoot дает средства для ускоренного и более точного поиска корней
уравнений по сравнению с соответствующими функциями ядра. Достигается это за
счет применения интерполяции функции, корни которой ищутся. Под-пакет задает
функцию InterpolateRoot [f, {х, a, b} ], которая находит корень функции f в
интервале х от а до b. Вместо функции f можно задавать уравнение
eqn. Возможны
опции AccuracyGoal->Automatic, Maxlterations->15, WorkingPrecision->$MachinePrecision
и ShowProgress->False (указаны принятые по умолчанию значения).
Примеры применения
данной функции (n — число итераций):
<<NumericalMath`
InterpolateRoot`
n = 0; FindRoot[n++;
Exp[x] == 2, {x, 0, 1},
WorkingPrecision
-> 100, AccuracyGoal -> 95]
{x->
0.693147180559945309417232121458176568075500134360255
2541206800094933936219696947156058633269964186876}
n
17
n = 0; f[x_]
:= (n++; Exp[x]-2) /; NumberQ[x]
InterpolateRoot[f[x], {x, 0, 1), WorkingPrecision -> 100,
AccuracyGoal
-> 95]; n 10
InterpolateRoot[Exp[x]
==2, {x, 0, 1},ShowProgress -> True,
WorkingPrecision
-> 40]
{0, 0.58197670686932642439}
{21, 0, -0.12246396352039524100}
{1, 0.7019353037882764014443370764853594873432}
{21, 20, 0.0130121629575404389120930392554}
{3,0.6932065772065263165289985793736618546663}
{21, 20, 0.000062480788747713548804773113708}
{6, 0.6931471932603933841618726058237307884661}
{21, 20, 1.26443483693584888038460396742xHT8}
{12, 0.693147180559945119457822446
95590259222308309027205042483074}
{40, 20, -1.89953767048152086910014102216x
10-16}
{24, 0.6931471805599453094172321214
5786257157118117337249076750141}
Реализация интервальных методов
—IntervalRoots
Иногда важно
не найти приближенное значение корня, а уточнить интервал, в котором он находится.
В подпакете IntervalRoots для этого используется ряд известных методов, реализованных
следующими функциями:
-
IntervalBisection [f
,x, int, eps] — находит корень функции f(x) путем уточнения исходного
интервала int с заданной погрешностью eps методом половинного деления;
-
IntervalSecant [f ,x,
int, eps] — находит корень функции f(x) путем уточнения исходного
интервала int с заданной погрешностью eps методом секущей;
-
IntervalNewton [ f,
x, int, eps ] — находит корень функции/(x) путем уточнения исходного интервала
int с заданной погрешностью eps методом Ньютона (касательной).
Во всех функциях
можно опциями задать максимальное число рекурсий
(Max-Recursion) и погрешность (WorkingPrecision). Примеры применения этих функций даны ниже:
<<NumericalMath`IntervalRoots`
IntervalBisection[Sin[x], x,
Interval[{2., 8.}], .1]
Interval[{3.125,
3.218750000000001}, {6.218750000000003, 6.312500000000006}]
IntervalBisection[Sin[x],
x, Interval[{2., 8.}], .01]
Interval[{3.125,
3.17188}, {6.26563, 6.3125}]
IntervalBisection[Sin[x],
x, Interval[{2., 8.}], .01, MaxRecursion -> 10]
Interval[{3.13672,
3.14258}, {6.27734, 6.2832}]
IntervalSecant[Sin[x],
x, Interval[{2., 8.}], .01]
Interval[{3.14159,
3.1416}, {6.28316, 6.28321}]
IntervalSecant[Sin[x],
x, Interval[{2., 8.}], .01]
Interval[{3.14159,
3.1416}, {6.28316, 6.28321}]
IntervalBisection[Sin[x], x,
Interval[{2,
8}], .1, WorkingPrecision -> Infinity]
Табличное численное интегрирование — Listlntegrate
Встроенная
в ядро функция NIntegrate вычисляет определенные интегралы при известной подынтегральной
функции. Однако нередко, например при экспериментах, такая функция задается
таблицей или списком значений. В подпакете List-Integrate имеются функции для
решения этой задачи — табличного интегрирования:
-
Listlntegrate [ {yl,
y2,..., yn} ,h] — возвращает численное значение интеграла для функции, заданной
списком ординат yi при заданном шаге h по х;
-
Listlntegrate [ {yl,
y2,..., yn}, h, k] — возвращает численное значение интеграла для функции,
заданной списком ординат yi при заданном шаге h по х, используя k точек каждого
подинтервала;
-
Listlntegrate [ {{xl,
yl}, {х2, у2 },..., {хп, уп}}, k] — возвращает численное значение интеграла
для функции, заданной списком координат {х.., у.}. используя k точек
для каждого подынтервала.
Примеры применения
данной функции:
<<NumericalMath`Listlntegrate`
data = Tablet
n^2, {n, 0, 7}]
{0, 1, 4, 9,
16, 25, 36, 49}
ListIntegrate[data,
1]
343/3
Listlntegrate[{{0,0},{1,1},{2,4},{5,25},{7,49}},2]
241/2
При проведении
интегрирования для данных, заданных таблично, можно использовать интерполяцию:
арр
= Listlnterpolation[data,{{0,7}}] Integrate[app[x],{x,0,7}]
343/3
Integrate[Interpolation[{{0,0},{1,1},{2,4},
{5,25}, {7,49}},
InterpolationOrder->l][x],{x,0,7}]
241/2
Численное вычисление пределов — NLimit
В подпакете
N limit определена функция
Nlimit[expr,х->х0]
для численного
вычисления пределов выражений ехрг (см. примеры ниже):
<<NumericalMath` NLimit`
NLimit[Zeta[s]
- l/(s-l), s->l]
0.577216
N[EulerGamma]
0.577216
С помощью
команды Options [NLimit] можно просмотреть опции, которые используются функцией
NLimit по умолчанию. В этом подпакете задано также вычисление бесконечных сумм
Эйлера EulerSum[f, { i, imin, Infinity} ]. Например:
EulerSum[(-l)^k/(2k
+ 1) , {k, 0, Infinity}]
0.785398
EulerSumt(-1)^k/(2k
+1), {k, 0, Infinity},
WorkingPrecision->40,
Terms->30, ExtraTerms->30]
0.78539816339744830961566084579130322540
%- N[Pi/4,
40]
-2.857249565x
10-29
Имеется также
функция вычисления производной в численном виде:
-
ND [ f, х, хО] — вычисляет
первую производную f(x) в точке х0;
-
ND[f, {x,n} ,х0] —
вычисляет п-ю производную f(X) в точке х0. Пример вычисления
производной:
ND[Exp[Sin[x]],
х, 2]
-1.03312
Options[ND]
{WorkingPrecision->
16, Scale-> 1, Terms-> 7, Method-> EulerSum]
В некоторых
случаях вычисления могут быть ошибочными. Тогда следует использовать опции —
особенно опцию выбора метода Method. Помимо метода по умолчанию
(EulerSum) можно
использовать NIntegrate (метод интегрирования по формуле Коши).
Численное вычисление остатка — N Residue
В подпакете
NResidue имеется функция вычисления остатка NResidue
[expr, {x, x0} ] в точке
х=х0:
<<NumericalMath` NResidue`
NResidue[1/z, {z, 0}]
1. + 6.35614x
10-18 I
Residue[f, {z, 1.7}]
0
NResidue[f, {z, 1.7}]
0.259067 - 1.9353xl0-17I
l/((z+.2+.5
I)(z+.2-.5 I)) /. z -> 1.7
0.259067 +
0. I
Options[NResidue]
Обратите
внимание на возможные опции для этой функции в последнем примере.
Численное разложение в ряд — NSeries
Подпакет
NSeries вводит функцию NSeries [f, {x,xO,n}], которая дает численный ряд, аппроксимирующий
функцию f(x) в окрестности точки х = х
0
, включая термы
от (х -х
0
)
-n
до (х - х
0
)
п
.
Примеры применения
данной функции:
<<NumericalMath`NSeries`
NSeries[Sin[х],
{х, -2, 2}]
Rationalize[Chop[%]]
Rationalize[Chop[NSeries[Log[x], {x, 1, 5}, Radius -> 1/8]]]
Rationalize[Chop[NSeries[Exp[x], {x, 0, 5},
WorkingPrecision
-> 40, Radius -> 1/8]]]
Rationalize[Chop[NSeries[Exp[x], {x, 0, 5}, Radius -> 4]]]
Chop[NSeries[Zeta[s], {s, 1, 3}]]
Вычисление коэффициентов формулы интегрирования Ньютона—Котесса — NewtonCotes
Функция
NIntegrate,
имеющаяся в ядре системы Mathematica, реализует метод интегрирования Гаусса—Кронрода.
Еще одним известным методом интегрирования является метод Ньютона—Котесса,
сводящий интегрирование к вычислению взвешенных ординат функции в равномерно
расположенных точках оси абсцисс. Для реализации метода используются следующие
функции:
-
NewtonCotesWeights [n,
a, b] — возвращает список весовых коэффициентов и абсцисс узловых точек
{wi, xi} для квадратуры Ньютона—Котесса на интервале от а до
b;
-
NewtonCotesError [n,
f, a, b] — возвращает погрешность формулы Ньютона—Котесса для заданной функции
f.
Примеры применения
этих функций представлены ниже:
<<NumericalMath` NewtonCotes`
NewtonCotesWeights[5,
0, 10]
NewtonCotesError[5, f, 0, 10]
NewtonCotesError[5, f, a, a+h]
NewtonCotesWeights[5,
-0, 10, QuadratureType -> Open]
NewtonCotesError[5, f, 0, 10, QuadratureType ->
Open]
Обратите
внимание на то, что приведенные формулы готовят данные для численного интегрирования
методом Ньютона—Котесса, но не выполняют самого интегрирования.
Что нового мы узнали?
В этом уроке
мы научились:
-
Пользоваться алгебраическими
функциями пакета Algebra.
-
Применять вычислительные
функции пакета Calculus.
-
Работать с функциями
дискретной математики из пакета DiscreteMath.
-
Производить геометрические
расчеты с помощью пакета Geometry.
-
Выполнять алгебраические
вычисления с помощью пакета LinearAlgebra.
-
Пользоваться расширенными
функциями теории чисел из пакета NumberTheory.
-
Осуществлять численные
расчеты с помощью пакета NumericalMath.
|