最优化大作业(二): 常用无约束最优化方法

23 篇文章 32 订阅
订阅专栏
  • 问题描述

对以下优化问题

                                                   \small minf\left ( x \right )=x_1^2+x_2^2+x_1x_2-10x_1-4x_2+60

选取初始点\small X_0=\left [ 0,0 \right ]^T,\varepsilon =10^{-2},分别用以下方法求解

(1)最速下降法;

(2)Newton法或修正Newton法;

(3)共轭梯度法。

 

  • 基本原理

(1)最速下降法

 

图1  最速下降法流程图

(2)Newton法

图2  Newton法流程图

 

(3)共轭梯度法

 

图3  共轭梯度法流程图

 

  • 实验结果

(1)最速下降法

迭代

次数

1

2

3

4

5

6

7

8

9

梯度

模值

 

5.4210

1.6680

0.9532

0.2933

0.1676

0.0516

0.0295

0.0091

搜索

方向

 

[9.00,

3.00]

[-1.71,

5.14]

[1.58,

0.53]

[-0.30,

0.90]

[0.28,

0.09]

[-0.05,

0.16]

[0.05,

0.02]

[-0.01,

0.03]

当前

迭代点

(1.00,

1.00)

(7.43,

3.14)

(6.77,

5.12)

(7.90,

5.50)

(7.78,

5.85)

(7.98,

5.91)

(7.96,

5.97)

(8.00,

5.98)

(7.99,

6.00)

当前迭代点值

47.00

14.8571

9.2057

8.2120

8.0373

8.0066

8.0012

8.0002

8.0000

表1  最速下降法迭代过程

图4  最速下降法迭代过程图

 

 

(2)Newton法

迭代次数

1

2

梯度模值

 

0.0000

搜索方向

 

[7.00,5.00]

当前迭代点

(1.00,1.00)

(8.00,6.00)

当前迭代点值

47.00

8.0000

表2  Newton法迭代过程

图5  Newton法迭代过程图

 

(3)共轭梯度法

迭代次数

1

2

3

梯度模值

 

5.4210

0.0000

搜索方向

 

[9.00,3.00]

[1.22,6.12]

当前迭代点

(1.00,1.00)

(7.43,3.14)

(8.00,6.00)

当前迭代点值

47.00

14.8571

8.0000

表3  共轭梯度法迭代过程

 

 

图6  共轭梯度法迭代过程图

 

对比结果可得,三种算法均得到同一个极值点(8, 6)。

 

  • 代码展示
import matplotlib.pyplot as plt
from sympy import *
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
t = symbols('t')

# 优化目标函数
def fun1():
    x1, x2 = symbols('x1 x2')
    y = np.power(x1, 2) + np.power(x2, 2) - x1*x2 -10 * x1 - 4 *x2 +60
    return y

def fun2(x1, x2):
    return np.power(x1, 2) + np.power(x2, 2) - x1 * x2 - 10 * x1 - 4 * x2 + 60

# 计算当前梯度
def cal_gradient_cur(X_cur):
    x1, x2 = symbols('x1 x2')
    f = fun1()
    g = [diff(f, x1), diff(f, x2)]
    g[0] = g[0].evalf(subs={x1:X_cur[0], x2:X_cur[1]})
    g[1] = g[1].evalf(subs={x1:X_cur[0], x2:X_cur[1]})
    return np.array(g)

# 计算lambda, X1: 上一轮迭代点, X2: 本次迭代点
def cal_lambda(X1, X2):
    g1 = np.array(cal_gradient_cur(X1))
    g2 = np.array(cal_gradient_cur(X2))
    g1_norm_2 = np.sum(g1**2, axis=0)
    g2_norm_2 = np.sum(g2**2, axis=0)
    lamda = g2_norm_2 / g1_norm_2
    return lamda

# 更新迭代点X
def update_X(X, P):
    return np.array(X + t*P)

# 更新迭代点X
def update_X_cur(X, t, P):
    return np.array(X + t*P)

