利用python的符號計算庫sympy庫來計算函式的雅可比矩陣和海森矩陣
from sympy import
*import numpy as np
#計算具體值
defcalculatevalue
(jac_or_hess, x, isjacmac)
: result =
x_dic =
for data in
range(1
,len
(x)+1)
: x_dic[
'x{}'
.format
(data)
]= x[data-1]
if(isjacmac)
:for fun in jac_or_hess:
float
(fun.evalf(subs = x_dic)))
else
:for fun in jac_or_hess:
tmp =
for f in fun:
float
(f.evalf(subs = x_dic)))
return np.matrix(result)
.t#返回雅可比矩陣
defjacobian
(y, parasymbos)
: grad =
for para in parasymbos:
fun = diff(y, para)
return grad
#返回海森矩陣
defhessianm
(y, parasymbos)
: hess =
for i in jacobian(y, parasymbos):)
return hess
defcoutsolve
(x):
print
('[ '
, end='')
for i in x:
print
(i, end=
' ')
print
(']'
)x1, x2, x3, x4 = symbols(
"x1 x2 x3 x4"
)parasymbos =
[x1, x2, x3, x4]
y =100*(
(x1**
2-x2)**2
)+(x1-1)
**2+(x3-1)
**2+90
*((x3**
2-x4)**2
)+10.1*(
(x2-1)
**2+(x4-1)
**2)+
19.8
*(x2-1)
*(x4-1)
x0 =[-
3,-1
,-3,
-1]time =
2000
#最大迭代次數
err =1e-
8#誤差小於此值時停止迭代
print
("\n優化函式為:fx ="
, y)
print
("初值為: x = "
, end='')
coutsolve(x0)
print
("允許的最大迭代次數為:"
, time)
print
("精度為:{}\n"
.format
(err)
)for i in
range(1
, time)
:print
("開始第{}輪迭代...."
.format
(i))
grad = calculatevalue( jacobian(y, parasymbos)
, x0,
true
)#一階梯度即雅可比矩陣
grad2 = calculatevalue( hessianm(y, parasymbos)
, x0,
false
)#二階梯度即海森矩陣
try:
delta =
-(grad2.i)
* grad
except
(np.linalg.linalgerror)
:print
("二階導矩陣不可逆,結束迭代。"
)print
("優化失敗。"
)break
print
("第{}次迭代結束。x = "
.format
(i),end='')
for index in
range
(len
(x0)):
x0[index]
+= delta[index,0]
coutsolve(x0)
if(delta.t * delta :print
("達到定義精度,停止迭代。"
)break
print(""
)
牛頓迭代法
創新工廠的筆試題 不用庫函式sqrt 求乙個整型數n的開方,要求精度達到0.001即可。在這裡首先介紹一下牛頓迭代法 假設乙個方程為 f x 0 那麼假設其解為x0,則用泰勒級數展開之後可得 f x f x0 f x0 x x0 0 其中x為其近似解。根據上式推導出 x x0 f x0 f x0 這...
牛頓迭代法
目前接觸到的牛頓迭代法主要應用於兩個方面 1 方程求根問題 2 最優化問題。1 求解方程。並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。原理是利用泰勒公式,在x0處展開,且展開到一階,即f x f x0 x x0 f x0 求解方程f x 0,即f x0 ...
牛頓迭代法
欲求某方程 f x 0 的根,按照以下步驟進行求解 令x0 1 也可以選擇其他值 i 0,1,2 1 求出 f xi 和 導數f xi 2 令 x i 1 xi f xi f xi 3 將 x i 1 帶入方程 f x 計算方程值,當方程值與目標值的誤差小於預定值時,退出演算法輸出 x i 1 即為...