Задача, от которой отказался Ричард Фейнман

В замечательной книге «Вы, конечно, шутите, мистер Фейнман!» есть эпизод, который привел меня к небольшой практической работе, что и послужило основой для создания данной статьи. А началось все с этого момента:
” Пол проходит по столовой, где все просто стоят на ушах. “Эй, Пол! – кричат они. – Фейнман – просто супер! Мы даем ему задачу, которую можно сформулировать за десять секунд, и он за одну минуту дает ответ с точностью до 10 процентов. Дай ему какую-нибудь задачу!” Почти не останавливаясь, он говорит: “Тангенс 10 градусов в сотой степени”. Я влип: для этого нужно делить на число пи до ста десятичных разрядов! Это было безнадежно!”.

В приведенном фрагменте переводчик ошибся. Пол Олам просит Фейнмана вычислить тангенс числа 10 в сотой степени. И речь идет о радианах, а не градусах. Именно в такой формулировке задача становится неподъемной для будущего нобелевского лауреата.
Я решил рассмотреть более простую задачу. А именно, как узнать сколько будет tg(10°) в сотой степени? Размышление над данным вопросом послужило толчком для проведения небольшого вычислительного эксперимента, результатами которого я и хочу поделиться. А начал я с того, что попросил Googlе вычислить названную величину. Ответ был дан мгновенно – 4,2842727е-76.
Тангенс это синус, деленный на косинус. Поэтому свои исследования я начал с решения более простой задачи. А именно, как найти синус 10 градусов и возвести его в сотую степень. Причем нам надо реализовать два различных метода, чтобы убедиться в правильности полученного результата. Все вычисления проводились на платформе 1С: Предприятие 8.2. Особенностью данной платформы является то, что результаты расчетов хранятся в текстовом виде, что снимает вопрос о количестве знаков после запятой и, как следствие, точности расчетов, по крайней мере, для операций сложения и умножения. Теперь определимся с вариантами расчета. Самый простой – это вычислить синус и затем умножить его на себя. Раз степень, в которую мы возводим четная, то вспомним про формулу косинуса двойного угла и запишем:

image


Поскольку при проведении расчетов, нам необходимо контролировать точность используемых данных, то косинус 20 градусов будем искать, как корень следующего уравнения:
4*cos³(20°)-3*cos(20°)=0,5
Данное уравнение получается из формулы для косинуса тройного угла. Для численного решения уравнения воспользуемся методом Ньютона. В дальнейшем найденное значение sin²(10°) умножаем само на себя 49 раз (можно, разумеется, сократить количество умножений, это в данном случае неважно).
Приведем таблицу с зависимостью проведенных расчетов от точности определения cos(20°).
image

Из полученных результатов видно, что точность в 10% достигается, когда входные данные содержат 4 значащих цифры после запятой.
Следующий пункт нашей исследовательской программы — поиск альтернативного способа расчета нужного произведения. Я делал расчет четной степени синуса, но использованный подход может быть применен и к тангенсу, просто это увеличит объем излагаемого материала. Заменим исходную функцию ее разложением в ряд Фурье. Разложение получим с использованием следующего тождества:
cos(α)*cos(β)=0,5*(cos(α-β)+cos(α+β))
Вот как мы его применяем.
sin²(x)* sin²(x)=(0,5-0,5cos(2x))(0,5-0,5cos(2x))
Раскроем скобки в правой части и затем заменим произведения косинусов их суммой. Затем полученную сумму опять умножим на (0,5-0,5 cos(2x)) опять раскроем скобки и еще раз проведем операцию замены произведения на сумму. Разумеется, изложенную процедуру я проводил с помощью программы на встроенном языке платформы 1С: Предприятие. В результате данных мероприятий было получено разложение исходной функции по базису из функций cos(2ix), где i меняется от 0 до 25. Найденное разложение мы в дальнейшем вычисляем в точке 10°=π/18. Приведем таблицу со значениями базисных функций в данной точке.



Для углов в диапазоне от 180° до 340° значения базисных функций будут отличаться от приведенных величин только знаком из-за сдвига на «пи». Теперь, когда есть значения базисных функции и есть коэффициенты разложения, можно провести альтернативный расчет. А вот в этом случае точность исходных данных должна быть сопоставима с точностью конечного результат, т.е не меньше чем 10⁻⁷⁷. Впрочем это и понятно. Когда мы складываем какие-то величины, то для получения нужной точности члены суммы должны быть рассчитаны с погрешностью не меньше предполагаемого результата. В следующей таблице приведены результаты расчета по изложенной методике для различной точности входных данных.

Приведенные числа согласуются с нашим замечанием о связи точности входных данных и конечного результата. В тоже время, они подтверждают достоверность предыдущих расчетов.
Ниже приведено изображение формы обработки, которую я применял в своих исследованиях

