очень странный вопрос в математике - PullRequest
1 голос
/ 31 марта 2011

Я делаю это в ММА v7.0:

r[x_] := Rationalize[x, 0]; N[Nest[Sqrt, 10., 53] // r, 500]

Это дало мне 1.000000000000000222044604925031308084726333618164062500000000000000000

Однако, если я пойду на шаг дальше N[Nest[Sqrt, 10., 54] // r, 500]

Я получил все нули. Кто-нибудь знает объяснение, или это ошибка?

Кроме того, похоже, что для получения большего числа цифр из решения Nest[Sqrt, 10., 53] работает не очень хорошо. Как получить более значимые цифры для этого расчета?

Большое спасибо.

Редактировать

Если я сделал Nest[Sqrt, 10., 50], я все еще получил много значащих цифр.

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

У вас нет значащих цифр, кроме нулей, если вы сделаете это 54 раза. Следовательно, рационализация, как вы делаете (которая просто сохраняет битовый паттерн), дает то, что вы видели.

InputForm[n53 = Nest[Sqrt, 10., 53]]

Из [180] // InputForm = 1,0000000000000002

InputForm[n54 = Nest[Sqrt, 10., 54]]

Out [181] // InputForm = 1.

Rationalize[n53, 0]

4503599627370497/4503599627370496

Rationalize[n54, 0]

Out [183] ​​= 1

Для любопытных: проблема не в потере точности в смысле деградации с вычислением итераций. Действительно, повторение этих квадратных корней на самом деле увеличивает точность. Это можно увидеть с помощью ввода bignum.

InputForm[n54 = Nest[Sqrt, 10.`20, 54]]

Out [188] // InputForm = 1.0000000000000001278191493200323453724568038240908339267044`36.25561976585499

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

Причина не слишком загадочная. Назовите полученное значение 1 + eps. Тогда мы получим (1 + eps) ^ (2 ^ 54), равное (чтобы приблизить приближение) к 10. Разложение второго порядка тогда показывает, что eps должен быть меньше, чем машинный эпсилон.

InputForm[epsval = 

Первый [Выберите [ EPS /. N [Решить [Сумма [eps ^ j * Бином [2 ^ 54, j], {j, 2}] == 9, eps]], Head [#] === Real && #> 0 &]]] Из [237] // InputForm = +1,864563472253985 * ^ - 16

$MachineEpsilon

Out [235] = 2,22045 * 10 ^ -16

Даниэль Лихтблау Wolfram Research

3 голосов
/ 31 марта 2011
InputForm /@ NestList[Sqrt, 10., 54]

10.
3.1622776601683795
1.7782794100389228
1.333521432163324
1.1547819846894583
1.0746078283213176
1.036632928437698
1.018151721718182
1.0090350448414476
1.0045073642544626
1.002251148292913
1.00112494139988
1.0005623126022087
1.00028111678778
1.0001405485169472
1.0000702717894114
1.000035135277462
1.0000175674844227
1.0000087837036347
1.0000043918421733
1.0000021959186756
1.000001097958735
1.0000005489792168
1.0000002744895706
1.000000137244776
1.0000000686223856
1.000000034311192
1.0000000171555958
1.0000000085777978
1.0000000042888988
1.0000000021444493
1.0000000010722245
1.0000000005361123
1.0000000002680562
1.0000000001340281
1.000000000067014
1.000000000033507
1.0000000000167535
1.0000000000083769
1.0000000000041884
1.0000000000020943
1.0000000000010472
1.0000000000005236
1.0000000000002618
1.000000000000131
1.0000000000000655
1.0000000000000329
1.0000000000000164
1.0000000000000082
1.000000000000004
1.000000000000002
1.0000000000000009
1.0000000000000004
1.0000000000000002
1.

Бросить N[x, 500] на это все равно что пытаться выжать воду из камня.


Вышеприведенные вычисления выполняются с высокой точностью станка, что очень быстро. Если вы готовы отказаться от скорости, вы можете использовать арифметику произвольной точности Mathematica , указав не входную точность для входных значений. "Backtick" может быть использован для этого (как в примере ниже), или вы можете использовать SetPrecision или SetAccuracy. Здесь я укажу, что ввод - это число от 10 до 20 цифр точности.

NestList[Sqrt, 10`20, 54]

10.000000000000000000
3.1622776601683793320
1.77827941003892280123
.
.
.
1.00000000000000051127659728012947952
1.00000000000000025563829864006470708
1.000000000000000127819149320032345372

Как вы можете видеть, вам не нужно использовать InputForm, поскольку Mathematica автоматически распечатает числа произвольной точности в максимально возможное количество мест.

Если вы используете InputForm или FullForm, вы увидите обратный удар, а затем число, которое является текущей точностью этого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...