# 计算最优步长
def cal_best_t(X_cur):
    x1, x2 = symbols('x1 x2')
    f = fun1()
    f_t = f.subs({x1: X_cur[0], x2: X_cur[1]})
    return solve(diff(f_t, t), t)

# 计算梯度模值
def cal_g_norm_cur(X):
    g_cur = np.array(cal_gradient_cur(X), dtype=np.float32)
    return np.sqrt(np.sum(g_cur**2, axis=0))

def draw(X0):
    plt.figure()
    ax = plt.axes(projection='3d')
    xx = np.arange(-20, 20, 0.1)
    yy = np.arange(-20, 20, 0.1)
    x1, x2 = np.meshgrid(xx, yy)
    Z = fun2(x1, x2)
    ax.plot_surface(x1, x2, Z, cmap='rainbow', alpha=0.5)

    X = np.array([X0[0]])
    Y = np.array([X0[1]])
    X, Y = np.meshgrid(X, Y)
    Z = fun2(X, Y)
    print("初始点:(%0.2f,%0.2f,%0.2f)" % (X, Y, Z))
    ax.scatter(X, Y, Z, c='k', s=20)
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    # ax.legend()
    # ax.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow)   #等高线图,要设置offset,为Z的最小值
    return ax


class C_gradient(object):
    def __init__(self, X0):
        self.X0 = X0

    # 更新搜索方向
    def cal_P(self, g_cur, P1, lamda):
        P = -1 * g_cur + lamda*P1
        return np.array(P)

    def search(self):
        X1 = self.X0
        g_norm_cur = cal_g_norm_cur(X1)  # 计算梯度模值
        count = 0
        result = []
        if(g_norm_cur <= 0.01):
            print("极值点为({:.2f},{:.2f})".format(X1[0], X1[1]))
            x1, x2 = symbols('x1 x2')
            f = fun1()
            min_value = f.evalf(subs={x1: X1[0], x2: X1[1]})
            print("极小值为{:.4f}".format(min_value))
        else:
            P = -1 * cal_gradient_cur(X1)  # 计算当前负梯度方向
            while True:
                X2 = update_X(X1, P)
                t_cur = cal_best_t(X2)
                X2 = update_X_cur(X1, t_cur, P)
                g_cur = cal_gradient_cur(X2)
                g_norm_cur = cal_g_norm_cur(X2)
                x1, x2 = symbols('x1 x2')
                f = fun1()
                min_value = f.evalf(subs={x1: X2[0], x2: X2[1]})
                result.append([float(X2[0]), float(X2[1]), float(min_value)])
                print("当前梯度模值为{:.4f},搜索方向为[{:.2f},{:.2f}]".format(g_norm_cur, P[0], P[1]), end=" ")
                print("极值点为({:.2f},{:.2f}), 极小值为{:.4f}".format(result[count][0], result[count][1], result[count][2]))

                if(g_norm_cur <= 0.01):
                    return np.array(result)
                else:
                    lamda = cal_lambda(X1, X2)
                    P = self.cal_P(g_cur, P, lamda)
                    X1 = X2
                    count += 1



def C_gradient_main():
    print("当前搜索方法为共轭梯度法")
    X0 = np.array([1, 1])
    ax = draw(X0)
    cg = C_gradient(X0)
    cg.ax = ax
    result = cg.search()
    ax.scatter(np.array([result[:, 0]]), np.array([result[:, 1]]), np.array([result[:, 2]]), c='k', s=20)
    plt.show()