На данной форме, в частности, приведен спектр разложения в ряд Фурье функции sin¹⁰⁰ (x).
И так, с помощью вычислительной техники, которая стала значительно доступнее со времен атомного проекта, мы задачу решили. Но можно ли ее решить в уме, или хотя бы получить оценку порядка для конечного результата. Приведем возможную последовательность рассуждений.
Вспомним, что разложение функции tg²(x) по степеням sin²(x) имеет вид:
tg²(x)= sin²(x) +sin⁴(x)+sin⁶(x)+…
Оценку для sin(10°) получим из тождества:
sin(30°)=3sin(10°)-4sin³(10°)
Если отбросить кубический член, то оценка будет 1/6=0,166666, так как она занижена, то возьмем 0,17, а квадрат тангенса оценим в 0,03. Прологарифмируем искомую величину и получим
Ln(tg²(10°)⁵⁰)=50*(-2*Ln(10)+Ln(3))
Ln(3)=Ln(e*(1+0,3/e))≈1+Ln(1+1/9)=1,1
Вспомним, что Ln(10) ≈2,30.Тогда натуральный логарифм искомой величины будет равен
50*(-4,6+1,1)=-50*3,5=-2,3*50*35/23=2,3*50*(1+12/23)≈-2,3*50*(1+0,5*(1+1/24))=-2,3*50*1,52=-2,3*76.
Возведем e в полученную степень и приходим к результату 10⁻⁷⁶.

Заключение


В данной работе я не смог найти ответ на вопрос, который сформулировал Пол Олам. Тем не менее, приведенный анализ, с моей точки зрения, является неплохой демонстрацией того, как можно применять математические инструменты для решения задач, когда надо дойти до числа. Мне кажется, что изложенный материал можно использовать, как основу для практического занятия по вычислительной математике в старших классах.
Поделиться публикацией

