4.27訓練日誌

    完美的運動會~( ̄▽ ̄~)~,可以安心看ACM的知識了。最近幾天把之前寫過的題目看了一遍,重新整理了一下思路,並沒有進行太多新的內容。講真的,搜索挺難,都說思路簡單,但是編寫程序單單有思路是不夠的,這其中更多的是細節上的問題,每個問題都有每個問題不同的坑。
    關於三分法的一些知識總結
    三分法主要用於求解一個函數在某個區間內的極大(極小)值點首先對於一個凹函數y=f(x),我們要求它的極小值點。首先確定它的極小值點所在的區間爲[l,r]計算出兩個三分點:

mid=(l+r)/2
mid2=(mid+r)/2(其實這兩個點的位置是靈活的)
此時 l < mid <mid2 < r
計算出對應的函數值 f(mid)和f(mid2)。
當f(mid)<f(mid2)時,則極小值點一定不會在mid2和r之間。
反之f(mid)>f(mid2)時,極小值點一定該不會在l和mid之間。
因此,當f(mid)<f(mid2)時,極小值點在[l,mid2]內。此時令l=l,r=mid2繼續計算。
當f(mid)>f(mid2)時,極小值點在[mid,r]內。此時令l=mid,r=r繼續計算。
直到這個區間足夠小,可以認爲l=r時,l就是所求的極小值點。(可接受的誤差內)
代碼實現
double f(double a)
{
/返回函數值/
}
double Solve(double MIN,double MAX)//返回極值點
{
double l = MIN, r = MAX;
double mid, midmid;
double mid_f, midmid_f;
while (l + EPS < r)
{
mid = (l + r) / 2;
midmid = (mid + r) / 2;
mid_f = f(mid);
midmid_f = f(midmid);
// 假設求解最大極值.最小值則取小於號
if (mid_f >= midmid_f) r = midmid;
else l = mid;
}
return l;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章