class steepest_gradient(object):
    def __init__(self, X0):
        self.X0 = X0

    def search(self):
        X1 = self.X0
        result = []
        count = 0
        while True:
            P = -1 * cal_gradient_cur(X1)  # 计算当前负梯度方向
            X2 = update_X(X1, P)
            t_cur = cal_best_t(X2)
            X2 = update_X_cur(X1, t_cur, P)
            g_norm_cur = cal_g_norm_cur(X2)
            x1, x2 = symbols('x1 x2')
            f = fun1()
            min_value = f.evalf(subs={x1: X2[0], x2: X2[1]})
            result.append([float(X2[0]), float(X2[1]), float(min_value)])
            print("当前梯度模值为{:.4f},搜索方向为[{:.2f},{:.2f}]".format(g_norm_cur, P[0], P[1]), end=" ")
            print("极值点为({:.2f},{:.2f}), 极小值为{:.4f}".format(result[count][0], result[count][1], result[count][2]))


            if(g_norm_cur <= 0.01):
                return np.array(result)
            else:
                X1 = X2
                count += 1


def steepest_gradient_main():
    print("当前搜索方法为最速下降法")
    X0 = np.array([1, 1])
    ax = draw(X0)
    a = steepest_gradient(X0)
    a.ax = ax
    result = a.search()
    ax.scatter(np.array([result[:, 0]]), np.array([result[:, 1]]), np.array([result[:, 2]]), c='k', s=20)
    plt.show()



class Newton(object):
    def __init__(self, X0):
        self.X0 = X0

    def cal_hesse(self):
        return np.array([[2, -1], [-1, 2]])

    def search(self):
        X1 = self.X0
        count = 0
        result = []
        while True:
            g = cal_gradient_cur(X1)
            g = g.reshape((1, 2)).T
            h = np.linalg.inv(self.cal_hesse())
            P = -1 * np.dot(h, g).ravel()
            X2 = update_X(X1, P)
            t_cur = cal_best_t(X2)
            X2 = update_X_cur(X1, t_cur, P)
            x1, x2 = symbols('x1 x2')
            f = fun1()
            min_value = f.evalf(subs={x1: X2[0], x2: X2[1]})
            g_norm_cur = cal_g_norm_cur(X2)
            result.append([float(X2[0]), float(X2[1]), float(min_value)])
            print("当前梯度模值为{:.4f},搜索方向为[{:.2f},{:.2f}]".format(g_norm_cur, P[0], P[1]), end=" ")
            print("极值点为({:.2f},{:.2f}), 极小值为{:.4f}".format(result[count][0], result[count][1], result[count][2]))
            if(g_norm_cur <= 0.01):
                return np.array(result)
            else:
                X1 = X2
                count += 1


def newton_main():
    print("当前搜索方法为newton法")
    X0 = np.array([1, 1])
    ax = draw(X0)
    b = Newton(X0)
    result = b.search()
    ax.scatter(np.array([result[:, 0]]), np.array([result[:, 1]]), np.array([result[:, 2]]), c='k', s=20)
    plt.show()


if __name__ == '__main__':
    steepest_gradient_main()
    newton_main()
    C_gradient_main()

 

