Newton法(求適用於二階極小值)

2021-10-14 07:29:41 字數 1969 閱讀 3233

給:minf(x),初始點:x0

過程①

求出下降方向d:∇^2 f(x0) * d =- ∇f(x0)

過程②

更新x:x1 = x0 + d

過程③

||∇f(x)|| < ε,則得到x* = x

import matplotlib.pyplot as plt

import sympy

import numpy as np

plt.rcparams[

'font.sans-serif']=

['simhei'

]#用來正常顯示中文標籤

plt.rcparams[

'axes.unicode_minus']=

false

x1 = sympy.symbol(

'x1'

)x2 = sympy.symbol(

'x2'

)f = x1 **

2+ x2 **

2+ x1 * x2 +

2* x1 -

3* x2

# 梯度向量 gfun

gfun =

lambda x: np.array([2

* x[0]

+ x[1]

+2,2

* x[1]

+ x[0]

-3])

# 海森矩陣 hess

hess =

lambda x: np.array([[

2,1]

,[1,

2]])

x = np.array(

[0.0

,0.0])

defnewton

(x):

lx1=

lx2=

for i in

range

(100):

0])1

])dk = gfun(x)

print

(x) length = np.linalg.norm(dk)

# print(length)

if length <

0.05

:print

(x)break

else

: v2fk = hess(x)

dk =-1

*np.linalg.solve(v2fk, dk)

x += dk

plt.plot(lx1,lx2,linestyle=

"--"

, marker=

"o", color=

"blue"

,label=

"newton軌跡"

)def

graph()

: x1 = np.arange(-3

,3+0.05

,0.05

) x2 = np.arange(-1

,4.5

+0.05

,0.05

)[x1, x2]

= np.meshgrid(x1, x2)

f = x1 **

2+ x2 **

2+ x1 * x2 +

2* x1 -

3* x2 # 給定的函式

最速下降法(適用於求二階極小值)

最速下降法步驟 給 min,初始點 x0 a0,b0 t,精度 過程 求出求出下降方向d,步長 下降方向 d f x 下次更新x的最優步長 x f x d 0 過程 更新x x1 x0 d0 過程 當 f x 則停,最小值x x 最速下降法 精確搜尋 import sympy import nump...

折半查詢法(僅適用於已排好順序)

includeusing namespace std templateint binarysearch type array,int lenght,type key 不適用於char 型別 array mid key right mid 1 left mid 1 return 1 int main ...

適用於初學者的Python基礎(二)

字串 這種資料型別在生活中很常見,比如密碼,姓名,賬號等等 1.python中的字串格式 2.字串輸出 3.字串輸入 4.下標和切片 所謂的下標就是編號,好比每個足球運動員身上的號碼牌一樣,通過這個號碼牌我們就可以找到這個人 字串中 下標 的使用 如果想要取出部分字元,那麼可以通過下標的方法 下標從...