python計算牛頓迭代法

2021-10-05 04:52:25 字數 2557 閱讀 6383

利用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 即為...