凸优化第九章无约束优化 作业题
清风吹斜阳
10-18 469
无约束优化 The solution to the following problem withandm>n, whereAhas full (column) rankn, is Which stopping criteria are reasonable when solving an optimization problem minimize f(x) u...
最优化 中国科学院大学 算法中的最优化资源
09-22
本课程的任务是讨论求解线性规划、无约束非线性规划、约束非线性规划、多目标规划、整数规划的基本原理与一般方法,并学习MATLAB等工具软件的应用,使学生掌握最优化方法的基本概念、基本原理和基本方法,初步学会...
优化算法使用总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚
旺仔馒头
12-21 9397
最优化问题可以分为两大类:无约束最优化问题、约束最优化问题。 本文对一些算法进行总结,如黄金分割法、最速下降法(梯度下降法)、牛顿法、阻尼牛顿法、拟牛顿法、共轭方向法…… 包含matlab代码资源
matlab中无约束优化程序例题,无约束最优化-MATLAB详解.ppt
weixin_34551660的博客
03-16 1180
* 无约束最优化 数学建模与数学实验 实验目的 实验内容 2、掌握用数学软件包求解无约束最优化问题。 1、了解无约束最优化基本算法。 1、无约束优化基本思想及基本算法。 4、实验作业。 3、用MATLAB求解无约束优化问题。 2、MATLAB优化工具箱简介 无约束最优化问题 求解无约束最优化问题的的基本思想 *无约束最优化问题的基本算法 返回 标准形式: 求解无约束最优化问题的基本思想 求解的基...
最优化方法大作业
最新发布
m0_62500122的博客
04-25 983
为此,如何从已有的地球观测数据中高效提取建筑复合信息,成为精细化城市感知与建模研究的关键前提(吴志强等,2022)。由于一张图像中往往会存在与建筑本身无关的物体(如人、树、汽车等),因此为了提高分类的准确性,本文首先通过选择性预处理获得图像中的建筑候选区域,本文采用选择搜索算法和CASC(Candidate Area Size Comparison),具体步骤如下:在选择搜索算法中,我们基于图形的分割方法获得像素级的分割区域,利用该算法的多重相似性策略进行区域合并,以此捕获所有物体的候选区域。
最优化问题——无约束优化方法(一)
热门推荐
hei653779919的博客
06-02 1万+
最优化问题——无约束优化方法 在只前的文章中,我们关注的是非线性规划问题,以及对应步长因子的搜索方法。在非线性规划问题中,其基本形式包括目标函数和约束条件两个部分,并且约束条件确定了可行域等等重要的部分。但是今天,我们开始关注与不存在约束的优化问题。 1 无约束优化问题的引入 1.1 无约束优化意义 实际的优化问题一般都有很多的约束,那么为什么还需要研究无约束最优化方法呢?首先,我们从一个例子开始,相信大家在看到我的这篇文章之前,对于机器学习中的SVM算法已经有了一定的了解,对于SVM的求解,同样也是包含
无约束问题的最优化方法
我们的时光!
05-26 6076
无约束最优化问题的求解方法
实用最优化方法matlab编程作业
11-04
在MATLAB编程作业中,我们将学习一些常用的实用最优化方法,包括最速下降法、 Fletcher-Reeves法和 Davidon-Fletcher-Powell法等。 题一: 在题一中,我们使用了 Fletcher-Reeves法来寻找目标函数的最优解。目标...
最优化方法》复习题 含答案(附录 5 《最优化方法》复习题)
10-28
最优化方法是运筹学、工程学以及数学分析等领域中用于寻找最优解的数学方法和理论。在复习题中,通过具体的数学题目和证明,我们可以深化对最优化方法的理解和应用。 1. 对称矩阵在任意点的梯度和Hesse矩阵的求解 ...
外罚函数+共轭梯度法求条件约束极值源码(最优化作业)
11-02
共轭梯度法是一种求解无约束优化问题的迭代方法,尤其适用于处理大型稀疏线性系统。它基于梯度下降法,但通过选择特定方向使后续迭代步长沿共轭方向进行,这可以减少计算量并提高收敛速度。共轭梯度法的基本步骤包括...
实用最优化方法编程大作业
11-28
这是实用最优化方法课程的大作业程序,压缩文件里有6个文档并且是对应于大连理工大学编写的实用最优化方法这本书。
优化方法大作业
03-27
matlab编写的优化方法大作业,压缩包内含有源代码以及题目要求。都亲测可以运行的。
最优估计大作业:非线性最小
03-17
分析线性最小乘与非线性最小乘在三轴加速计参数估计上的效果。 包含报告和matlab程序。
最优估计大作业:基于kalman滤波的组合导航
03-17
给定磁罗盘、GPS、里程计等信息,进行组合导航数据融合。采用kalman滤波方法。 包含报告和程序。
最优化理论基础》大作业(一) 实验报告及代码
03-14
上海交大,《最优化理论基础》大作业(一)实验报告及代码 问题2:运用两种不同的方法求解非线性最小乘问题 附matlab实验m程序,提供借鉴。
最优化理论与最优化控制作业.docx
04-28
最优化理论与最优化控制作业 最优化理论是指在满足一定约束条件下,找出最小或最大值的数学方法。无约束优化问题是指在不满足任何约束条件的情况下,寻找目标函数的最小或最大值。 本文档中,我们讨论了四种常用的...
最优化案例整理
weixin_34194087的博客
09-18 4463
1.线性回归   最小乘问题 $e=y-f(x)$ 2.线性方程组求解   最小乘问题 3.直线(Line),曲线和平面(Plane)拟合   最小乘问题 4.ICP点云匹配   最小乘问题,可以用L-M方法求解。   (1)目前g2o中(有示例代码)实现了利用图优化进行ICP匹配的算法。   (2)PCL中实现了L-M算法的ICP,作为非线性最小乘问题来解决,依赖...
最优化方法matlab大作业,最优化方法大作业.doc
weixin_36286567的博客
03-18 1224
资料MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h \* MERGEFORMAT SEQ MTSec \r 1 \h \* MERGEFORMAT SEQ MTChap \r 1 \h \* MERGEFORMAT 单位代码 03学 号《最优化方法》课程...
大连理工大学 2021年最优化方法大作业(1)
JiangTesla的博客
11-13 6538
我们这届的题目如下,下面是一些自己的小想法供大家参考。 文章目录 前言 一、pandas是什么? 、使用步骤 1.引入库 2.读入数据 总结 前言 记录一下大作业 提示:以下是本篇文章正文内容,下面案例可供参考 一、不精确一维线搜索-采用Wolfe-Powell准则 、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot..
33
原创
153
点赞
943
收藏
175
粉丝
关注
私信
写文章

