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

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

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

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

相关文章

HarmonyOS之sqlite数据库的使用

从API Version 9开始,鸿蒙开发中sqlite使用新接口ohos.data.relationalStore 但是 relationalStore在 getRdbStore操作时,在预览模式运行或者远程模拟器运行都会报错,导致无法使用。查了一圈说只有在真机上可以正常使用,因此这里…

分布式搜索引擎ElasticSearch——基础

分布式搜索引擎ElasticSearch——基础 文章目录 分布式搜索引擎ElasticSearch——基础初识elasticsearch什么是elasticsearchelasticsearch的发展正向索引和倒排索引安装elasticsearch,kibana部署单点es创建网络加载镜像运行 部署kibana部署DevTools 安装IK分词器在…

人类的逻辑常常是演绎、归纳和溯因推理混合

人类的逻辑推理往往是一种综合运用不同推理方式的能力。 演绎推理是从已知的前提出发,推断出必然的结论。通过逻辑规则的应用,人们可以从一些已知的事实或前提出发,得出一个必然成立的结论。演绎推理是一种严密的推理方式,它能够保…

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

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

Go新项目-配置文件的选取及区别和写法(1)

先说结论:我们选型TOML yaml,toml,json,ini 实际业务都有用 实际栗子是:我们想要把Go的切片作为配置文件,YAML写起来比较吃力,TOML就很容易了。 配置文件是用于配置计算机程序的参数、初始化设…

文件操作一(非常重要)

文件操作一(非常重要) 一、为什么使用文件?二、什么是文件?三、文件名(简单理解)四、二进制文件和文本文件(重要)五、流的概念(非常重要)六、文件的打开和关闭七、文件的顺序读写函数…

HarmonyOS应用开发者初级认证试题库(鸿蒙)

目录 考试链接: 流程: 选择: 判断: 单选: 多选: 考试链接: 开发者能力认证-职业认证-鸿蒙能力认证-华为开发者学堂 (huawei.com)https://developer.huawei.com/consumer/cn/training/dev-…

芯品荟 | 电脑机箱键盘副屏市场调研报告

一.产品简介 1.带TFT彩屏电脑机箱 2.带小TFT彩屏电脑键盘 为什么电脑机箱&键盘,要带屏? 带屏的电脑机箱&键盘客户群体? 电竞玩家、设计师、电子发烧友、股民...... 二、市场规模 中国电脑机箱年产量约6000万台,键盘年产量约3亿…

从零开始搭建ubuntu 16.04 pwndocker环境

1.安装VMware-tools 1.1遇到问题 在使用 VMware Workstation时遇到了VMware Tools不能安装的问题,具体表现为:在要安装VMware Tools的虚拟机上右键 ----》安装VMware Tools(T)… 为灰色,不能够点击。 1.2解决方案    1. 关闭虚拟机&…

DWM1000 中断与STM32外部中断

DWM1000 中断与STM32外部中断 概述 DWM1000 本身有很多中断控制,例如发送完成中断,接收完成中断等等, 可以通过IRQ(GPIO8) 送到外部控制器。 DWM1000 IRQ pin可以挂到STM32 的外部中断上。 例如当接收到数据帧后,DWM1000 拉IRQ&…

3.goLand基础语法

目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go &#xff0c;在此记录&#xff0c;方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差&#xff1a;偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时&#xff0c;如左图&#xff0c;拟合图像存在部分不符合值&#xff0c;称为欠拟合(underfitting) 过拟合(overfitting) …

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

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

链表练习 Leetcode234.回文链表

题目传送门&#xff1a;Leetcode234 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&…

语聚AI集成抖音丨集简云助力北京自由引擎无缝连接AI大模型,为企业提供即时专业支持

客户介绍 北京自由引擎有限公司作为一家快速发展的初创企业&#xff0c;公司以“创业斯基”为主要运营账号&#xff0c;致力于为B2B用户提供AI营销服务。北京自由引擎迅速崭露头角&#xff0c;成为业内瞩目的新星。核心业务包括提供课程和企业服务&#xff0c;尤其专注于使用A…

基于WebSocket双向通信技术实现-下单提醒和催单(后端)

学习复盘和总结项目亮点。 扩展&#xff1a;该功能能应用在&#xff0c;各种服务类项目中。&#xff08;例如&#xff1a;酒店、洗脚城等系ERP系中提醒类服务&#xff09; 4. 来单提醒 4.1 需求分析和设计 用户下单并且支付成功后&#xff0c;需要第一时间通知外卖商家。通…

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

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

Google上架:2024年一月政策限制之用户生成的内容

为确保 Google Play 用户能够获得安全、值得信赖的使用体验&#xff0c;Google会定期更新开发者计划政策。今天就来讲解一下关于一月新政策《用户生成的内容》。 目录 公布日期&#xff1a;2023-10-25内容公告相关博客截止时间2024-1-31 公布日期&#xff1a;2023-10-25 内容…

【Java】源码文件开头添加注释

需求 应公司质量部要求&#xff0c;需要对代码做静态检查。质量部要求&#xff0c;源码文件必须在起始行起设置一些注释&#xff0c;然而项目已经开发了一年之久&#xff0c;且没有维护这个注释。 此时&#xff0c;面对好几千个源码文件&#xff0c;我们如何快速添加相应的注…

HTML--基本结构构成

基本结构&#xff1a; 文档声明: <!DOCTYPE html> htm标签对 :<html> </html> head标签对&#xff1a; <head> </head> body标签对&#xff1a;<body> </body> 如下结构&#xff1a; <html> <head> <title>这是一…