Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Control the Precision and Accuracy of Numerical Results - Wolfram Mathematica

Контроль точности и аккуратности численных результатов

Mathematica работает как с точными величинами, так и с приблизительными числами. Используя функцию N, Вы можете получить численную аппроксимацию к точной величине с любой точностью или аккуратностью. В вычислениях с приблизительными числами произвольной точности, Mathematica отслеживает распространение численной погрешности. Использование высокоточных чисел дает достоверные результаты там, где другие численные системы терпят неудачу.

Mathematica дает точный ответ везде, где это возможно:

In[206]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_1.gif

Out[206]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_2.gif

Используйте функцию N для получения численного приближения к точному результату:

In[207]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_3.gif

Out[207]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_4.gif

В Mathematica, "точность" фактически означает количество значащих цифр. Вы можете указать точность результата при помощи второго аргумента функции N. Вычислим результат с точностью в 50 значащих цифр:

In[208]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_5.gif

Out[208]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_6.gif


"Аккуратность" фактически означает количество десятичных разрядов после запятой. Зададим {?,a} в качестве второго аргумента функции N для получения результата с аккуратностью a. Символ ? обозначает любую точность. Например, зададим аккуратность 10:

In[91]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_7.gif

Out[91]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_8.gif

Используйте функции Precision и Accuracy чтобы найти точность и аккуратность для любого числа. Удостоверимся в точности и аккуратности результатов, полученных с помощью функции N:

In[29]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_9.gif

Out[29]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_10.gif

Используйте формат число`n для прямого ввода числа с количеством значащих цифр равным n, а также число``a для прямого ввода числа с аккуратностью в a знаков после запятой:

In[42]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_11.gif

Out[42]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_12.gif

    

Mathematica работает с точными числами и двумя различными типами приближенных чисел: числами с машинной степенью точности, которые используют преимущество специализированных аппаратных средств для выполнения быстрых арифметических операций на вашем компьютере, и числами с произвольной точностью, соответствующей заданному количеству разрядов.

Точные числа имеют бесконечную точность и аккуратность:

In[225]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_13.gif

Out[225]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_14.gif

Числа, введенные с десятичной точкой, обычно интерпретируются как числа с машинной степенью точности, которые имеют точность MachinePrecision:

In[106]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_15.gif

Out[106]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_16.gif

По умолчанию, результаты функции N являются числами с машинной точностью:

In[148]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_17.gif

Out[148]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_18.gif

Числа с машинной точностью обычно содержат чуть менее 16 цифр, что соответствует 53 битам:

In[172]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_19.gif

Out[172]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_20.gif

Числа с произвольной точностью вводятся при помощи число`n и число``a. Введем число с произвольной точностью в 10 знаков и такое же число с аккуратностью в 10 знаков:

In[4]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_21.gif

Out[4]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_22.gif

In[5]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_23.gif

Out[5]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_24.gif

Заданная для числа x точность в 10 знаков влечет за собой определенное значение для его аккуратности, которая, в данном случае, составляет менее 10. Разница между ними ( ControlThePrecisionAndAccuracyOfNumericalResultsRU_25.gif) является, по существу, вещественным показателем числа, значение которого также дается функцией ControlThePrecisionAndAccuracyOfNumericalResultsRU_26.gif:

In[6]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_27.gif

Out[6]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_28.gif

Заданная для y аккуратность в 10 знаков после запятой влечет за собой определенное значение для его точности, которая, в данном случае, составляет более 10:

In[7]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_29.gif

Out[7]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_30.gif

Аккуратность для числа может приобретать отрицательное значение, указывая на то, что все отличные от нуля цифры находятся слева от десятичной точки:

In[184]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_31.gif

Out[184]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_32.gif

    

Машинная точность MachinePrecision считается наименьшей точностью среди остальных. Это происходит потому, что несмотря на то, что числа с машинной точностью всегда состоят из чуть менее 16 цифр, нельзя утверждать, что все они являются корректными.

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

In[211]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_33.gif&# 1083; &# 1083;

Out[211]//InputForm=

0.3333333333333333

Здесь ни одна из цифр результата, данного с машинной точностью, не является корректной по причине погрешности в вычитании двух чисел, которые практически идентичны если представлены с машинной точностью:

In[205]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_34.gif&# 1083; 

Out[205]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_35.gif

Чтобы быть уверенным в n-ном количестве цифр, воспользуйтесь функцией ControlThePrecisionAndAccuracyOfNumericalResultsRU_36.gif. Давайте получим 10 корректных цифр:

In[207]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_37.gif

Out[207]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_38.gif

Функция N не может дать результат с точностью выше чем была задана на входе. Здесь показано, что N не в состоянии получить результат со 100 цифрами, так как на входе точность составляет только 10 знаков:

In[240]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_39.gif

Out[241]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_40.gif

Здесь N не в состоянии получить результат с точностью в 6 знаков, так как на входе задано число с машинной точностью, которая рассматривается как наименьшая из всех возможных:

In[247]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_41.gif

Out[248]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_42.gif

Если Вы знаете, что приближенное число число является более точным, чем указывает функция ControlThePrecisionAndAccuracyOfNumericalResultsRU_43.gif, Вы можете явно задать ег о точность с помощью функции SetPrecision. Зададим число с желаемой степенью точности в 20 знаков, соответствующее числу 0.5 с машинной степенью точности:

In[246]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_44.gif

Out[246]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_45.gif

    

Когда выражение содержит приближенные числа, Вам обычно не нужно использовать функцию N. Mathematica автоматически вычисляет приближенный результат и определяет точность результата с учетом точности заданной при вводе. Как правило, точность результата будет отличаться от точности каждой части ввода.

Прибавим число с 10-ти значной точностью к числу с 1000-е значной точностью:

In[286]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_46.gif

Out[286]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_47.gif

Применим Precision к последнему полученному результату (%), чтобы увидеть, что Mathematica смогла определить, что результат имеет точность в 11 знаков:

In[287]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_48.gif

Out[287]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_49.gif

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

Используем /@ (краткую форму для Map) чтобы применить функцию Precision к каждой части списка вычислений, где использован&# 1099; числа с машинной точностью:

In[28]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_50.gif

Out[28]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_51.gif

Зачастую, точность результата не очень сильно отличается от той, которую имеет элемент ввода, обладающей наименьшей точностью:

In[296]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_52.gif

Out[296]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_53.gif

In[297]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_54.gif

Out[297]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_55.gif

В некоторых случаях, точность результата может быть намного меньше точности, заданной для ввода. Чаще всего это происходит при вычитании двух почти идентичных приближенных чисел:

In[5]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_56.gif

Out[5]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_57.gif

In[6]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_58.gif

Out[6]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_59.gif

Когда Вам нужен результат с определенной точностью или аккуратностью, как правило наилучшим способом является использование точных значений для ввода и использовании функции N. Это потому, что N иногда будет проводить вычисления с большей точностью, чем Вам требуется, чтобы получить результат, который удовлетворит Ваши условия.

Найдем приближенное решение выражения ControlThePrecisionAndAccuracyOfNumericalResultsRU_60.gif с точностью 20 знаков:

In[166]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_61.gif

Out[166]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_62.gif

In[167]:=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_63.gif

Out[167]=

ControlThePrecisionAndAccuracyOfNumericalResultsRU_64.gif