平凡無所謂,
平淡無所謂,
但求每天早晨能望見你,
這已經足夠滿足。
身邊的一切如風,
而你讓我有了根,
就讓我愛你多些,
再多些,甚至滿瀉,
與你一生一世。
——暢寶寶的傻逼哥哥
過去使用最廣泛的共軛方向法是由Powell提出來的,這個方法與共軛梯度法一樣,開始也是來自凸二次問題,但是它也成功應用於非二次問題。
Powell法最顯著的特徵就是通過一系列線搜索生成共軛方向,所用的技術基於下面的定理:
定理1: 如果凸二次問題
f(x)=a+xTb+12xTHx
在直線
x=xa+αda
與
x=xb+αdb
上分別對α 最小化,得到的最小點分別爲x∗a,x∗b ,如圖1所示。
如果db=da ,那麼向量x∗b−x∗a 與da (或者db )共軛。
證明: 如果f(xa+αda),f(xb+αdb) 對α 最小化,那麼
df(xa+αda)dα=dTag(x∗a)=0df(xb+αdb)dα=dTbg(x∗b)=0(1a)(1b)
因爲
g(x∗a)=b+Hx∗ag(x∗b)=b+Hx∗b(2a)(2b)
因爲db=da ,所以由等式1與2可得
dTaH(x∗b−x∗a)=0
因此,向量x∗b−x∗a 與方向da (或者db )共軛,證畢。||
在Powell算法中,假設初始點爲x00 ,n 個線性無關方向爲d01,d02,…,d0n ,並且每次迭代執行一系列線搜索。雖然可以使用任意的線性無關方向集合,但是出於方便,我們使用座標方向集。
圖1
第一次迭代的時候,
f(x) 從初始點
x00 開始,在方向
d01,d02,…,d0n 上最小化分別得到點
x01,x02,…,x0n ,如圖2所示,新的方向
d0(n+1) 爲
d0(n+1)=x0n−x0
且f(x) 在這個方向上最小化得到新的點x0(n+1) ,然後更新方向集爲
d11d12d1(n−1)d1n=d02=d03⋮=d0n=d0(n+1)(3)
第一次迭代的效果就是f(x) 減少了Δf=f(x00)−f(x0(n+1)) 並且同時刪除了d01 加入了d0(n+1) 。
第二次得帶執行同樣的過程,從點
x10=x0(n+1)
開始,f(x) 在方向d11,d12,…,d1n 上最小化分別得到點x11,x12,…,x1n ,如圖3所示,然後生成新的方向d1(n+1)
d1(n+1)=x1n−x10
f(x) 在方向d1(n+1) 上最小化得到點x1(n+1) 。因爲
d1n=d0(n+1)
所以d1(n+1) 與dn 共軛,因此我們令
d21d22d2(n−1)d2n=d12=d13⋮=d1n=d1(n+1)(4)
新的方向解將包含一對共軛方向,即d2(n−1),d2n 。
用同樣的方式執行上面的過程,每次迭代都會增加一個共軛方向。Powell法需要n(n+1) 次線搜索,因爲每次迭代包含(n+1) 次線搜索,共需要n 次迭代,Powell算法實現如下:
算法1:共軛梯度算法步驟1輸入x00並初始化容忍誤差ε令d01=[x01 0 ⋯ 0]Td02=[0 x02 ⋯ 0]T⋮d0n=[0 0 ⋯ x0n]T令k=0步驟2對於i=1從n求出αki,就是最小化f(xk(i−1)+αdki)的值α令xki=xk(i−1)+αkidki步驟3生成新方向dk(n+1)=xkn−xk0求出αk(n+1),就是最小化f(x0+αdk(n+1))的值α令xk(n+1)=xk0+αk(n+1)dk(n+1)計算fk(n+1)=f(xk(n+1))步驟4如果∥αk(n+1)dk(n+1)∥<ε,輸出x∗=xk(n+1),f(x∗)=fk(n+1)算法結束步驟5更新方向d(k+1)1=dk2d(k+1)2=dk3⋮d(k+1)n=dk(n+1)令x(k+1)0=xk(n+1),k=k+1,令k=k+1然後回到步驟2
圖2
圖3