未分类 · 2023年 4月 4日 3

⭐Latex⭐❤Highlight❤

$$ 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