$$ x^{2}=\frac{1}{n-1}\sum_{i=1}^{n}\left ( x_{i}- \bar{x} \right ) =\frac{1}{n-1}\left ( \sum_{i=1}^{n}x_{i}^{2}-n \bar{x} ^{2} \right ) $$
import numpy as np
from sympy import *
class DFP:
def __init__(self, func, x, xk, epsilon, one_dim, one_dim_epsilon):
self.func = func # 函数
self.x = x # 自变量向量 Matrix类型
self.length = len(x) # 自变量个数
self.xk = xk # 初始点 Matrix类型
self.epsilon = epsilon # 精度
self.H = Matrix(np.identity(self.length)) # 初始矩阵:单位矩阵
self.k = 0
self.one_dim = one_dim # 一维搜索函数
self.one_dim_epsilon = one_dim_epsilon # 一维搜索的精度
self.path = [xk] # 优化路径
def solve(self):
f = Matrix([self.func])
g = f.jacobian(self.x).T
gk = g.subs([(self.x[i], self.xk[i]) for i in range(self.length)])
l = Symbol('l')
while True:
d = - self.H @ gk
temp = self.xk + l * d
tar = self.func.subs([(self.x[i], temp[i]) for i in range(self.length)])
lam = self.one_dim(tar, l, 0.0, self.one_dim_epsilon)
delta_x = lam * d
xkp = self.xk + delta_x
self.path.append(xkp)
if self.check(gk) or self.check(delta_x):
return xkp
gkp = g.subs([(self.x[i], xkp[i]) for i in range(self.length)])
delta_g = gkp - gk
self.H = self.H + (delta_x @ delta_x.T) / (delta_x.T @ delta_g)[0] - (
self.H @ delta_g @ (self.H @ delta_g).T) / (delta_g.T @ self.H @ delta_g)[0]
self.xk = xkp
gk = gkp
def check(self, grad):
l2 = sqrt(sum([i ** 2 for i in list(grad)]))
if l2 <= self.epsilon:
return True
return False
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。
耶耶