Python和Java代码实现:切线法求解一维最优化问题

news2024/11/15 4:19:16

Python和Java代码实现:切线法求解一维最优化问题

  • 代码实现
    • Python代码
    • Java代码
  • 求解实例

在这里插入图片描述
图片

在这里插入图片描述

根据概念查询,切线法定义如下:
切线法(Tangent Method)是一种用于求解非线性方程的数值方法。它也被称为牛顿法(Newton’s Method),因为它是由艾萨克·牛顿发明的。

牛顿切线法是一种求解方程近似解的数值方法。它利用函数在某一点的切线来逼近函数的零点,从而得到方程的近似解。该方法的原理是:对于一个连续可导的函数,通过对函数图像上某一点处的切线进行截距求解,得到该点处的横坐标,然后将该横坐标代入函数中,得到新的函数值,重复以上步骤,直到函数值足够接近零点为止。

切线法的基本思想是通过在给定点的切线来逼近函数的根。具体来说,如果你有一个非线性方程 f ( x ) = 0 f(x) = 0 f(x)=0,并且你想找到该方程的根,你可以从一个初始猜测 x 0 x_0 x0 开始,然后通过以下步骤来迭代地逼近解:

  1. 在点 ( x 0 , f ( x 0 ) ) (x_0, f(x_0)) (x0,f(x0)) 处画出函数的切线。

  2. 找到这条切线与 x x x 轴的交点,记作 x 1 x_1 x1

  3. x 1 x_1 x1 作为新的猜测,回到步骤1,重复这个过程。

这个过程的数学表达式是:

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)

其中, x n x_n xn 是第 n n n 次迭代的解, f ′ ( x n ) f'(x_n) f(xn) 是函数在 x n x_n xn 处的导数。

需要注意的是,这个方法并不总是能够找到解,特别是当初始猜测离解很远,或者函数在解附近的性质使得迭代过程不收敛的时候。在实际应用中,通常会设置一个最大迭代次数和一个足够小的阈值,当连续两次迭代的解之间的差小于这个阈值时,就认为找到了足够精确的解。

我理解的,作者这里应该是首先将求最小值的问题转换成了求一阶导函数等于0的问题,因此是对一阶导函数应用切线法,因此才有一阶导和二阶导的计算

代码实现

Python代码

在这里插入图片描述

# 待优化函数  
def f(t):  
    return t ** 2 - t * 5 + 8  
  
  
# 待优化函数一阶导数  
def d_f(t):  
    return 2 * t - 5  
  
  
# 待优化函数二阶导数  
def d_2_f(t):  
    return 2  
  
  
# 切线法  
def tangent_method(x, eps):  
  
    cnt = 0  
    while abs(-d_f(x) / d_2_f(x)) > eps:  
        # 更新x,并增加迭代次数  
        x += -d_f(x) / d_2_f(x)  
        cnt += 1  
  
    return x, f(x), cnt  
  
  
if __name__ == '__main__':  
    # 参数设置  
    left_point = 1  
    right_point = 7  
    min_interval_value = 0.1  
  
    # 选取初始点  
    x0 = 6  
    # 调用切线法求解最小值  
    best_x, best_y, iter_cnt = tangent_method(x0, min_interval_value)  
    # 输出最优解  
    print('best_x: {}, best_y: {}, iter_cnt: {}.'.format(best_x, best_y, iter_cnt))  
  

Java代码

以下的tangentMethod函数为切线法的Java代码。

public class TangentMethod {  
  
    public static void main(String[] args) {  
        // 参数设置  
        int leftPoint = 1;  
        int rightPoint = 7;  
        double minIntervalValue = 0.1;  
  
        double x0 = 6.0;  
        Solution best_solution = tangentMethod(x0, minIntervalValue);  
        System.out.println("best_x: " + best_solution.best_x);  
        System.out.println("best_y: " + best_solution.best_y);  
        System.out.println("cnt: " + best_solution.cnt);  
    }  
  
    // 切线法  
    private static Solution tangentMethod(double x, double eps) {  
        // 统计迭代次数  
        int cnt = 0;  
  
        while (Math.abs(df(x) / d2f(x)) > eps) {  
            // 更新x,并增加迭代次数  
            x -= df(x) / d2f(x);  
            cnt ++;  
        }  
  
        // 构造最优解对象  
        Solution best_solution = new Solution();  
        best_solution.best_x = x;  
        best_solution.best_y = f(x);  
        best_solution.cnt = cnt;  
  
        return best_solution;  
    }  
  
    // 待优化函数  
    private static double f(double t) {  
        return t * t - t * 5 + 8;  
    }  
  
    // 待优化函数一阶导数  
    private static double df(double t) {  
        return t * 2 - 5;  
    }  
  
    // 待优化函数二阶导数  
    private static double d2f(double t) {  
        return 2;  
    }  
  
