Леонардо Бездельник, видимо, обладал отменным чувством самоиронии. И это отличает людей с высоким интеллектом от задавак. О его познаниях в области счётной арифметики и геометрии, говорит тот факт, что примеры из его учебника (а это 13 век) дошли до нашего времени, и вполне себе употребимы. Более того, от него дошли идеи, которые развиты сейчас не очень полно, и будущее у них впереди. Наш соотечественник Стахов А. П. 1) разработал умопомрачительную позиционную систему счисления на иррациональном основании (на идеях Фибоначчи). Он же предложил создавать компьютеры на избыточной позиционной системе счисления, которые обладают мощнейшей устойчивостью к сбоям. И это всё дело будущего. Вот такой он, этот Леонардо Боначчи из 12-го века.
В эпоху Возрождения Леонардо да Винчи создал очень известный рисунок — «Витрувианский человек». Рисунок на столько совершенен, что потрясает воображение. Как оказалось, чтобы создать такой совершенный рисунок, Леонардо да Винчи воспользовался подсказкой, данной ему Фибоначчи. Например, отношение длины всего тела, к той части, что от пупка до пяток — 1,6180339887
. А если взять длину части тела от пупка до пяток и сравнить с длиной от пупка до макушки — 1,6180339887
…??? А если взять длину всей кисти к длине ладони — 1,6180339887
!!! А если соотнести длину ладони к длине пальцев получится… 1,6180339887
!!!! И это число преследует человека повсюду. Вот так Леонардо, с помощью математики создал свой шедевр. Мы тоже попробуем сейчас найти это число так точно, на сколько оно того заслуживает.
Чтобы точно вычислить значение золотого сечения, нам необходимо знать, как создать непредельный ряд с основанием «1» 2). В целом, этот метод известен. Достаточно взять сумму двух предыдущих членов ряда, чтобы получить третий. А вот чтобы найти саму золотую пропорцию — необходимо разделить последующий член пропорции, на предыдущий. И здесь есть интересная особенность: чем выше номера членов — тем точнее пропорция.
Итак, нам потребуется три переменных. Две хранят предыдущее значение двух членов ряда Фибоначчи, одна — последующее. Также нам потребуется переменная, которая будет отвечать за счётчик цикла. И, собственно, сам цикл.
Hello10.odc:
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
В программе применён простейший метод обмена данными: вычисляется новый член ряда, находится новое значение золотой пропорции, а затем старым членам присваивается новое значение из найденного нового члена.
А теперь посмотрим на вывод программы:
компилируется "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
Обратите внимание на интересную закономерность: нечётный результат — меньше золотой пропорции, чётный — больше. Следующая пара повторяет эту закономерность, но уже гораздо ближе к истинной золотой пропорции. И каждый шаг приближает вычисления к ней 3).
На шаге 38 и 39 эти числа уже равны. И здесь нет ошибки: сказывается недостаточная точность вычислений с плавающей запятой. В примере использован цикл WHILE
и это не оптимальное решение. Требуется вручную контролировать переменную i
. В качестве самостоятельного задания, предлагается переписать этот цикл использую FOR
.