روش دو بخشی – به زبان ساده (+ دانلود فیلم آموزش گام به گام)
سادهترین الگوریتم یافتن ریشه معادلات روش دو بخشی یا تنصیف (Bisection Method) است. این الگوریتم را میتوان بر هر تابع پیوسته در بازه اعمال کرد که علامت مقدار تابع از تا تغییر میکند. فرایند روش دو بخشی ساده است: بازه به دو قسمت تقسیم میکنیم و یک جواب باید در یک زیربازه وجود داشته باشد که در آن، علامت تغییر میکند. روند مذکور را تکرار میکنیم.
الگوریتم روش دو بخشی
فرایند روش دو بخشی به صورت زیر است:
- بازه شروع را انتخاب کنید، به گونهای که .
- نقطه میانی که را محاسبه کنید.
- زیربازه را تعیین کنید:
- اگر ، آنگاه به عنوان بازه بعدی در نظر گرفته میشود که در آن، و .
- اگر ، آنگاه به عنوان بازه بعدی در نظر گرفته میشود که در آن، و .
- مراحل ۲ و ۳ را تا زمانی که طول بازه به یک مقدار از پیش تعیین شده برسد، تکرار کنید.
- نقطه میانی را محاسبه کنید.
طبق قضیه مقدار میانی، یک جواب برای معادله در بازه تضمین شده است که در بازه پیوسته بوده و . به عبارت دیگر، علامت تابع در بازه مذکور تغییر کرده و در نتیجه، باید در نقطه (یا نقاطی) درون بازه برابر با صفر شود.
خطای مطلق روش دو بخشی
روش دو بخشی (عموماً) رویکردی برای به دست آوردن جواب دقیق معادله به دست نمیدهد. البته، میتوانیم مقدار خطای مطلق را در تقریب تخمین بزنیم.
قضیه
فرض کنید تابعی پیوسته در بازه باشد به گونهای که . اگر بعد از تکرار روش دو بخشی، نقطه میانی در اُمین زیربازه باشد:
آنگاه جواب دقیق معادله در زیربازه وجود خواهد داشت و مقدار خطای مطلق برابر است با:
میتوانیم محدوده خطا را برای مشاهده حداقل تکرار لازم برای تضمین کمتر بودن خطای مطلق از مقدار از پیش تعیین شده بازنویسی کنیم:
پیادهسازی در پایتون
تابعی مینویسیم و نام آن را "bisection" قرار میدهیم. این تابع چهار ورودی "b" ،"a" ،"f" و "N" دارد و خروجی آن، حل معادله با بار تکرار روش دو بخشی است. اگر در هر نقطه از تکرار داشته باشیم: (به دلیل بازه اولیه نامناسب یا گرد کردن خطا در محاسبات)، آنگاه در خروجی برنامه، عبارت "Bisection method fails." چاپ میشود و خروجی "None" خواهد بود.
برنامه پایتون مربوط به تابع مذکور به صورت زیر است.
برای مثال، پارامترهای ورودی تابع را و تکرار در بازه در نظر میگیریم و میخواهیم نسبت طلایی را تقریب بزنیم:
نسبت طلایی ، ریشه چندجملهای درجه دوم است.
1.618033990263939
همچنین تضمین میشود که مقدار خطای مطلق کمتر از باشد:
1.4901161193847656e-08
بررسی میکنیم که مقدار خطای مطلق کمتر از محدوده خطا باشد:
True
پیادهسازی در متلب
روش دو بخشی را میتوان به سادگی در متلب نیز پیادهسازی کرد.
برای مثال، کد متلب روش دو بخشی برای یافتن ریشه در بازه به صورت زیر است:
خروجی این حاصل از اجرای کد بالا به صورت زیر خواهد بود:
n = 1, x = 1, f(x) = -2 n = 2, x = 1.5, f(x) = -0.125 n = 3, x = 1.75, f(x) = 1.6094 n = 4, x = 1.625, f(x) = 0.66602 n = 5, x = 1.5625, f(x) = 0.2522 n = 6, x = 1.5313, f(x) = 0.059113 n = 7, x = 1.5156, f(x) = -0.034054 n = 8, x = 1.5234, f(x) = 0.01225 n = 9, x = 1.5195, f(x) = -0.010971 n = 10, x = 1.5215, f(x) = 0.00062218 n = 11, x = 1.5205, f(x) = -0.0051789 n = 12, x = 1.521, f(x) = -0.0022794 n = 13, x = 1.5212, f(x) = -0.00082891 n = 14, x = 1.5214, f(x) = -0.00010343 n = 15, x = 1.5214, f(x) = 0.00025935 n = 16, x = 1.5214, f(x) = 7.7956e-05 n = 17, x = 1.5214, f(x) = -1.2739e-05 n = 18, x = 1.5214, f(x) = 3.2608e-05 n = 19, x = 1.5214, f(x) = 9.9343e-06 n = 20, x = 1.5214, f(x) = -1.4026e-06
به طور مشابه، کد زیر و نتیجه آن مربوط به روش دو بخشی برای یافتن ریشه معادله در بازه است:
نتیجه:
n = 1, x = 3, f(x) = -1.9765 n = 2, x = 4.5, f(x) = 5.792 n = 3, x = 3.75, f(x) = 0.4339 n = 4, x = 3.375, f(x) = -1.047 n = 5, x = 3.5625, f(x) = -0.38476 n = 6, x = 3.6563, f(x) = 0.0037101 n = 7, x = 3.6094, f(x) = -0.19557 n = 8, x = 3.6328, f(x) = -0.097211 n = 9, x = 3.6445, f(x) = -0.047073 n = 10, x = 3.6504, f(x) = -0.021763 n = 11, x = 3.6533, f(x) = -0.0090467 n = 12, x = 3.6548, f(x) = -0.0026734 n = 13, x = 3.6555, f(x) = 0.00051706 n = 14, x = 3.6552, f(x) = -0.0010785 n = 15, x = 3.6553, f(x) = -0.0002808 n = 16, x = 3.6554, f(x) = 0.00011811 n = 17, x = 3.6554, f(x) = -8.1348e-05 n = 18, x = 3.6554, f(x) = 1.838e-05 n = 19, x = 3.6554, f(x) = -3.1484e-05 n = 20, x = 3.6554, f(x) = -6.5521e-06
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- روش نیوتن — به زبان ساده
- دستگاه معادلات خطی — به زبان ساده
- جذر یا محاسبه ریشه دوم عدد — به زبان ساده
^^
سلام ممنون از آموزشتان. عالی بود.
سلام ببخشید کسی میتونه معادلات درجه سوم را در پایتون حل کنید؟
عالی بود.ممنون
سلام.
سپاس از همراهیتان با مجله فرادرس.
سالم و سربلند باشید.