БлогNot. c+=c, возвратные последовательности и золотое сечение...

c+=c, возвратные последовательности и золотое сечение...

Cкучая недавно на паре, увидел на мониторе у студентки такой оператор:

c=0;
while (...) {
 c+=c;
 ...
}

При этом она удивлялась, почему на выходе цикла получается ноль :) Пытался объяснить... Потом подумал, что при начальном

c=1;

здесь получатся степени двойки. А вот что будет при

a=b=1;
while (...) {
 a+=b; b+=a;
}

- гадать долго не приходится, увидел сразу, что получится ряд Фибоначчи!

Хорошо, конечно, что не только предел отношения двух соседних элементов даст константу золотого сечения, но и последовательности, составленные из разностей соседних значений цепочек a и b дадут то же самое:

Предел отношения соседних элементов возвратной последовательности 2 порядка
Предел отношения соседних элементов возвратной последовательности 2 порядка

Да и любая комбинация ненулевых начальных значений a и b, кроме a=b=0, даст аналогичную картину.

Сразу же возникла мысль обобщить расчёт на большее количество переменных:

a=b=с=1;
while (...) {
 a+=b; b+=с; c+=a;
}

что дало следующий предел отношения 2 соседних элементов:

Предел отношения соседних элементов возвратной последовательности 3 порядка
Предел отношения соседних элементов возвратной последовательности 3 порядка

Интуитивно правильно я даже назвал это "обменной последовательностью 3 порядка", вот только не учёл, что надо не "обменной", а "возвратной", и они давным-давно открыты.

Сделав аналогичные расчёты для порядков 4 и 5, дальше извращаться с Экселем я не стал, ведь проще сразу написать программку, которая посчитает пределы отношения двух соседних элементов возвратной последовательности и отношения "последнего" (в смысле очередности увеличения переменных, через которые считаем) к "первому" (в том же смысле) элементу для любого порядка последовательности, скажем, от 2 до 80 включительно. К тому же, очевидно, что в итоге при высоком порядке последовательности пределы должны получиться равными 1 и 2 соответственно.

Вот программка на консольном C++:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>

void main () {
 double nmin=2,nmax=80,n,i,s,steps=700,lim1,lim2;
 double *a=(double *)malloc(nmax*sizeof(double));
 if (a==NULL) {
  printf ("\nNo memory!"); exit(1);
 }
 clrscr();
 for (i=nmin; i<=nmax; i++) {
  for (n=0; n<i; n++) a[n]=1;
  for (s=0; s<steps; s++) {
   for (n=0; n<i-1; n++) a[n]+=a[n+1];
   a[i-1]+=a[0];
  }
  lim1=a[0]/a[1];
  lim2=a[i-1]/a[0];
  printf ("\n%.0f\t%.15lf\t%.15lf",i,lim1,lim2);
 }
 free(a);
 getch();
}

Разумеется, верхняя граница цикла, в котором вычисляются элементы последовательности, также может меняться, попробовал и 50, и 100, и 500, увы, больше 700-750 шагов комп на 32-разрядных числах не тянет... тем не менее, вот искомые пределы для возвратных последовательностей порядка 2, 3, ..., 80 для типа данных double при выводе 15 знаков в дробной части и 700 шагах расчёта каждой последовательности:

2	0,618033988749895	1,618033988749890
3	0,754877666246693	1,754877666246690
4	0,819172513396164	1,819172513396160
5	0,856674883854503	1,856674883854500
6	0,881271461633570	1,881271461633570
7	0,898653712628699	1,898653712628690
8	0,911592353482055	1,911592353482050
9	0,921599319633983	1,921599319633980
10	0,929570128232023	1,929570128232020
11	0,936069111077759	1,936069111077750
12	0,941469617321734	1,941469617321690
13	0,946028528280977	1,946028528284810
14	0,949928400091848	1,949928400165280
15	0,953302536865281	1,953302538268050
16	0,956250540678591	1,956250533545200
17	0,958848436939130	1,958848490631310
18	0,961155589369479	1,961155477852780
19	0,963217624192121	1,963216927002240
20	0,965072887198807	1,965071053233850
21	0,966758096116181	1,966755268680840
22	0,968293704382715	1,968296970489430
23	0,969629262173818	1,969643138267480
24	0,970877757700119	1,970858971862160
25	0,972250531720106	1,972252562525550
26	0,972959411500210	1,972982842041380
27	0,974471689395137	1,974425203454130
28	0,974692423020427	1,974750426352940
29	0,976576452645915	1,976533660474480
30	0,975998817736132	1,975973406160780
31	0,978168551730336	1,978315736283810
32	0,978374982024472	1,978128973085690
33	0,977588188985654	1,977752563391160
34	0,981025892488122	1,981174197562590
35	0,980489671588114	1,980121028184300
36	0,978308174689013	1,978370427061400
37	0,981825969478304	1,982268002165750
38	0,984526470588299	1,984330065495330
39	0,981233387955656	1,980737072985710
40	0,979014947473060	1,979158584532350
41	0,983125539172505	1,983753176406040
42	0,987652526888156	1,987725779136010
43	0,986053002926814	1,985452707969990
44	0,981132658660755	1,980617777555770
45	0,979457507517424	1,979691832810680
46	0,983841095567324	1,984629534168840
47	0,989764476643034	1,990210071244350
48	0,991208533711413	1,990897386250320
49	0,987617090324237	1,986853884271900
50	0,982327170110490	1,981675034382900
51	0,979439616706782	1,979416988198590
52	0,981619360875373	1,982325906742440
53	0,987634208055477	1,988539526211630
54	0,993074672437313	1,993547242205210
55	0,994852859229456	1,994710277394370
56	0,992899201703814	1,992281437412030
57	0,988533190205297	1,987685263832580
58	0,983516613498202	1,982763568264630
59	0,979985293932180	1,979692216079820
60	0,979892234279782	1,980276172424070
61	0,983672293654117	1,984573402610830
62	0,989454812520677	1,990403745452570
63	0,994464343876746	1,995080542786350
64	0,997197238868522	1,997396312681930
65	0,997682450465305	1,997531561413380
66	0,996408510015100	1,995968334879710
67	0,993714455756719	1,993027560805260
68	0,989909859811763	1,989059944917710
69	0,985584171938342	1,984737726617450
70	0,981731566420976	1,981125827842420
71	0,979572712856932	1,979440441689200
72	0,980062943080857	1,980504941658420
73	0,983253912574810	1,984135054174420
74	0,988038238197962	1,989037918535880
75	0,992765418474441	1,993584580802980
76	0,996273673346273	1,996792754452880
77	0,998321742069377	1,998578634326020
78	0,999246820676180	1,999328065125700
79	0,999461150387592	1,999426401646450
80	0,999196480280807	1,999059599881450

Немонотонность последовательности, видимая на графиках, построенных по по этим данным, может быть объяснена лишь погрешностями вычисления, так как тенденция к монотонности налицо... или я чего-то не понял? :)

Пределы отношения 2 соседних элементов возвратных последовательностей порядка 2,3,...,80
Пределы отношения 2 соседних элементов возвратных последовательностей порядка 2,3,...,80

 Возвратные последовательности - расчёты из этой статьи в Excel (69 Кб)

Тем не менее, если золотое сечение, получаемое возвратной последовательностью 2 порядка, играет такую фундаментальную роль в природе, может, предел последовательности 3 порядка и даёт те самые волшебные числа с тремя четвертями? :)

31.10.2012, 12:27 [13434 просмотра]


теги: программирование числа c++ математика excel

К этой статье пока нет комментариев, Ваш будет первым