01-05-2017, 10:03 AM
(28-04-2017, 12:18 PM)mahdi mahalbani نوشته است:کاربرد فیبوناچیونحوه محاسبه ان را بنویسید؟صول كار با انواع فیبوناچی
انواع ابزارهای فیبوناچی در بازارهای مالی، روشی برای تحلیل بازگشت یا ادامه روند می باشد. از منظری انواع ابزارهای فیبوناچی نقاط حمایت و مقاومت می باشند كه با ابزارها و روش های گوناگون رسم می شوند. این سطوح بازگشت بر خلاف حمایت و مقاومت های قبلی كه تنها قیمتی خاص را نقطه حساس تلقی می كردند می توانند قیمتی خاص، منحنی روی نموداری، خطی مورب یا زمان خاصی را نقطه حساس حمایت یا مقاومت تعریف كنند. در استفاده از ابزارهای فیبوناچی درصدها اهمیتی فوقالعاده دارند. عموم این درصدها از نسبت درصدهای بین اعداد فیبوناچی بدست می آیند. به غیر از چند عدد ابتدای سری اعداد فیبوناچی، هر كدام از اعداد دنباله، تقریبا 1.618 برابر عدد قبل از خود هستند (نسبت طلایی) و هر عدد 0.618 برابر عدد بعد از خود می باشد. این نسبت ها به درصد به ترتیب 161.8 درصد و 61.8 درصد می شوند. درصدهای دیگری نیز مهم هستند كه در زیر می آید. تقسیم عدد اول به عدد دوم سری اعداد فیبوناچی یك به یك یا به عبارتی 100 درصد را نشان می دهد. تقسیم عدد دوم به عدد سوم سری اعداد فیبوناچی 0.5 یا به عبارتی 50 درصد را نشان می دهد. در اعداد بالاتر سری اعداد فیبوناچی و تقسیم هر عدد به دو عدد بعد از آن، مشاهده می شود حاصل تقسیم به 38.2 درصد تمایل می كند. در اعداد بالاتر سری اعداد فیبوناچی و تقسیم هر عدد به سه عدد بعد از آن، مشاهده می شود حاصل تقسیم به 23.6 درصد تمایل دارد. این تناسبات در بازارهای بورس بقدری مقدس شده كه بیشتر معامله کنندگان به آن احترام گذاشته و بدقت آنها را مراعات می كنند و نقاطی برای ورود و خروج از معاملات تلقی میشوند و شاید این پدیده دال بر این باشد كه حس طمع و ترس انسانها در جهت كسب سود و یا فرار از زیان و حفظ سرمایه با تناسبات طلایی بشدت گره خورده است .بسیاری از فرآیندهای طبیعی از جمله ترکیب ساختار بدن موجودات زنده نظم مشخصی دارند و از دنبالهی اعدادی تبعیت میکنند که امروزه با نام دنبالهی اعداد فیبوناچی (فیبوناتچی - Fibonacci) شناخته میشود. مشهورترین خاصیت این اعداد نسبت دو جملهی متوالی آنها به ازای جملات بزرگ دنباله است که به عدد طلایی مشهور است.
این دنباله از جمله دنبالههای عددی است که در طراحی سوالات مسابقات برنامهنویسی نیز استفاده میشود و گاهی در حل سوالات کاربرد دارد. از این رو آشنایی با روشهای مختلف تولید جملات آن حائز اهمیت است.
تعریف: دنبالهی اعداد فیبوناچی روی اعداد حسابی به صورت زیر تعریف میشود:
Fn=⎧⎩⎨⎪⎪Fn−1+Fn−210n>1n=1n=0Fn={Fn−1+Fn−2n>11n=10n=0
همانگونه که از تعریف مشخص است، جملات این دنباله از جمع دو جملهی قبلی آن با شروع از دو مقدار صفر و یک به دست میآید:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
محاسبهی بازگشتی بر اساس تعریف
سادهترین راهکار برای محاسبهی اعداد دنبالهی فیبوناچی استفاده از تابع بازگشتی زیر است:
1long long fibo_1(int n){
2
if(n < 2)
3
return n;
4
return fibo_1(n - 1) + fibo_1(n - 2);
5
}
این تابع فراخوانی تابع با مقدار nn را به فراخوانی بازگشتی با دو مقدار بسیار نزدیک به nn تبدیل میکند. بنابراین میتوان پیشبینی کرد که زمان تولید خروجی نسبت به اندازهی ورودی از مرتبهی نمایی باشد. برای مثال فراخوانیهای بازگشتی تابع برای محاسبهی F7F7 در شکل زیر آمده است:
به این ترتیب برای محاسبهی F7F7 تابع مذکور 4141 بار فراخوانی میشود که در مقایسه با مقدار nn مقرون به صرفه نیست. دلیل این فراخوانیهای زیاد تکرار در محاسبهی جملات میانی است. به عنوان نمونه بر اساس شکل فوق مقدار F2F2 هشت بار به صورت تکراری محاسبه شده است.
محاسبه با استفاده از روش برنامهنویسی پویا
برای رفع مشکل فراخوانیهای تکراری در محاسبات میتوان از روش برنامهنویسی پویا و حرکت از جزء به کل استفاده کرد:
1long long fibo_2(int n){
2
if(n < 2)
3
return n;
4
int f1 = 0, f2 = 1, f3;
5
for(int i = 2 ; i <= n ; i++){
6
f3 = f1 + f2;
7
f1 = f2;
8
f2 = f3;
9
}
10
return f3;
11
}
مرتبهی اجرایی محاسبهی جملهی nn- ام دنبالهی فیبوناچی با این راهکار Θ(n)Θ(n) است که در مقایسه با روش قبل (مرتبهی نمایی) عملکرد بسیار بهتری دارد. همچنین با توجه به کنار گذاشتن فراخوانیهای بازگشتی حافظهی کمتری مصرف میشود.
نکته: در صورتی که نیاز به در اختیار داشتن تمام جملات دنباله در یک بازهی مشخص باشد، این روش بهترین راهکار ممکن است و کافیست مقدار f3 در هر تکرار کد فوق در یک مخزن جدا مانند آرایه ذخیره شود.
محاسبه با استفاده از روش تقسیم و غلبه
تعریف رابطهی فیبوناچی خود به وضوح یک راهکار تقسیم و غلبه برای محاسبهی جملات آن است. اما همانگونه که بحث شد، استفاده از آن رابطه و فراخوانیهای بازگشتی مقرون به صرفه نیست.
یک تعریف بازگشتی دیگر دنبالهی فیبوناچی به صورت زیر است:
F2n−1=F2n+F2n−1F2n=(2Fn−1+Fn)FnF2n−1=Fn2+Fn−12F2n=(2Fn−1+Fn)Fn
این رابطه محاسبهی مقدار جملهی nn- ام دنباله را به محاسبهی دو جمله در حدود n2n2 تقسیم میکند. چنین رابطهای مرتبهی O(logn)O(logn) را تداعی میکند. اما پیادهسازی بازگشتی این رابطه نیز فراخوانیهای تکراری دارد. به شکل زیر توجه کنید:
این راهکار تعداد فراخوانیها برای محاسبهی F7F7 را از 41 فراخوانی حالت بازگشتی عادی به11 فراخوانی کاهش میدهد. اما همچنان برخی فراخوانیهای تکراری وجود دارد که مرتبهی آن را بزرگتر از Θ(n)Θ(n) ( مرتبهی محاسبه به روش برنامهنویسی پویا) میکند. این فراخوانیهای تکراری زمانی که عدد جمله بزرگتر میشود، تاثیر چشمگیری در زمان محاسبه دارند.
برای رفع این مشکل و بالا بردن کارایی الگوریتم میتوان جملات تولید شده را در حافظه نگه داشت تا از محاسبهی مجدد آن جلوگیری کرد. در چنین حالتی اگرچه فضای مصرفی الگوریتم بالا میرود، اما زمان اجرای آن بهبود قابل توجهی پیدا میکند. به عنوان مثال برای محاسبهی جملهی F13941207F13941207 بیش از بیست میلیون فراخوانی تابع بدون ذخیره کردن مقادیر جملات کوچکتر صورت میگیرد (بسیار بیشتر از عدد 1394120713941207) که با ذخیره کردن این مقادیر به کمتر از 130130 فراخوانی کاهش مییابد!
نکته: ممکن است این سوال پیش بیاید که در روش فراخوانی بازگشتی با تعریف اصلی دنبالهی فیبوناچی نیز امکان ذخیره کردن جملات دنباله برای پیشگیری از محاسبهی مجدد آن وجود دارد. ویژگی مهم روش اخیر این است که تنها بخشی از اعداد دنباله تولید و ذخیره میشوند. در حالی که برای محاسبه با تعریف یا روش برنامهنویسی پویا باید تمامی جملات قبلی دنباله تولید و ذخیره شوند. به عنوان مثال، برای محاسبهی F13941207F13941207 با راهکار اخیر تنها نیاز به ذخیره کردن 6464 جمله است که در مقایسه با تمامی جملات بسیار کمتر است.
محاسبه با استفاده از روش ماتریسی
دنبالهی فیبوناچی را میتوان به فرم ماتریسی زیر نشان داد:
(FnFn−1)=(1110)(Fn−1Fn−2)(FnFn−1)=(1110)(Fn−1Fn−2)
با بسط دادن سمت راست رابطه، برابری زیر حاصل میشود:
(FnFn−1)=Mn−1(F1F0)=Mn−1(10),M=(1110)(FnFn−1)=Mn−1(F1F0)=Mn−1(10),M=(1110)
به عبارت دیگر، درایهی سطر اول حاصلضرب توان (n−1)(n−1)- ام ماتریس MM در ماتریس ستونی یک و صفر همان FnFn است. بنابراین کافی است عنصر (Mn−1)11(Mn−1)11 ( عنصر سطر اول و ستون اول) محاسبه شود (چرا؟).
این رابطه محاسبهی جملات دنبالهی فیبوناچی را به محاسبهی توان یک ماتریس بدل میکند. توان یک عدد یا یک ماتریس مربعی را میتوان با استفاده از رابطهی زیر حساب کرد که همواره از مرتبهی O(logn)O(logn) است (چرا؟):
An=⎧⎩⎨(An2)2(An−12)2×An%2=0n%2=1An={(An2)2n%2=0(An−12)2×An%2=1
مزیت بزرگ این روش نسبت به روش قبلی عدم نیاز به ذخیرهسازی مقادیر جملات کوچکتر است و در مقابل هزینهی سنگینتر محاسبهی ضرب اعداد را دارد که با توجه به کم بودن آنها (مرتبهی لگاریتمی) قابل چشمپوشی است. همینطور تعداد فراخوانیهای بازگشتی کمتری نسبت به روش قبلی دارد. به عنوان مثال، با این روش تنها 2424 فراخوانی بازگشتی برای محاسبهی توان 1394120613941206- ام ماتریس MM و در نتیجه محاسبهی F13941207F13941207 نیاز است.
دنباله فیبوناچی[ویرایش]
در واقع فيبوناچي در سال 1202 به مسئله عجيبي علاقمند شد. او مي خواست بداند اگر يک جفت خرگوش نر و ماده داشته باشد و رفتاري براي زاد و ولد آنها تعريف کند در نهايت نتيجه چگونه خواهد شد. فرضيات اينگونه بود :
- شما يک جفت خرگوش نر و ماده داريد که همين الآن بدنيا آمده اند.
- خرگوشها پس از يک ماه بالغ مي شوند.
- دوران بارداري خرگوشها يک ماه است.
- هنگامي که خرگوش ماده به سن بلوغ مي رسد حتما" باردار مي شود.
- در هر بار بارداري خرگوش ماده يک خرگوش نر و يک ماده بدنيا مي آورد.
- خرگوش ها هرگز نمي ميرند.
حساب کنید پس از n ماه چند جفت از این نوع خرگوش خواهیم داشت؟
فرض کنیم xn تعداد جفت خرگوش پس از n ماه باشد، میدانیم که x۲=۱,x۱=۱، تعداد جفت خرگوشها در ماه n+۱ ام برابر خواهد بود با حاصل جمع تعداد جفت خرگوشهایی که در این ماه متولد میشوند با تعداد جفت خرگوشهای موجود(xn).اما چون هر جفت خرگوش که از دو ماه قبل موجود بوده هم اکنون حداقل دوماه سن خواهند داشت و به سن زادو ولد رسیدهاند تعداد جفت خرگوش های متولد شده برابر خواهد بود با xn-۱، پس خواهیم داشت:
x۱ = ۱ , x۲ = ۱ , xn + ۱ = xn + xn - ۱
که اگر از قواعد مذکور پیروی کنیم به دنباله زیر خواهیم رسید که به دنباله فیبوناچی مشهور است.
۱, ۱, ۲, ۳, ۵, ۸, ۱۳, ۲۱, ۳۴, ۵۵, ۸۹, ۱۴۴, ۲۳۳, ۳۷۷, ۶۱۰, ۹۸۷, ۱۵۹۷, ۲۵۸۴,…
فیبوناچی با حل این مسئله از راه حل فوق دنباله حاصل را به جهان ریاضیات معرفی کرد که خواص شگفتانگیز و کاربردهای فراوان آن تا به امروز نه تنها نظر ریاضیدانان بلکه دانشمندان بسیاری از رشتههای دیگر را به خود جلب کرده.
رابطهٔ دنبالهٔ فیبوناچی به این شکل است:
{\displaystyle F_{1}=F_{2}=1,\forall n>2:F_{n}=F_{n-1}+F_{n-2}}
برای مثال برای به دست آوردن جملهٔ دهم باید جملهٔ نهم (۳۴) و جملهٔ هشتم (۲۱) را با هم جمع کنیم که برابر ۵۵ میشود.
جمله عمومی دنباله فیبوناچی[ویرایش]
چند فرمول برای احتساب جملهٔ nام دنبالهٔ فیبوناچی، بدون استفاده از جملات ماقبل وجود دارد.
{\displaystyle F\left(n\right)={{\varphi ^{n}-(1-\varphi )^{n}} \over {\sqrt {5}}}={{\varphi ^{n}-(-\varphi )^{-n}} \over {\sqrt {5}}}\,,}، یکی از این فرمول هاست.{\displaystyle \varphi } (فی) همان عدد طلایی است که برابر با :{\displaystyle {1+{\sqrt {5}}} \over 2} میباشد.که برابر 3.5 بر روی 2 میباشد
ارتباط عدد طلایی با دنباله فیبوناچی[ویرایش]
روشهای متفاوتی برای بیان رابطه بین عدد طلایی و دنباله فیبوناچی وجود دارد که ما در اینجا به دو نمونه بسنده میکنیم.
نسبت دو عضو متوالی دنباله[ویرایش]
اولین مطلبی که در زمینه ارتباط با دنباله فیبوناچی قابل ذکر است به این قرار است: دنباله را بار دیگر در نظر میبینیم:
۱۰----۹----۸----۷----۶----۵----۴----۳----۲----۱----شماره جمله
۵۵----۳۴----۲۱----۱۳----۸----۵----۳----۲----۱----۱----مقدار جمله
نسبت جمله دوم به اول برابر است با ۱
نسبت جمله سوم به دوم برابر است با ۲
نسبت جمله چهارم به سوم برابر است با ۱٫۵
نسبت جمله پنجم به چهارم برابر است با ۱٫۶۶
نسبت جمله ششم به پنجم برابر است با ۱٫۶
نسبت جمله هفتم به ششم برابر است با ۱٫۶۲۵
نسبت جمله هشتم به هفتم برابر است با ۱٫۶۱۵
نسبت جمله نهم به هشتم برابر است با ۱٫۶۱۹
نسبت جمله دهم به نهم برابر است با ۱٫۶۱۷
به نظر میرسد که این رشته به عدد طلایی نزدیک میشود. اگر نسبت عدد چهلم این رشته را به عدد قبلی حساب کنیم به عدد ۱٫۶۱۸۰۳۳۹۸۸۷۴۹۸۹۵ میرسیم که با تقریب ۱۴ رقم اعشارنسبت طلایی را نشان میدهد. نسبت جملات متوالی به عدد طلایی میل میکند.
معادله خط[ویرایش]
معادلهٔ خطی به صورت y=mx در نظر میگیریم. m به معنی شیب خط است و یک عدد حقیقی است. میدانیم اگر m گنگ باشد، خط y=mx از هیچ نقطهای با مختصات صحیح به جز مبدأ عبور نخواهد کرد. در واقع این خط امکان ندارد از نقطهای (جز مبدأ) عبور کند که هم x و هم y آن عدد صحیح باشند.
حال به جای m قرار میدهیم: φ. یعنی خط y=φx را در نظر میگیریم. چون φ هم یک عدد گنگ است، این خط از هیچ نقطهای با x و yy صحیح (جز مبدأ) عبور نخواهد کرد. به همین دلیل نقطههایی را با x و y صحیح در نظر میگیریم که کمترین فاصله را از این خط دارند. ابتدا به نظر میرسد نقطهٔ (۱، ۱) کمترین فاصله را با این خط دارد. ولی فاصلهٔ نقطهٔ (۲، ۱) از این خط کمتر است. نقطهٔ (۳، ۲۲) فاصلهٔ کمتری با این خط دارد. همچنین فاصلهٔ نقطهٔ (۵، ۳) از این هم کمتر است. این نقاط به همین ترتیب ادامه خواهند یافت و در زیر چند نقطهٔ بعدی را که فاصلهشان از این خط کمتر میشود را میبینید:...،(۵۵، ۳۴)، (۳۴، ۲۱)، (۲۱، ۱۳)، (۱۳، ۸)، (۸، ۵)، (۵، ۳)، (۳، ۲)، (۲، ۱)، (۱، ۱)
صحت مطالب فوق به راحتی قابل بررسی است. با کمی دقت در مختصات این نقاط درخواهیم یافت که این مختصات از الگوی دنباله فیبوناچی پیروی میکنند. این نقاط را نقاط فیبوناچی مینامند.