热门文章

  • 遗传算法求解 函数优化问题 11750
  • 经典轻量化模型 9581
  • 华为数字化IT应用工程师面试经历 9287
  • 三种搜索求解八数码 问题的效率对比 7974
  • 数据挖掘大作业(一):Kmeans+PAM 6869

分类专栏

  • 总结归纳 10篇
  • 大作业 23篇
  • 论文翻译 2篇

最新评论

  • 遗传算法求解 函数优化问题

    希望不秃头啊: 就是上面要优化的五个函数

  • 遗传算法求解 函数优化问题

    yyyyyyyyyyFF: 这myfunction包里面有什么

  • 求助: 3070运行tensorflow-1.11版本BERT报错InternalError (see above for traceback): Blas GEMM launch failed未解决

    CSDN-Ada助手: 非常感谢您的分享,遇到技术问题是很正常的,我们可以一起来解决。我建议您写一篇博客,分享如何解决Blas GEMM launch failed报错的方法,以及如何在3070上运行tensorflow-1.11版本BERT。这样的技术文章对其他用户也是非常有帮助的。下一篇您可以继续就这个主题继续写,相信会有更多读者关注和支持。加油! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。

  • 数据挖掘大作业(一):Kmeans+PAM

    合法的程序: 大佬,求一份数据!表情包

  • 【论文翻译】Convolutional Oriented Boundaries

    woovo: 你好,请问你把这个代码实现了吗

最新文章

  • 求助: 3070运行tensorflow-1.11版本BERT报错InternalError (see above for traceback): Blas GEMM launch failed未解决
  • labelImg安装与操作
  • SQL排序的专用窗口函数
2021年14篇
2020年21篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王亦庄企业网站优化汉川市网站关键词排名优化如何企业网站如何排名优化平湖怎么样进行网站优化中山网站免费优化网站优化查询优质网站排名优化丹阳网站推广优化人才网站怎么优化怎样做网站上收所引擎优化武汉网站排名优化价格惠州网站优化咨询价格网站优化视频教学兰州市资深的网站优化网站优化的方法和必要性重庆荣昌技术好的网站优化中山正规网站优化方案清远金属制品网站seo优化宜春网站怎么优化陕西网站关键词排名优化费用巩义网站seo优化地址金山区企业网站优化定制方案广东网站优化哪家快遂宁网站优化好桂林网站优化电池充电浙江网站优化推荐厂家外贸网站优化定制系统宜春百度网站优化网站优化需要具备什么网站排名优化艾金手指花总香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化