Кіріспе

Тамыр табу алгоритмі
Бренттің циклді анықтау алгоритмі
Сандық талдауда Бренттің әдісі – екіге бөлу әдісін, секант әдісін және кері квадраттық интерполяцияны біріктіретін гибридті тамыр табу алгоритмі. Оның сенімділігі екіге бөлу сияқты, бірақ кейбір сенімсіз әдістердей жылдам болуы мүмкін. Алгоритм, мүмкін болса, потенциалды түрде жылдам жинақталатын секант әдісін немесе кері квадраттық интерполяцияны қолдануға тырысады, бірақ қажет болған жағдайда неғұрлым берік екіге бөлу әдісіне қайта оралады. Бренттің әдісі Ричард Брентке тиесілі және Теодорус Деккердің алдыңғы алгоритміне негізделген. Сондықтан бұл әдіс Брент-Деккер әдісі деп те аталады. Бренттің әдісінің қазіргі заманғы жақсартуларына Чандрупатла әдісі кіреді, ол тамырларының маңында тегіс функциялар үшін қарапайым және жылдам; Риддерс әдісі, ол итерациялар үшін қарапайым жабық формула беретін квадраттық емес, экспоненциалдық интерполяцияларды жүзеге асырады; және ITP әдісі, ол нашар жағдайдың ең нашар сценарийі мен асимптотикалық кепілдіктерге қол жеткізетін regula falsi және екіге бөлу арасындағы гибрид.

Мысал

Егер f(x) = (x + 3)(x − 1)2 функциясының нөлін іздеп жүрміз делік. [a0, b0] = [−4, 4/3] дегенді бастапқы аралық ретінде аламыз. Бізде f(a0) = -25 және f(b0) = 0.48148 (бұл бөлімдегі барлық сандар дөңгелектенді), сондықтан f(a0)f(b0) < 0 және |f(b0)| ≤ |f(a0)| шарттары қанағаттандырылады. Бірінші итерацияда (b−1, f(b−1)) = (a0, f(a0)) = (−4, −25) және (b0, f(b0)) = (1.33333, 0.48148) арасындағы сызықтық интерполяцияны қолданамыз, бұл s = 1.23256 береді. Бұл (3a0 + b0) / 4 және b0 арасында орналасқан, сондықтан бұл мән қабылданды. Сонымен қатар, f(1.23256) = 0.22891, сондықтан a1 = a0 және b1 = s = 1.23256 деп белгілейміз. Екінші итерацияда (a1, f(a1)) = (−4, −25) және (b0, f(b0)) = (1.33333, 0.48148) және (b1, f(b1)) = (1.23256, 0.22891) арасындағы кері квадраттық интерполяцияны қолданамыз. Бұл 1.14205 береді, ол (3a1 + b1) / 4 пен b1 арасында орналасқан. Сонымен қатар, |1.14205 − b1| ≤ |b0 − b−1| / 2 теңсіздігі қанағаттандырылады, сондықтан бұл мән қабылданды. Сонымен қатар, f(1.14205) = 0.083582, сондықтан a2 = a1 және b2 = 1.14205 деп белгілейміз. Үшінші итерацияда (a2, f(a2)) = (−4, −25) және (b1, f(b1)) = (1.23256, 0.22891) және (b2, f(b2)) = (1.14205, 0.083582) арасындағы кері квадраттық интерполяцияны қолданамыз. Бұл 1.09032 береді, ол (3a2 + b2) / 4 және b2 арасында орналасқан. Бірақ Бренттің қосымша шарты іске қосылады: |1.09032 − b2| ≤ |b1 − b0| / 2 теңсіздігі қанағаттандырылмаған, сондықтан бұл мән қабылданбайды. Оның орнына [a2, b2] интервалының орта нүктесі m = −1.42897 есептеледі. Бізде f(m) = 9.26891 бар, сондықтан a3 = a2 және b3 = −1.42897 деп белгілейміз. Төртінші итерацияда (a3, f(a3)) = (−4, −25) және (b2, f(b2)) = (1.14205, 0.083582) және (b3, f(b3)) = (−1.42897, 9.26891) арасындағы кері квадраттық интерполяцияны қолданамыз. Бұл 1.15448 береді, ол (3a3 + b3) / 4 және b3 аралығында емес. Сондықтан ол орта нүктесімен ауыстырылады m = −2.71449. Бізде f(m) = 3.93934 бар, сондықтан a4 = a3 және b4 = −2.71449 деп белгілейміз. Бесінші итерацияда кері квадраттық интерполяция −3.45500 береді, бұл қажетті аралықта жатыр. Алайда, алдыңғы итерацияда екіге бөлу кезеңі болды, сондықтан |−3.45500 − b4| ≤ |b4 − b3| / 2 теңсіздігі қанағаттандырылуы керек. Бұл теңсіздік қате, сондықтан орта нүктесі m = −3.35724 қолданылады. Бізде f(m) = −6.78239, сондықтан m жаңа қарсы нүктеге айналады (a5 = −3.35724) және итерациясы бірдей қалады (b5 = b4). Алтыншы итерацияда кері квадраттық интерполяцияны қолдануға болмайды, өйткені b5 = b4. Сондықтан (a5, f(a5)) = (−3.35724, −6.78239) және (b5, f(b5)) = (−2.71449, 3.93934) арасында сызықтық интерполяцияны қолданамыз. Нәтижесі s = −2.95064, бұл барлық шарттарды қанағаттандырады. Бірақ итерация алдыңғы қадамда өзгермегендіктен, біз осы нәтижені қабылдамаймыз және қайтадан екіге бөлуді қолданамыз. Біз s = 3.03587 және f(s) = 0.58418 жаңартамыз. Жетінші итерацияда кері квадраттық интерполяцияны қолданамыз. Нәтижесі s = −3.00219, бұл барлық шарттарды қанағаттандырады. Енді, f(s) = −0.03515, сондықтан біз a7 = b6 және b7 = −3.00219 деп белгілейміз (a7 және b7 алмасып, |f(b7)| ≤ |f(a7)| шарты орындалады). Сегізінші итерацияда кері квадраттық интерполяцияны қолдануға болмайды, өйткені a7 = b6. Сызықтық интерполяция s = −2.99994 береді, ол қабылданады. Келесі итерацияларда x = −3 түбіріне тез жақындалады: b9 = −3 + 6·10−8 және b10 = −3 − 3·10−15.