    // 解对象  
    private static class Solution {  
        double best_x;  
        double best_y;  
        int cnt;  
    }  
}  
  

求解实例

无论运行Python程序还是Java程序,可以得到最优解如下:

best_x: 2.5, best_y: 1.75, iter_cnt: 1.  

从结果上可以看出,切线法只需要迭代一次即可得到最优解;而使用黄金分割法需要迭代的次数为9。这主要是因为切线法使用了待优化函数更多的信息,包括一阶和二阶导数,所以计算效率更高,这在文章中也有提到过该理论。

此外,相比黄金分割法,切线法并不依赖左右端点的值,但是会对初值更加敏感(虽然文中的实例对初值不敏感),这也是值得注意的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 程序文档生成器(doxygen)使用说明

程序文档,是每个程序员必看文档,在日常业务开发中,难免会封装一些组件。没有很好的组件文档,再好的组件都是废物,。因此大型业务中,文档和思维导图,两个都是必备! 一、注释风格 …

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

各种设备上恢复已删除的文件和文件夹的数据恢复软件清单

最好的数据恢复软件可以简单轻松地恢复计算机、移动设备或存储介质上已删除的文件和文件夹。 询问任何经历过数据丢失的人这是否是一种有趣的经历,他们会告诉您数据丢失,无论是由于硬件或软件故障、意外删除还是网络犯罪,都会带来极大的压力…

美国 SEC 批准比特币现货 ETF 上市,SEC 告诉我们的风险包含哪些?

撰文:Will 阿望 查看原文:美国 SEC 批准比特币现货 ETF 上市,SEC 告诉我们的风险包含哪些? 历经十年的 BTC ETF 艰辛审批之路终于迎来了胜利的曙光,2024 年 1 月 11 日凌晨 4 时,美国证监会(S…

AIGC实战——像素卷积神经网络(PixelCNN)

AIGC实战——像素卷积神经网络 0. 前言1. PixelCNN 工作原理1.1 掩码卷积层 1.2 残差块2. 训练 PixelCNN3. PixelCNN 分析4. 使用混合分布改进 PixelCNN小结系列链接 0. 前言 像素卷积神经网络 (Pixel Convolutional Neural Network, PixelCNN) 是于 2016 年提出的一种图像生成…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒,以中国红为主题,为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计,无不体现出中国红的热情与活力,象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

ubuntu qt 运行命令行

文章目录 1.C实现2.python实现 1.C实现 下面是封装好的C头文件&#xff0c;直接调用run_cmd_fun()即可。 #ifndef GET_CMD_H #define GET_CMD_H#endif // GET_CMD_H #include <iostream> #include<QString> using namespace std;//system("gnome-terminal -…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

ImageNet Classification with Deep Convolutional 论文笔记

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…

第二证券:大盘探底回升走出底部还看成交量配合

持续震动数日后&#xff0c;大盘再现探底上升走势。 上证指数周二小幅低开后窄幅震动&#xff0c;午后快速回落改写本轮回调新低后&#xff0c;有资金开始出手介入&#xff0c;尾盘指数翻红。深证成指同样是在午后呈现探底上升走势&#xff0c;最终重回5日均线上方。截至收盘&…

mysql 下载和安装和修改MYSQL8.0 数据库存储文件的路径

一、第一步:下载步骤 下载链接&#xff1a;MySQL :: Download MySQL Installer 选择版本8.0.35&#xff0c;社区版&#xff0c; 点击 Download 下载 安装包 二、第二步:安装步骤 添加环境变量&#xff0c;C:\Program Files\MySQL\MySQL Server 8.0\bin 可以点开MySQL 8.0 Co…

如何用AI提高论文阅读效率?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

HNU-模式识别-作业2-面向应用分类系统

模式识别-作业2 计科210X 甘晴void 202108010XXX 【具体实现思路是按照去年数学建模国赛题来做的&#xff0c;就放个思路&#xff0c;完整不放全了】 题目&#xff1a; 查阅文献资料&#xff0c;构建一个面向应用的分类系统。 要求&#xff1a; 至少3页A4纸&#xff0c;文…

机器人制作开源方案 | AI校园服务机器人

作者&#xff1a;李强、李振宁、毛维雷、李文文、张奥 单位&#xff1a;山西能源学院 指导老师&#xff1a;姚志广、程晟 在这个科技飞速发展的时代&#xff0c;在工业智造、人工智能的飞速发展中&#xff0c;出现了越来越多的智能化机械装置&#xff0c;也有许多创新类的比赛…

STM32F103标准外设库—— 新建工程与库函数(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

力扣刷MySQL-第二弹(详细解析)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目&#xff0c;翻阅了大量资料&#xff0c;也借鉴了不少项目&#xff0c;最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错&#xff0c;因此进行了实现。 一、核心功能设计 总的来说&#xff0c;我们需要能够实现实时检测视…