牛顿迭代法求解多元函数的最小值--以二元函数为例

2023-10-27

【python】牛顿迭代法求解多元函数的最小值–以二元函数为例

本文转载链接:[https://blog.csdn.net/qq_45726331/article/details/115804812]

一元函数到多元函数的牛顿迭代法
python代码实现过程
一元函数到多元函数的牛顿迭代法
参考 多元函数的牛顿迭代和高斯牛顿法怎么推导?

在这里插入图片描述
python代码实现过程
计算梯度函数
使用了sympy库的diff函数计算导数,再代入具体数值进行计算,返回X处的梯度grad

求解梯度值

def get_grad(f, X):
    # 计算一阶导数
    f1 = diff(f, x1)
    f2 = diff(f, x2)
    # 代入具体数值计算
    grad = np.array([[f1.subs([(x1, X[0]), (x2, X[1])])],
                   [f2.subs([(x1, X[0]), (x2, X[1])])]])
    return grad

计算Hession矩阵函数
同样使用diff函数计算二次偏导,组成Hession矩阵(里面的括号、中括号要盯对清楚)

求解Hession矩阵

def get_hess(f, X):
    # 计算二次偏导
    f1 = diff(f, x1)
    f2 = diff(f, x2)
    f11 = diff(f,x1,2)
    f22 = diff(f,x2,2)
    f12 = diff(f1,x2)
    f21 = diff(f2,x1)
    # 计算具体数值计算
    hess = np.array([[f11.subs([(x1,X[0]), (x2,X[1])]),
                        f12.subs([(x1,X[0]), (x2,X[1])])],

                        [f21.subs([(x1,X[0]), (x2,X[1])]),
                        f22.subs([(x1,X[0]), (x2,X[1])])]])
    # 转换数值类型为了后续求逆矩阵
    hess = np.array(hess, dtype = 'float')
    return hess

牛顿迭代过程
迭代公式里使用的是Hession矩阵的逆,所以还要求个逆

牛顿迭代

def newton_iter(X0, err):
    # 记录迭代次数
    count = 0
    X1 = np.array([[0],[0]])
    while True:
        # 得到两次迭代结果差值
        X2 = X0 - X1
        if sqrt(X2[0]**2 + X2[1]**2) <= err:
            break
        else:
            hess = get_hess(f, X0)
            # 得到Hession矩阵的逆
            hess_inv = np.linalg.inv(hess)
            grad = get_grad(f, X0)
            X1 = X0 #保存上次迭代结果
            # 迭代公式
            X0 = X1 - np.dot(hess_inv, grad)
            count += 1
            print('第',count,'次迭代:','x1=',X0[0],'x2=',X0[1])
    print('迭代次数为:',count)
    print('迭代结果为',X0)

全部代码如下

from sympy import *
import numpy as np

定义符号

x1,x2 = symbols('x1, x2')

定义所求函数

f = 60 - 10*x1 - 4*x2 + x1**2 + x2**2 - x1*x2

求解梯度值

def get_grad(f, X):
    # 计算一阶导数
    f1 = diff(f, x1)
    f2 = diff(f, x2)
    # 代入具体数值计算
    grad = np.array([[f1.subs([(x1, X[0]), (x2, X[1])])],
                   [f2.subs([(x1, X[0]), (x2, X[1])])]])
    return grad

求解Hession矩阵

def get_hess(f, X):
    # 计算二次偏导
    f1 = diff(f, x1)
    f2 = diff(f, x2)
    f11 = diff(f,x1,2)
    f22 = diff(f,x2,2)
    f12 = diff(f1,x2)
    f21 = diff(f2,x1)
    # 计算具体数值计算
    hess = np.array([[f11.subs([(x1,X[0]), (x2,X[1])]),
                        f12.subs([(x1,X[0]), (x2,X[1])])],

                        [f21.subs([(x1,X[0]), (x2,X[1])]),
                        f22.subs([(x1,X[0]), (x2,X[1])])]])
    # 转换数值类型为了后续求逆矩阵
    hess = np.array(hess, dtype = 'float')
    return hess

牛顿迭代

def newton_iter(X0, err):
    # 记录迭代次数
    count = 0
    X1 = np.array([[0],[0]])
    while True:
        # 得到两次迭代结果差值
        X2 = X0 - X1
        if sqrt(X2[0]**2 + X2[1]**2) <= err:
            break
        else:
            hess = get_hess(f, X0)
            # 得到Hession矩阵的逆
            hess_inv = np.linalg.inv(hess)
            grad = get_grad(f, X0)
            X1 = X0 #保存上次迭代结果
            # 迭代公式
            X0 = X1 - np.dot(hess_inv, grad)
            count += 1
            print('第',count,'次迭代:','x1=',X0[0],'x2=',X0[1])
    print('迭代次数为:',count)
    print('迭代结果为',X0)

设置初始点

X0 = np.array([[1],[1]])
err = 1e-10
newton_iter(X0, err)

原文链接:https://blog.csdn.net/qq_45726331/article/details/115804812

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛顿迭代法求解多元函数的最小值--以二元函数为例 的相关文章

随机推荐

  • webstorm或者idea出现windows找不到文件chrome

    webstorm或者idea出现windows找不到文件chrome 解决方法 今天使用webstorm调试的时候 竟然出现windows找不到文件chrome的错误 步骤 1 右击桌面上的chrome浏览器图标 属性 gt 快捷方式 gt
  • 1500*C. Tenzing and Balls (线性DP)

    解析 每次选择两个相同的数 删去他们以及他们之间的所有数 问最多可以删除多少 DP 对于某个位置 i 其前面有多个 j 使得 a i a j 所以使用 f i 来记录前 i 个数能够删除的最大值 include
  • lambda表达式&Stream

    lambda表达式 1 前言 在Java中 为了将某些功能传递 总要取创建类 内部类 匿名内部类 为了更简便 jdk8之后 Java新增了Lambda表达式 2 概念 lambda又称函数式编程 将函数作为参数进行传递 使得代码更简洁 3
  • 【Java文件流】管理文件和文件夹:File类

    Java中不像C C 那样设有专门的文件打开 关闭 跳转等方式 直接交给File类管理 开放几个方法 直接操作文件和文件夹 这十分利于新手入门 文章目录 方法 构造方法 路径问题 创建文件 文件夹方法 删除文件 文件夹方法 判断方法 获取方
  • 关于两台主机间通信(同网段)不需要通过网关,详细过程

    两台主机间通信 同网段 不需要通过网关 主机A由ping程序在应用层产生数据ICMPRequest type8 直接在网络层封装源地址和目的地址 再到网络接口层封装帧头 帧尾 FCS 帧头需封装SMAC及DMAC和Type 0x0800 表
  • maven的依赖包无法下载解决

    编译geoserver出现 Failed to execute goal on project gs platform Could not resolve dependencies for project org geoserver gs
  • windows上安装tensorflow

    tensorflow0 12版本支持windows 需要python3 5 x 安装python3 5 x 下载 python3 5 2 安装 第一个Install Now是默认安装在c盘的 第二个是自己选择安装路径 我选择第二个 同时将A
  • Unity3D魔方游戏如何完成魔方的旋转

    本游戏是我自学unity后制作的第一个游戏 对于通过何种方法来生成魔方 我就不在多做描述了 因为关于生成的代码网上很多 但是关于如何旋转的却很少 在我在网上查找如何旋转魔方的方法时 找到的都是一些复杂的方法 对于我这样的初学者来说很不友好
  • FindBugs-IDEA插件的使用

    一 前言 FindBugs是一款Java静态代码分析工具 与其他静态分析工具 如Checkstyle和PMD 不同 FindBugs不注重样式或者格式 它专注于寻找真正的缺陷或者潜在的性能问题 它可以帮助java工程师提高代码质量以及排除隐
  • Qt 主要框架

    Qt提供了许多不同的框架和模块 用于开发各种类型的应用程序 以下是一些主要的Qt框架 Qt Core 这是Qt的核心模块 提供了基本的非图形功能 例如字符串处理 文件I O 事件处理 容器类等 它也包含信号和槽机制 是Qt应用程序中常用的基
  • 调试厉器addr2line

    addr2line 将地址转换为文件名和行号的命令行工具 在C C 程序的调试过程中 我们通常会使用调试器 如GDB 来定位崩溃或错误的位置 但有时候 我们可能只能获得程序崩溃时的地址 而没有调试器的支持 这时候 addr2line就可以帮
  • el-table实现分页切换后还能继续保持之前的勾选状态

  • MATLAB的输入与输出

    1 MATLAB的输入语句input函数用于接收用户的输入 a 输入数据 1 2 3 4 gt gt x input please input a number please input a number 22 x 22 b 输入字符串 1
  • 程序员沟通障碍之普遍缺乏同理心

    原创文章 转载请注明 现如今半瓶水程序员比历史上以往任何时候都多 而半瓶水一般都比较自大 这样就容易出现在具体的项目讨论当中 各自都觉得自己绝对正确并争得面红耳赤 亦或在与非技术同事讨论问题时候显得冷冰冰 更或者在与异性相处时候让人觉得不解
  • ArcGIS Pro矢量(shp)裁栅格(tif)

    需求描述 手上有一个矢量面数据 shp格式 有一个栅格数据 tif格式 矢量面就是研究区 栅格就是一个数据集 研究区的面积小于数据集的面积 所以需要用研究区的矢量去裁剪数据集 方法和工具 矢量裁剪栅格的工具有很多 在ArcGIS Pro中
  • 【python】一篇玩转正则表达式

    目录 前言 正则表达式 行定位符 1 2 元字符 常见的元字符 限定符 常用的限定符 字符类 排除字符 选择字符 转义字符 python使用正则表达式 匹配字符串 match search findall sub 替换敏感字符 split
  • (详解及使用)import()函数和import语句

    目录 背景 一 import 1 1 使用场景 二 import from 2 1 详细使用 背景 我们在日常开发中是不是会遇到这个东西import 但是import会有两种形式 下面将详细解释 一 import import函数可以异步动
  • 动态规划 Leetcode 72 Edit Distance(编辑距离)

    题目 给你两个单词 word1 和 word2 请你计算出将 word1 转换成 word2 所使用的最少操作数 你可以对一个单词进行如下三种操作 1 插入一个字符 2 删除一个字符 3 替换一个字符 示例 1 输入 word1 horse
  • PostMan的使用注意事项

    在使用postman的时候 记得把参数的值都给全了 不要少参数 否则会报错 提交的参数写在Params的key value对里就行 还要记得路径要写对
  • 牛顿迭代法求解多元函数的最小值--以二元函数为例

    python 牛顿迭代法求解多元函数的最小值 以二元函数为例 本文转载链接 https blog csdn net qq 45726331 article details 115804812 一元函数到多元函数的牛顿迭代法 python代码