def SubOptFun(CurrX, TruRegRad, GradVect, HessMat): """ :param CurrX: :param TruRegRad: :param GradVect: :param HessMat: :return: """ CurrX = np.array(CurrX) n = len(CurrX) EigVal, EigVect = np.linalg.eig(HessMat) EigValIndex = np.argsort(EigVal) # 排序,找最小特征值 EigVect = EigVect[:,EigValIndex] # 找到,特征值对应的特征向量 if np.min(EigVal) >= 1e-6 : NewtonSolution = (-1) * EigVect @ np.diag(EigVal ** (-1) ) @ EigVect.T @ GradVect NormD = np.linalg.norm(NewtonSolution) if NormD <= TruRegRad: XStar = CurrX + NewtonSolution return XStar else : InitLambda = 0 else : InitLambda = (-1) * np.min(EigVal) + 1e-6 IterStep = 1.0 IterLambda = InitLambda + IterStep while True : NewtonSolution = (-1) * EigVect @ np.diag((IterLambda + EigVal) ** (-1) ) @ EigVect.T @ GradVect NormD = np.linalg.norm(NewtonSolution) if NormD >= TruRegRad + 1e-6: InitLambda = IterLambda IterStep = 2 * IterStep IterLambda = InitLambda + IterStep elif NormD <= TruRegRad - 1e-6: EndLambda = IterLambda break else: XStar = CurrX + NewtonSolution return XStar while True : IterLambda = 0.5 * (InitLambda + EndLambda) NewtonSolution = (-1) * EigVect @ np.diag((IterLambda + EigVal) ** (-1) ) @ EigVect.T @ GradVect NormD = np.linalg.norm(NewtonSolution) if NormD >= TruRegRad + 1e-6: InitLambda = IterLambda elif NormD <= TruRegRad - 1e-6: EndLambda = IterLambda else: XStar = CurrX + NewtonSolution return XStar
时间: 2024-01-16 12:05:02 浏览: 131
这段代码是一个实现子优函数的函数,用于求解无约束优化问题的近似解。其中,参数CurrX是当前的优化变量,TruRegRad是真实约束半径,GradVect是梯度向量,HessMat是黑塞矩阵。该函数首先计算黑塞矩阵的特征值和特征向量,并通过排序找到最小特征值对应的特征向量。如果最小特征值大于等于一个很小的值,则使用牛顿法求解无约束优化问题的近似解,否则通过二分法找到满足真实约束半径的最小特征值。最后,通过牛顿法求解无约束优化问题的近似解并返回。
相关问题
def ApproxFun(XStar, CurrX, ObjVal, GradVect, HessMat):#局部近似函数 """ The Approximation function value at local optimizer XStar :param XStar: The local optimizer :param CurrX: Current candidate optimizer :param ObjVal: The original objective function value at CurrX :param GradVect: The gradient vector of original objective function at CurrX :param HessMat: The Hessian matrix of original objective function at CurrX :return: The approximation function value at XStar """ DiffX = np.array(XStar - CurrX) ApproxVal = 0.5 * DiffX.T @ HessMat @ DiffX + GradVect.T @ DiffX + ObjVal return ApproxVal
这个代码实现了一个函数 ApproxFun,它计算了在局部最优点 XStar 处的目标函数的局部近似函数的值。局部近似函数是一个用二次函数近似原目标函数的函数,它的值与原目标函数在 XStar 处的值、梯度向量和海森矩阵有关。具体来说,这个函数使用了 XStar 与当前候选优化器 CurrX 的差向量 DiffX,计算了一个二次函数的值,该二次函数的系数和 CurrX 处的目标函数的值、梯度向量和海森矩阵有关。在这个函数中,@ 符号表示矩阵乘积,T 表示转置操作。函数的输出是局部近似函数在 XStar 处的值。
def ApproxFun(XStar, CurrX, ObjVal, GradVect, HessMat, LambdaPara, SigmaPara, SigmaCov): """ The Approximation function value at local optimizer XStar :param XStar: The local optimizer :param CurrX: Current candidate optimizer :param ObjVal: The original objective function value at CurrX :param GradVect: The gradient vector of original objective function at CurrX :param HessMat: The Hessian matrix of original objective function at CurrX :return: The approximation function value at XStar """ DiffX = np.array(XStar - CurrX) HessMat = np.identity(len(DiffX)) # Local linear approximation ApproxVal = 0.5 * DiffX.T @ HessMat @ DiffX + GradVect.T @ DiffX + ObjVal return ApproxVal
这段代码是一个计算近似函数值的函数,用于信任域算法中的子问题求解。
在信任域算法中,子问题的目标是在当前点附近找到一个更好的点,以更新当前点。具体来说,子问题需要在当前点的信任域内寻找一个新的点,使得在该点附近的目标函数值能够得到明显的改善。
该函数中,参数XStar表示当前的局部最优点,CurrX表示当前的候选优化点,ObjVal表示在CurrX处的原始目标函数值,GradVect表示在CurrX处的目标函数梯度向量,HessMat表示在CurrX处的目标函数海森矩阵。
函数中,首先计算出当前点CurrX和局部最优点XStar之间的差异DiffX。然后,通过将海森矩阵近似为单位矩阵,得到一个局部线性逼近,即HessMat=np.identity(len(DiffX))。这样,近似函数值ApproxVal就可以通过简单的二次函数形式计算得到,其中0.5 * DiffX.T @ HessMat @ DiffX表示二次项,GradVect.T @ DiffX表示线性项,ObjVal表示常数项。
最后,函数返回近似函数值ApproxVal,供信任域算法中的子问题求解使用。
阅读全文