Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
bb:redbook:203 [2016/09/08 21:44] prospero78 [4. Примечания] |
— (текущий) |
===== 2.3 Свойства чисел Фибоначчи ===== | |
| |
==== 1. Фибоначчи: гений средневековья ==== | |
[[https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8|Леонардо Бездельник]], видимо, обладал отменным чувством самоиронии. И это отличает людей с высоким интеллектом от задавак. О его познаниях в области счётной арифметики и геометрии, говорит тот факт, что примеры из его учебника (а это 13 век) дошли до нашего времени, и вполне себе употребимы. Более того, от него дошли идеи, которые развиты сейчас не очень полно, и будущее у них впереди. Наш соотечественник [[http://www.trinitas.ru/rus/doc/avtr/00/0195-00.htm|Стахов А. П.]] (( У Стахова Алексея Петровича есть замечательная книга «Коды золотой пропорции». Настоятельно рекомендуется к прочтению.)) разработал умопомрачительную //позиционную систему счисления на иррациональном основании// (на идеях Фибоначчи). Он же предложил создавать компьютеры на //избыточной позиционной системе счисления//, которые обладают мощнейшей устойчивостью к сбоям. И это всё дело будущего. Вот такой он, этот Леонардо Боначчи из 12-го века. | |
| |
| |
==== 2. Золотая пропорция ==== | |
В эпоху [[https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%B7%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5|Возрождения ]] Леонардо да Винчи создал очень известный рисунок — [[https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%82%D1%80%D1%83%D0%B2%D0%B8%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA|«Витрувианский человек»]]. Рисунок на столько совершенен, что потрясает воображение. Как оказалось, чтобы создать такой совершенный рисунок, Леонардо да Винчи воспользовался подсказкой, данной ему Фибоначчи. Например, отношение длины всего тела, к той части, что от пупка до пяток — ''1,6180339887''. А если взять длину части тела от пупка до пяток и сравнить с длиной от пупка до макушки — ''1,6180339887''...??? А если взять длину всей кисти к длине ладони — ''1,6180339887''!!! А если соотнести длину ладони к длине пальцев получится... ''1,6180339887''!!!! И это число преследует человека повсюду. Вот так Леонардо, с помощью математики создал свой шедевр. Мы тоже попробуем сейчас найти это число так точно, на сколько оно того заслуживает. | |
| |
| |
==== 3. Задача о золотом сечении ==== | |
Чтобы точно вычислить значение золотого сечения, нам необходимо знать, как создать непредельный ряд с основанием "1" ((Непредельный ряд с основанием «1» хорошо известен из задачи Фибоначчи «О кроликах», предельный ряд с основанием «0» известен всем программистам — это классический двоичный ряд «0 1 2 4 8 16 32…». Мало кто знает, что таких рядов множество, и чем выше индекс непредельного ряда — тем больше избыточность такой позиционной системы счисления. И тем более она помехоустойчива. Всем известно, что чем сложнее система — тем выше вероятность отказа. С непредельными позиционными системами счисления — всё с точностью наоборот: чем крупнее система, тем выше надёжность. Это очень необычное свойство. )). В целом, этот метод известен. Достаточно взять сумму двух предыдущих членов ряда, чтобы получить третий. А вот чтобы найти саму золотую пропорцию — необходимо разделить последующий член пропорции, на предыдущий. И здесь есть интересная особенность: чем выше номера членов — тем точнее пропорция. | |
| |
Итак, нам потребуется три переменных. Две хранят предыдущее значение двух членов ряда Фибоначчи, одна — последующее. Также нам потребуется переменная, которая будет отвечать за счётчик цикла. И, собственно, сам цикл. | |
| |
Hello10.odc: | |
<code oberon2> | |
MODULE TestHello10; | |
(* это программа на языке | |
Компонентный Паскаль. Она показывает | |
как можно найти точную золотую пропорцию. *) | |
| |
IMPORT Log, Math; | |
| |
PROCEDURE Start*; | |
VAR | |
a0, a1, an: LONGINT; | |
pr: REAL; | |
i: INTEGER; | |
| |
BEGIN | |
a0 := 0; | |
a1 := 1; | |
i := 1; | |
WHILE i < 40 DO | |
an := a0 + a1; | |
Log.Int(i); Log.String(' * '); Log.Real(an / a1); Log.Ln; | |
a0 := a1; | |
a1 := an; | |
INC(i) | |
END; | |
END Start; | |
| |
BEGIN | |
END TestHello10. | |
| |
(*)TestHello10.Start | |
</code> | |
| |
В программе применён простейший метод обмена данными: вычисляется новый член ряда, находится новое значение золотой пропорции, а затем старым членам присваивается новое значение из найденного нового члена. | |
| |
А теперь посмотрим на вывод программы: | |
<code> | |
компилируется "TestHello10" 168 0 | |
старый модуль TestHello10 выгружен | |
1 * 1.0 | |
2 * 2.0 | |
3 * 1.5 | |
4 * 1.666666666666667 | |
5 * 1.6 | |
6 * 1.625 | |
7 * 1.615384615384615 | |
8 * 1.619047619047619 | |
9 * 1.617647058823529 | |
10 * 1.618181818181818 | |
11 * 1.617977528089888 | |
12 * 1.618055555555556 | |
13 * 1.618025751072961 | |
14 * 1.618037135278515 | |
15 * 1.618032786885246 | |
16 * 1.618034447821682 | |
17 * 1.618033813400125 | |
18 * 1.618034055727554 | |
19 * 1.618033963166706 | |
20 * 1.618033998521803 | |
21 * 1.618033985017358 | |
22 * 1.618033990175597 | |
23 * 1.618033988205325 | |
24 * 1.618033988957902 | |
25 * 1.618033988670443 | |
26 * 1.618033988780243 | |
27 * 1.618033988738303 | |
28 * 1.618033988754322 | |
29 * 1.618033988748204 | |
30 * 1.618033988750541 | |
31 * 1.618033988749648 | |
32 * 1.618033988749989 | |
33 * 1.618033988749859 | |
34 * 1.618033988749909 | |
35 * 1.61803398874989 | |
36 * 1.618033988749897 | |
37 * 1.618033988749894 | |
38 * 1.618033988749895 | |
39 * 1.618033988749895 | |
</code> | |
Обратите внимание на интересную закономерность: нечётный результат — меньше золотой пропорции, чётный — больше. Следующая пара повторяет эту закономерность, но уже гораздо ближе к истинной золотой пропорции. И каждый шаг приближает вычисления к ней (( Точное значение числа золотой пропорции установить невозможно — это число иррационально (не имеет конца). С помощью классического двоичного ряда можно получить только число «2». Кроме того, ряды золотой пропорции обладают признаками //чётности// (если их представлять двоичным кодом). Такое свойство непредельных позиционных систем счисления позволяет проектировать компьютеры с автоматическим частично-гарантированным исправлением одиночных и множественных ошибок. У классического двоичного ряда — такое невозможно. Вообще. Это вообще очень большая и интересная тема. )). | |
| |
На шаге 38 и 39 эти числа уже равны. И здесь нет ошибки: сказывается недостаточная точность вычислений с плавающей запятой. В примере использован цикл ''WHILE'' и это не оптимальное решение. Требуется вручную контролировать переменную ''i''. В качестве самостоятельного задания, предлагается переписать этот цикл использую ''FOR''. | |
| |
| |