Комментарии 33

    +7
    Все-таки авторское решение — далеко не на одну минуту. Думаю что даже у Фейнмана провести требуемые вычисления при известном алгоритме заняло бы больше.
      +8
      Фейнман любил применять метод последовательных приближений к результату, он описывает это в книге. Если например его просили сделать в уме сложные вычисления достаточно быстро, он начинал выдавать ответ сразу (понятно что если разделить 45 на 16, то результат будет меньше трех => можно сразу сказать что целая часть ответа = 2).
      И скорее всего, его остановили бы уже на 3-4 знаке. :)
      +39
      Порядок величины можно оценить и проще:

      tg x ≈ x (с точностью более 1% для углов меньше 15°)

      tg 10° ≈ π (10° / 180°) = 3,14 / 18 ≈ 0,17 — быстро делить трёхзначные числа несложно

      0,17100 = 17100 × 10−200 = 10(100 lg 17) − 200

      lg 17 ≈ 1,23 — до 20 можно и заучить таблицу

      Итого (tg 10°)100 ≈ 10−77
        +3
        Тогда можно было просто начать диктовать: «Ноль, запятая, ноль, ноль, ноль, ....»
      +45
      А, и если ещё что-то останется от минуты:

      1. улучшаем оценку тангенса до 0,175
      2. вытягиваем из памяти lg 18 ≈ 1,255
      3. прикидываем lg 17,5 ≈ (lg 17 + lg 18) / 2 ≈ 1,2 + (0,03 + 0,055) / 2 ≈ 1,243
      4. получаем (tg 10°)100 ≈ 10−75,7 = 100,3 × 10−76 ≈ 2 × 10−76

      Если ещё учесть, что 0,175 — на самом деле 0,17(4), то можно чуть завысить результат. Скажем, до 5 × 10−76 или даже 4 × 10−76, чтобы не сильно.

      Так что как минимум есть хорошая вероятность попасть в заветные 10% отклонения (если помнить таблицу логарифмов и уметь в быструю арифметику).
        +47
        Мистер Фейнман, перелогиньтесь.
        +3
        Возведем e в полученную степень и приходим к результату 10⁻⁷⁶.

        Так ваш результат отличается на 80%
          0
          2.5 в миллионной степени?
            0
            Что может быть проще? Это порядка 24643856.
              0
              но ведь это не ответ
            0
            А я вот это не понял:
            Ln(3)=Ln(e*(1+0,9/e))…
            Даже не близко.
              0
              Да, разумеется здесь опечатка Ln(3)=Ln(e*(1+0,3/e))≈1+Ln(1+1/9)=1,1
              +21
              забавно, когда-то давно слышал про эту же задачу, но в той версии говорили про «тангенс от 10^100». Причем если речь шла о градусах, то задача легко решится за минуту, а вот если радиан, то как раз «надо знать число пи с точностью более 100 знаков»
                +11
                Вы правы. В оригинале «The tangent of 10 to the 100th». Переводчик либо сам не очень знал матчасть, либо переводил для людей, которые радианы со школы уже не помнят.
                  +12
                  Прекрасное замечание! Теперь ясно о чем шла речь! Дело в том, что мне совершенно не понятна была эта фраза «нужно ДЕЛИТЬ на число пи до ста десятичных разрядов». Скорее всего задача формулировалась именно так, «найти tg(10^100).
                    +7
                    Очень хороший пример того, почему подобные книжки должны наряду с обычными переводчиками вычитывать специалисты по предметной области. То же самое творится с iWoz: я пробовал читать перевод и буквально на первых же страницах обнаружил несколько подобных ляпов, где переводчик явно стремясь сделать фразы «более понятными» просто кардинально менял смысл того, о чём говорилось в оригинале.

                    P.S. Это в дополнение к тому, что сейчас и просто за качеством русского языка зачастую в книжках особо не смотрят.
                      +2
                      Я пасусь на СамИздате, и ты не поверишь сколько людей считают, что знают русский язык, лишь на том основании, что «изучали» его в школе.
                        +14
                        Как-то, читая корректуру своей статьи, одна математик натолкнулась на ситуацию, когда редактор в целях повышения читаемости и исправления неправильного, как ему казалось, русского языка поменял местами условие и заключение теоремы.
                          +11
                          Когда мы издавали в университете методичку по алгебре, студентка филфака, которая набирала текст, исправила все корни из отрицательных чисел на корни из положительных со словами: 'Но так же нельзя!'
                            +3
                            Цитата из дипломной работы, 69-я страница:
                            — Так как до этого места всё равно никто не дочитает, примем число «пи» равным пяти. Иначе расчёты не сходятся, а искать ошибку мне лень.
                            0
                            Как раз при прочтении оставил нерешенным этот вопрос. Теперь всё на своих местах.
                            0
                            Любопытно, что wolframalpha и гугль выдают разные результаты. 0.40123… и -0.68951…
                            Ошибается очевидно гугль, т.к. для tan(10^100) и tan(1e+100) выдаётся разный результат.
                              0
                              Ну такую разницу результатов у гугля несложно объяснить: 1е+100 — это готовое число с плавающей точкой, а 10^100 — это либо целочисленное возведение в степень, которое потом с ограниченной точностью конвертируется в double, либо нецелочисленное возведение в степень, но в любом случае оно происходит с округлениями, а в этой задаче даже ошибка в сотом знаке после запятой приведет к совсем другому результату.

                              А вообще я почти полностью уверен, что оба результата неправильные, потому что для правильного результата нужно использовать число пи с более 100 значащими цифрами, а такая точность ни в какой double и близко не влезает.
                                0
                                Однако sin(pi+1e-101) выдаёт правильный результат (хотя конечно математика может и не считать в лоб). Да и калькулятор в семёрке выдаёт те же 0,40123… (а вот в последней убунте -0.60261...).
                                  0
                                  Вольфрмальфа явно не double использует, там можно в веб-интерфейсе понажимать кнопку и тысяч пять знаков после запятой посмотреть
                                    0
                                    Ну посмотреть-то можно, но я сильно сомневаюсь, что для вычислений они какую-то сверхвысокую точность используют.
                                      +2
                                      Ну, собственно, сколько попросить знаков показать, с такой точностью и будет считать: reference.wolfram.com/mathematica/tutorial/NumericalPrecision.html
                                      Вольфрамальфа просто выполняет N[Tan[10^100 radians], 5000]
                                        +1
                                        Ого, какой вольфрам оказывается крутой. Не знал.
                              +5
                              Да уж, оценить сколько раз пи уложится в 10^100 — все равно что угадать случайное число
                                +3
                                Зачем так извращаться, когда почти очевидно, что достаточно взять один член разложения тангенса в нуле? tg(x) = x(1 + O(x^2)) Я, признаться, не смог за минуту в уме найти хорошую оценку остаточному члену, но число (pi/18)^200 настолько мало по сравнению с 1/10, что в условиях пари можно рискнуть и поверить, что константа в O-большом с большим запасом подавится квадратом аргумента.

                                Один из предыдущих комментаторов помнит больше полезных констант, поэтому может быть уверенным в оценке. Остается вычислить (pi/18)^100, но это уже несложно.
                                  0
                                  Кстати, а не мог бы кто-нибудь из присутствующих порекомендовать книжку по вычислительной математике? А то я думал, что умею считать, а оказалось, что считать умеет мой калькулятор. :(
                                    0
                                    Весьма неплохая книжка, чтобы начать:
                                    А.А. Самарский, А.В. Гулин, Численные методы

                                    А вообще смотря что вы хотите. Большинство задач решаются по принципу «строим ряд и считаем его в точке». Хотя конечно не мешало бы знать, что такое «в окрестности точки» и «радиус сходимости».

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

                                  Самое читаемое