尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

头歌实践教学平台:最优化方法2024-1

头歌实践教学平台:最优化方法2024-1 第1关共轭梯度法任务描述本关任务编写一个共轭梯度法优化目标函数程序。相关知识为了完成本关任务你需要掌握1.共轭梯度法基本理论 2.共轭梯度法代码实现。共轭梯度法基本理论共轭梯度法是一种共轭方向法,在求每一个迭代点的搜索方向时,与改点的梯度有关,故叫做共轭梯度法。共轭梯度法: 在初始点x0的搜索方向p0为初始点x0的负梯度方向 −∇f(x0);之后迭代点xk的搜索方向pk为该点的负梯度方向−∇f(xk)与已经得到的搜索方向pk−1的线性组合(即 pk−gkαk−1pk−1)。首先对正定二次函数做说明。用于正定二次函数的共轭梯度法对于目标函数为 f(x) 21 x TQxb Txc 的正定二次函数来说。我们规定gk∇f(xk)第一个迭代点我们可以任意指定一个初始点x0, 那么初始点处的搜索方向p0−g0从x0出发沿着p0方向做直线搜索 x1x0t0p0可以求得由此我们便得到了第一个迭代点。第二个迭代点由直线遚索的特性我们可以知道由此我们便得到了第二个迭代点 x 2​第三个迭代点同理, 我们可以得到 p1​g2​0,可以得到点x2​处的搜索方向为p2​−g2​α1​p1​。同理p2​和p1​是Q共轮方向, 故能够得到​至此我们便得到了点x 2处的搜索方向 p 2至此我们便得到了第三个迭代点x3∘​但是上面在求第三个迭代点时有一个小小的问题便是, 以上求得p3​的方法能保证 p2​和 p0​共轭吗? 即p0​,p1​,p2​是 Q共轭向量(根据共轭向量定义我们知道共轭向量之间需要两两共轮)吗?关于为什么 Qp0​t0​(g1​−g0​)​, 可以参考公式(10)的推导过程, 有 ∇f(xk1​)∇f(xk​)tk​Qpk​, 由此得到。第 k1迭代点 与前面相似, 我们可以得到 pk​−gk​αk−1​pk−1​可以得到αk−1​pk−1t​Qpk−1​gk​Qpk−1​​我们便能得到xk​处的搜索方向pk​,在xk​处沿pk​方向做直线搜索同理我们能够证出p0​,p1​,⋯,pk​是Q共轭向量。所以可以按照上述方法,依次构造出共轭向量, 最多经过n次迭代就能找到最优点x∗。共轭梯度法的算法描述如下共轭梯度法代码实现from sympy import *x, y symbols(x, y)# 对一般函数求梯度def get_grad(f, X):# 一阶导数fx diff(f, x)fy diff(f, y)grad Matrix([[fx], [fy]])return Matrix([[fx.subs([(x, X[0]), (y, X[1])])],[fy.subs([(x, X[0]), (y, X[1])])]])# PR公式def func_PR(k, k1):if k.dot(k1) ! 0:return k.dot(k) / k1.dot(k1)else:return 0def conjugate_gradient(f, X0):count 0 # 计数器print(起始点为, X0)eps 1e-10 # 允许误差while True:g get_grad(f, X0)p - g# print(g.norm())if g.norm() eps:return X0,countif count 0:alpha 0else:alpha func_PR(g, g)p p alpha * p # 更新搜索方向beta 0.01X0 X0 beta * p # 更新初值count 1f (x 2 * y - 7) ** 2 (2 * x y - 5) ** 2 # 最优解f(1,3)0X0 Matrix([[-1], [1]])X0,countconjugate_gradient(f, X0)print(x0的值为 {}.format(X0))print(迭代次数为, count)编程要求根据提示在右侧编辑器补充代码实现共轭梯度法对一般函数进行优化。测试说明平台会对你编写的代码进行测试开始你的任务吧祝你成功答案见《头歌实践教学平台最优化方法2024-1(答案》有任何问题都可以随时关注私信
返回列表