求凸函式極值 CSF迭代法 霧

2021-08-09 09:39:02 字數 2071 閱讀 7586

本演算法用來求解凸函式極值點的問題,由我在寫acm習題時想到,在網上並未找到這樣的演算法,拿出來給大家分享一下,如果網上沒有的話,我決定給它起名叫做 csf迭代法,如果這個演算法早已經存在,那就當看個笑話吧。

by 蔡少斐 西安交大 軟體53

確定乙個常數

n ,表示區間的劃分粒度,以及乙個常數ep

s表示精度。

先從定義域[l

,r] 中等差地取出n個點,x1

,x2,

...,xn。

x1

=l+(

r−l)

n+1,

xi=x

i−1+

r−ln

+1

計算f(

x1),

...,

f(xn

) ,挑選出使得f(

xt) 最大的點xt

。判斷定義域區間長度是否小於ep

s ,若是執行

6 ,否則執行5。

把定義域縮小到[x

t−1,

xt+1

] ,執行2。

x0

=l,x

n+1=

r

輸出xt

用反證法:假設存在一次迭代,使得極值點不在[x

t−1,

xt+1

] 裡面,那麼設這個極值點為xp

,並且有xp

>xt

+1,那麼可以知道區間[x

t−1,

xt+1

] 是單調遞增的。也就是說f(

xt+1

)>f(

xt) ,因此我們在演算法的第2個步驟時將選擇xt

+1而不是xt

,矛盾。

因而極值一定在我們所迭代的區間內。

設區間長度為le

n ,劃分粒度為

n ,精度要求為ep

s,遞迴深度為de

p 可以列出遞迴方程如下: t(

len)

=n+t

(len

(n+1

)/2)

其中滿足方程: (2

n+1)

depl

en=e

ps解得: o(

len)

=nlo

geps

len2

n+1

如果令劃分粒度n=

2 的話,等價於三分演算法。

double csf(double l,double r,int n = 2,double eps = 0.001)

return x;

}

函式總共有4個引數l,

r,n,

eps ,其中有3個引數l,

r,ep

s 都是給定的。

總是選取l=

−10000000,r

=10000000

當選取ep

s=0.001

時候

當選取eps

=0.000001

的時候

n 選取4或

6 的時候函式效果較好。

#include 

using

namespace

std;

double f(double x)

int cnt;

double csf(double l,double r,int n = 2,double eps = 0.001)

return x;

} int main()

return

0;}

牛頓迭代法(求函式的根)

在做二分與三分法的題時,聽聞有牛頓迭代法 感覺很高大上 自己居然捧起書看了一些 由於自己水平很渣,研究的並不深入。本篇未完結.個人感覺 1.使用牛頓迭代法,函式可以是任意 2.優點 對其單調性無特殊要求 缺點 若在該函式值處有多個根,往往只能求出乙個根 3.與二分三分法比較 二分要求是單調函式 三分...

C 迭代法求開方 牛頓迭代法求根近似值

include include double f double x double f2 double x int main printf lf s2 利用牛頓迭代法求方程的根 有這麼乙個方程2x 3 4x 2 3x 6 0 則令f x 2x 3 4x 2 3x 6 求出f x 6x 2 8x 3 下...

迭代法求平方根

迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法,即一次性解決問題。迭代法又分為精確迭代和近似迭代,二分法 和 牛頓迭代法 屬於近似迭代法。迭代演算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快 適合做重複性操作的特點,讓計算機對一組指令 或一定步驟 進行...