本演算法用來求解凸函式極值點的問題,由我在寫acm習題時想到,在網上並未找到這樣的演算法,拿出來給大家分享一下,如果網上沒有的話,我決定給它起名叫做 csf迭代法,如果這個演算法早已經存在,那就當看個笑話吧。
by 蔡少斐 西安交大 軟體53確定乙個常數
n ,表示區間的劃分粒度,以及乙個常數ep
s表示精度。
先從定義域[l
,r] 中等差地取出n個點,x1
,x2,
...,xn。
x1計算f(=l+(
r−l)
n+1,
xi=x
i−1+
r−ln
+1
x1),
...,
f(xn
) ,挑選出使得f(
xt) 最大的點xt
。判斷定義域區間長度是否小於ep
s ,若是執行
6 ,否則執行5。
把定義域縮小到[x
t−1,
xt+1
] ,執行2。
x0輸出xt=l,x
n+1=
r
用反證法:假設存在一次迭代,使得極值點不在[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
當選取epn 選取4或s=0.001
時候
當選取eps
=0.000001
的時候
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 下...
迭代法求平方根
迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法,即一次性解決問題。迭代法又分為精確迭代和近似迭代,二分法 和 牛頓迭代法 屬於近似迭代法。迭代演算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快 適合做重複性操作的特點,讓計算機對一組指令 或一定步驟 進行...