if CriticVal >= 0: CurrX = XStar ObjVal = ObjFun(CurrX) GradVect = GradFun(CurrX) HessMat = HessFun(CurrX)
时间: 2024-01-11 09:04:52 浏览: 85
这段代码是在信任域算法中,当评估值CriticVal大于等于0时,更新当前点的值,重新计算目标值、梯度向量和海森矩阵。
首先将当前点的值CurrX更新为XStar,即将牛顿法求解子问题得到的新点作为当前点。然后,利用ObjFun函数计算当前点的目标值ObjVal,利用GradFun函数计算当前点的梯度向量GradVect,利用HessFun函数计算当前点的海森矩阵HessMat。这些计算结果将用于下一次迭代的计算。
通过在每次迭代中不断更新当前点的值和信任域半径,信任域算法最终可以找到一个最优的点,从而解决无约束优化问题。
相关问题
def TruRegAlg(InitX): # 信頼域 """ Determine an appropriate Trust Region Radius at CurrX :param CurrX: Current candidate optimizer :return: Trust Region Radius at CurrX """ InitX = np.array(InitX) n = len(InitX) InitRadius = 1.0 ExpandFactor = 2.0 CompressFactor = 0.25 EpsTol = 1e-6 CurrX = InitX TruRegRad = InitRadius ObjVal = ObjFun(CurrX) GradVect = GradFun(CurrX) HessMat = HessFun(CurrX) while np.linalg.norm(GradVect) > EpsTol: XStar = SubOptFun(CurrX, TruRegRad, GradVect, HessMat) ApproxVal = ApproxFun(XStar, CurrX, ObjVal, GradVect, HessMat) ObjStarVal = ObjFun(XStar) CriticVal = (ObjVal - ObjStarVal) / (ObjVal - ApproxVal) DiffX = XStar - CurrX NormDiffX = np.linalg.norm(DiffX) if CriticVal >= 0.75: if abs(NormDiffX - TruRegRad) <= 1e-6: TruRegRad = ExpandFactor * TruRegRad elif CriticVal <= 0.25: TruRegRad = CompressFactor * TruRegRad if TruRegRad <= 1e-6: break if CriticVal >= 0: CurrX = XStar ObjVal = ObjFun(CurrX) GradVect = GradFun(CurrX) HessMat = HessFun(CurrX) OptiX = CurrX return OptiX
这段代码是一个信任域算法,用于在给定初始点的情况下,求解一个无约束优化问题。具体来说,该算法通过不断的调整信任域半径,以及利用牛顿法求解子问题,来逐步逼近最优解。
在算法的开始阶段,初始化一些参数,包括信任域的初始半径、扩展和压缩因子、以及收敛阈值等。随后,通过调用目标函数、梯度函数和海森矩阵函数来计算当前点的目标值、梯度向量和海森矩阵。
在迭代的过程中,首先利用牛顿法求解一个子问题,得到一个新的点XStar。然后,计算出一个近似值ApproxVal,用于评估XStar是否是一个合适的解。如果XStar是一个合适的解,则更新当前点的值,并重新计算目标值、梯度向量和海森矩阵。
在更新当前点的值的同时,也需要根据CriticVal的值来调整信任域的半径。如果CriticVal大于等于0.75,则可以扩大信任域的半径;如果CriticVal小于等于0.25,则需要缩小信任域的半径。如果信任域的半径小于等于1e-6,则停止迭代。
最终,返回找到的最优点OptiX。该算法的收敛性和正确性都可以得到证明,因此在实际应用中具有很高的可靠性和准确性。
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
这段代码是一个实现子优函数的函数,用于求解无约束优化问题的近似解。其中,参数CurrX是当前的优化变量,TruRegRad是真实约束半径,GradVect是梯度向量,HessMat是黑塞矩阵。该函数首先计算黑塞矩阵的特征值和特征向量,并通过排序找到最小特征值对应的特征向量。如果最小特征值大于等于一个很小的值,则使用牛顿法求解无约束优化问题的近似解,否则通过二分法找到满足真实约束半径的最小特征值。最后,通过牛顿法求解无约束优化问题的近似解并返回。
阅读全文