三分法求极值
二分法適用于單調函數求極值的問題
?
如果遇上了不單調的函數呢?like this:
?
對于這種在指定區間里只有一個極值點的函數(凸函數凹函數都可以),我們可以使用三分法求極值
三分極值法的思想:對于區間[l,r],令m=(l+r)/2即中點,再令mm=(m+r)/2,即右半段的中點。這樣l,m,mm,r四個點就把區間分成了三份。
此時若m更靠近極值點,則令r=mm。否則令l=m;這樣就把區間縮小了。
對于用float類型表示的連續函數,可以設定一個迭代次數size,例如可以取size=100。當運行了100次之后差不多就能取到極值點了2333
?
例如下面的程序:求二次函數y=(x-10)^2在區間[0,30]上的最小值
#include <iostream> using namespace std;float l,r,m,mm,ans1,ans2;float fun(float x) {return ((x-10)*(x-10)); }int main() {int size=100;l=0; r=30;while (size--){m=(l+r)/2;mm=(m+r)/2;ans1=fun(m);ans2=fun(mm);if (ans1<ans2) r=mm;else l=m;}cout<<ans1<<endl;cout<<m<<endl;return 0; }輸出:0 10
?
求最大值?改成ans1>ans2即可
?
?
注意:若區間內該函數有兩個峰(or谷),則不一定能得到正確的解。比如像這樣的函數:
拿鼠標手繪的圖片,略渣==
如圖,在靠近r的位置有個橫坐標很短的峰,盡管這個峰是最大值,但是無奈m和mm點都在它左邊,而且m點的函數值大于mm,會導致r=mm。這樣這個真正的最值點就被錯過了。
?
?
?三分法在一些數學題(特別是計算幾何題)中很有用。
?
?
?Reference:
http://chenjianneng3.blog.163.com/blog/static/128345126201033101044920/
?http://blog.csdn.net/eastmoon502136/article/details/7706479
?
轉載于:https://www.cnblogs.com/pdev/p/3838523.html
總結
- 上一篇: 寻找喜欢的东西~
- 下一篇: please wait while wi