- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (13) »
alt="Рассказы о математике с примерами на языках Python и C. Иллюстрация № 4">
Формула Мэчина (18 век):
Попробуем вычислить число Пи по второй формуле. Для этого напишем простую программу на языке Python: sum = 0.0 sign = 1 for p in range(0,33): sum += 4.0 * sign / (1 + 2 * p) print(p, sum) sign = -sign Запустим программу в любом онлайн-компиляторе языка Питон (например https://repl.it/languages/python3). Получаем результат: Шаг Значение 0 4.0 1 2.666666666666667 2 3.466666666666667 3 2.8952380952380956 4 3.3396825396825403 5 2.9760461760461765 6 3.2837384837384844 7 3.017071817071818 8 3.2523659347188767 9 3.0418396189294032 10 3.232315809405594 11 3.058402765927333 12 3.2184027659273333 13 3.0702546177791854 14 3.208185652261944 15 3.079153394197428 16 3.200365515409549 17 3.0860798011238346 18 3.1941879092319425 19 3.09162380666784 20 3.189184782277596 21 3.0961615264636424 22 3.1850504153525314 23 3.099944032373808 24 3.1815766854350325 25 3.1031453128860127 26 3.1786170109992202 27 3.1058897382719475 28 3.1760651768684385 29 3.108268566698947 30 3.1738423371907505 31 3.110350273698687 32 3.1718887352371485 Как можно видеть, сделав 32 шага алгоритма, мы получили лишь 2 точных знака. Видно, что алгоритм работает, но количество вычислений весьма велико. Как известно, в 15-м веке индийский астроном и математик Мадхава использовал более точную формулу, получив точность числа Пи в 11 знаков:
Попробуем воспроизвести ее в виде программы, чтобы примерно оценить объем вычислений. Первым шагом необходимо вычислить √12. Возникает резонный вопрос — как это сделать? Оказывается, уже в Вавилоне был известен метод вычисления квадратного корня, который сейчас так и называется «вавилонским». Суть его в вычислении √S по простой формуле:
Здесь x0 — любое приближенное значение, например для √12 можно взять 3. Запишем формулу в виде программы: from decimal import Decimal
print ("Квадратный корень:") number = Decimal(12) result = Decimal(3) for p in range(1, 9): result = (result + number / result)/Decimal(2) difference = result**2 - number print (p, result, difference) sqrt12 = result Результаты весьма интересны:
Шаг Значение Погрешность 1 3.5 0.25 2 3.464285714285714 0.00127 3 3.464101620029455 3.3890E-8 4 3.464101615137754 2.392873369E-17
Результат: √12 = 3,464101615137754
Как можно видеть, сделав всего 4 шага, можно получить √12 с достаточной точностью, задача вполне посильная даже для ручных расчетов 15 века. Наконец, запрограммируем вторую часть алгоритма — собственно вычисление Пи. sum = Decimal(1) sign = -1 for p in range(1,32): sum += Decimal(sign) / Decimal((2 * p + 1)*(3**p)) sign = -sign print(p, sqrt12 * sum) print("Result:", sqrt12 * sum) Результаты работы программы: Шаг Значение 1 3.079201435678004077382126829 2 3.156181471569954179316680000 3 3.137852891595680345522738769 4 3.142604745663084672802649458 5 3.141308785462883492635401088 6 3.141674312698837671656932680 7 3.141568715941784242161823554 8 3.141599773811505839072149767 9 3.141590510938080099642754230 10 3.141593304503081513121460820 11 3.141592454287646300323593597 12 3.141592715020379765581606212 13 3.141592634547313881242713430 14 3.141592659521713638451335328 15 3.141592651733997585128216671 16 3.141592654172575339199092210 17 3.141592653406165187919674184 18 3.141592653647826046431202391 19 3.141592653571403381773710565 20 3.141592653595634958372427485 21 3.141592653587933449530974820 22 3.141592653590386522717511595 23 3.141592653589603627019680710 24 3.141592653589853940610143646 Уже на 24-м шаге мы получаем искомые 11 знаков числа Пи. Задача явно требовала больше времени чем сейчас, но вполне могла быть решена в средние века. Современные формулы не столь просты внешне, зато работают еще быстрее. Для примера можно привести формулу Чудновского:
Для сравнения, те же 24 итерации по этой формуле дают число Пи со следующей точностью: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249. Если сделать 100 итераций и вычислить 1000 знаков Пи, то можно увидеть так называемую «точку Фейнмана»: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420207 Это последовательность «999999», находящаяся на 762-м знаке от начала. Желающие могут поэкспериментировать дальше самостоятельно с помощью программы на языке Python: from math import factorial from decimal import *
def chudnovsky(n): pi = Decimal(0) k = 0 while k < n: pi += (Decimal(-1)**k) * (Decimal(factorial(6 * k)) / ((factorial(k)**3) * (factorial(3*k))) * (13591409 + 545140134 * k) / (640320**(3 * k))) k += 1 print("Шаг: {} из {}".format(k, n)) pi = pi * Decimal(10005).sqrt() / 4270934400 pi = pi**(-1) return pi
# Требуемая точность (число знаков) N = 1000 getcontext().prec = N
val = chudnovsky(N / 14) print(val) Эта программа не оптимизирована, и работает довольно-таки медленно, но для ознакомления с сутью алгоритма этого вполне достаточно. Кстати, с помощью формулы Чудновского два инженера Александр Йи и Сингеру Кондо в 2010 году объявили о новом мировом рекорде вычисления Пи на персональном компьютере: 5 трлн знаков после запятой. Компьютеру с 12 ядрами, 97 Гб памяти и 19 жесткими дисками потребовалось 60 дней для выполнения расчетов. На этом мы закончим с числом Пи, хотя с ним конечно, связано куда больше интересных фактов. Например 3 марта (т. е. 03.14) отмечается международный «день числа Пи», ну а другие факты читатели могут поискать самостоятельно.
Однако в историческом плане, увидеть планету свысока мы смогли совсем-совсем недавно. Как же мог греческий ученый Эратосфен измерить радиус Земли, в 240 году до нашей эры? Оказывается мог, используя 2 научных «инструмента» — транспортир и верблюда, ну и разумеется, математику. Эратосфен жил в Александрии — крупнейшем городе того времени, центром науки и искусств древнего мира. В Александрии по преданию, находился маяк высотой 120 метров — даже сегодня такое сооружение не просто построить, а в то время маяк считался одним из 7 чудес
Формула Мэчина (18 век):
Попробуем вычислить число Пи по второй формуле. Для этого напишем простую программу на языке Python: sum = 0.0 sign = 1 for p in range(0,33): sum += 4.0 * sign / (1 + 2 * p) print(p, sum) sign = -sign Запустим программу в любом онлайн-компиляторе языка Питон (например https://repl.it/languages/python3). Получаем результат: Шаг Значение 0 4.0 1 2.666666666666667 2 3.466666666666667 3 2.8952380952380956 4 3.3396825396825403 5 2.9760461760461765 6 3.2837384837384844 7 3.017071817071818 8 3.2523659347188767 9 3.0418396189294032 10 3.232315809405594 11 3.058402765927333 12 3.2184027659273333 13 3.0702546177791854 14 3.208185652261944 15 3.079153394197428 16 3.200365515409549 17 3.0860798011238346 18 3.1941879092319425 19 3.09162380666784 20 3.189184782277596 21 3.0961615264636424 22 3.1850504153525314 23 3.099944032373808 24 3.1815766854350325 25 3.1031453128860127 26 3.1786170109992202 27 3.1058897382719475 28 3.1760651768684385 29 3.108268566698947 30 3.1738423371907505 31 3.110350273698687 32 3.1718887352371485 Как можно видеть, сделав 32 шага алгоритма, мы получили лишь 2 точных знака. Видно, что алгоритм работает, но количество вычислений весьма велико. Как известно, в 15-м веке индийский астроном и математик Мадхава использовал более точную формулу, получив точность числа Пи в 11 знаков:
Попробуем воспроизвести ее в виде программы, чтобы примерно оценить объем вычислений. Первым шагом необходимо вычислить √12. Возникает резонный вопрос — как это сделать? Оказывается, уже в Вавилоне был известен метод вычисления квадратного корня, который сейчас так и называется «вавилонским». Суть его в вычислении √S по простой формуле:
Здесь x0 — любое приближенное значение, например для √12 можно взять 3. Запишем формулу в виде программы: from decimal import Decimal
print ("Квадратный корень:") number = Decimal(12) result = Decimal(3) for p in range(1, 9): result = (result + number / result)/Decimal(2) difference = result**2 - number print (p, result, difference) sqrt12 = result Результаты весьма интересны:
Шаг Значение Погрешность 1 3.5 0.25 2 3.464285714285714 0.00127 3 3.464101620029455 3.3890E-8 4 3.464101615137754 2.392873369E-17
Результат: √12 = 3,464101615137754
Как можно видеть, сделав всего 4 шага, можно получить √12 с достаточной точностью, задача вполне посильная даже для ручных расчетов 15 века. Наконец, запрограммируем вторую часть алгоритма — собственно вычисление Пи. sum = Decimal(1) sign = -1 for p in range(1,32): sum += Decimal(sign) / Decimal((2 * p + 1)*(3**p)) sign = -sign print(p, sqrt12 * sum) print("Result:", sqrt12 * sum) Результаты работы программы: Шаг Значение 1 3.079201435678004077382126829 2 3.156181471569954179316680000 3 3.137852891595680345522738769 4 3.142604745663084672802649458 5 3.141308785462883492635401088 6 3.141674312698837671656932680 7 3.141568715941784242161823554 8 3.141599773811505839072149767 9 3.141590510938080099642754230 10 3.141593304503081513121460820 11 3.141592454287646300323593597 12 3.141592715020379765581606212 13 3.141592634547313881242713430 14 3.141592659521713638451335328 15 3.141592651733997585128216671 16 3.141592654172575339199092210 17 3.141592653406165187919674184 18 3.141592653647826046431202391 19 3.141592653571403381773710565 20 3.141592653595634958372427485 21 3.141592653587933449530974820 22 3.141592653590386522717511595 23 3.141592653589603627019680710 24 3.141592653589853940610143646 Уже на 24-м шаге мы получаем искомые 11 знаков числа Пи. Задача явно требовала больше времени чем сейчас, но вполне могла быть решена в средние века. Современные формулы не столь просты внешне, зато работают еще быстрее. Для примера можно привести формулу Чудновского:
Для сравнения, те же 24 итерации по этой формуле дают число Пи со следующей точностью: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249. Если сделать 100 итераций и вычислить 1000 знаков Пи, то можно увидеть так называемую «точку Фейнмана»: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420207 Это последовательность «999999», находящаяся на 762-м знаке от начала. Желающие могут поэкспериментировать дальше самостоятельно с помощью программы на языке Python: from math import factorial from decimal import *
def chudnovsky(n): pi = Decimal(0) k = 0 while k < n: pi += (Decimal(-1)**k) * (Decimal(factorial(6 * k)) / ((factorial(k)**3) * (factorial(3*k))) * (13591409 + 545140134 * k) / (640320**(3 * k))) k += 1 print("Шаг: {} из {}".format(k, n)) pi = pi * Decimal(10005).sqrt() / 4270934400 pi = pi**(-1) return pi
# Требуемая точность (число знаков) N = 1000 getcontext().prec = N
val = chudnovsky(N / 14) print(val) Эта программа не оптимизирована, и работает довольно-таки медленно, но для ознакомления с сутью алгоритма этого вполне достаточно. Кстати, с помощью формулы Чудновского два инженера Александр Йи и Сингеру Кондо в 2010 году объявили о новом мировом рекорде вычисления Пи на персональном компьютере: 5 трлн знаков после запятой. Компьютеру с 12 ядрами, 97 Гб памяти и 19 жесткими дисками потребовалось 60 дней для выполнения расчетов. На этом мы закончим с числом Пи, хотя с ним конечно, связано куда больше интересных фактов. Например 3 марта (т. е. 03.14) отмечается международный «день числа Пи», ну а другие факты читатели могут поискать самостоятельно.
4. Вычисление радиуса Земли
О том, что Земля круглая сегодня знает каждый школьник, и никого не удивить таким видом планеты из космоса.Однако в историческом плане, увидеть планету свысока мы смогли совсем-совсем недавно. Как же мог греческий ученый Эратосфен измерить радиус Земли, в 240 году до нашей эры? Оказывается мог, используя 2 научных «инструмента» — транспортир и верблюда, ну и разумеется, математику. Эратосфен жил в Александрии — крупнейшем городе того времени, центром науки и искусств древнего мира. В Александрии по преданию, находился маяк высотой 120 метров — даже сегодня такое сооружение не просто построить, а в то время маяк считался одним из 7 чудес
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (13) »