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

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。这主要是因为切线法使用了待优化函数更多的信息,包括一阶和二阶导数,所以计算效率更高,这在文章中也有提到过该理论。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最佳实践分享:SQL性能调优

SQL性能调优是一个需要不断探索和实践的过程,旨在确保数据库查询的高效运行。本文将分享一些SQL性能调优的最佳实践,帮助您提升数据库性能,减少查询响应时间。 一、索引优化 索引是提高查询性能的关键。以下是一些关于索引优化的建议&#…

JavaScript的Class基本语法

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript是一种基于原型的语言,但在ES6中引入了class关…

elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验

elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验 前一章讲了搜索中的拼写纠错功能,里面一个很重要的概念就是莱文斯坦距离。这章会讲解搜索中提升用户体验的另一项功能 - [自动补全]。本章直接介绍 E…

计算机毕业设计 基于SSM的历史/博物馆藏系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

系统的可观察性是指什么?

系统的可观察性是指什么? 本文转自 公众号 ByteByteGo,如有侵权,请联系,立即删除 系统的可观察性是系统设计的重要一环。不可观察的系统无法度量、无法监控、无法改进。 日志、追踪和度量是系统可观测性的三大支柱。 下图显示了…

黑马程序员——javase基础——day03——循环语句

目录: for循环结构 for循环结构案例1(输出数据)案例2(求和思想)案例3(求偶数和)案例4(水仙花数)案例5(统计思想)案例6(回文数)案例7(逢七过)while循环结构 while循环结构案例1(求奇数和)案例2(珠穆朗玛峰)do-while循环结构 do-while循环结构三种循环的区别continue…

HBase学习二:RegionServer详解

1、内部结构 2、HLog 3、MemStore 4、HFile 5、BlockCache

设计一个抽奖系统

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

【Linux操作】国产Linux服务管理操作

【Linux操作】国产Linux服务管理操作 前言SAMBA配置服务器端1. 安装相关包2. 配置/etc/samba/smb.conf,在此文件末尾添加如下内容,并保存退出。3. 创建/home/share并更改权限4. 启动samba服务 客户端• Windows客户端• 麒麟客户端 Telnet1、telnet语法2…

Spring IOC 之加载 BeanDefinition

1、前言 前面的文章我们已经对IOC之Spring统一资源加载策略有了一定的了解,本文我们将探讨Spring IOC 加载 BeanDefinition的整个过程。 我们先先看一段熟悉的代码: ClassPathResource resource new ClassPathResource("bean.xml"); // &l…

区域入侵/区域人数统计AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件,硬件采用BM1684芯片,集成高性能8核ARM A53,主频高达2.3GHz,INT8峰值算力高达17.6Tops,FB32高精度算力达到2.2T,硬件内置了近40种AI算法模型&…

高精度算法笔记

目录 加法 减法 乘法 除法 高精度加法的步骤&#xff1a; 1.高精度数字利用字符串读入 2.把字符串翻转存入两个整型数组A、B 3.从低位到高位&#xff0c;逐位求和&#xff0c;进位&#xff0c;存余 4.把数组C从高位到低位依次输出 1.2为准备 vector<int> A, B, C…

DataXCloud部署与配置[智数通]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.130 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

【深度学习入门】深度学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解深度学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、深度学习概述 1、什么是深度学习&#xff1f; 2、深度学习与传统机器学习的区别 3、深度学习的应用领域 二、深度学习基本原理 1、神经网络的…

RF自动化环境安装+自动化实例解析

RF定义&#xff1a; 通用型的 自动测试框架&#xff0c; 绝大部分的软件的的自动化系统都可以采用它。 特点&#xff1a; 测试数据文件&#xff08;Test Data&#xff09;对应一个个的测试用例。测试数据文件里面使用的功能小模块叫关键字&#xff0c;由测试库&#xff08;T…

Vue3组件库开发 之Button(1)

需求分析&#xff1a; Button 组件大部分关注样式&#xff0c;没有交互 根本分析可以得到具体的属性列表&#xff1a; type:不同的样式(Default,Primary,Danger,Info,Success,Warning) plain:样式的不同展现模式boolean round:圆角boolean circle:圆形按钮&#xff0c;适合图标…

工具推荐 |Devv.ai — 最懂程序员的新一代 AI 搜索引擎

介绍 伴随 GPT 的出现&#xff0c;我们可以看到越来越多的 AI 产品&#xff0c;其中也不乏针对程序员做的代码生成工具。 今天介绍的这款产品是一款针对中文开发者的 AI 搜索引擎&#xff0c;Devv.ai 使用 Devv.ai 的使用非常简单&#xff0c;就是传统的搜索场景&#xff…

「简明教程」轻松掌握 MongDB 流式聚合操作

「简明教程」轻松掌握 MongDB 流式聚合操作 信息科学中的聚合是指对相关数据进行内容筛选、处理和归类并输出结果的过程。MongoDB 中的聚合是指同时对多个文档中的数据进行处理、筛选和归类并输出结果的过程。数据在聚合操作的过程中&#xff0c;就像是水流过一节一节的管道一…

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

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

【面试合集】说说微信小程序的支付流程?

面试官&#xff1a;说说微信小程序的支付流程&#xff1f; 一、前言 微信小程序为电商类小程序&#xff0c;提供了非常完善、优秀、安全的支付功能 在小程序内可调用微信的API完成支付功能&#xff0c;方便、快捷 场景如下图所示&#xff1a; 用户通过分享或扫描二维码进入商…