最优化方法Python计算:解一元方程

我们知道,若 f ( x ) f(x) f(x) R \text{ℝ} R上连续,则 f ( x ) f(x) f(x)有原函数 F ( x ) , x ∈ R F(x),x\in\text{ℝ} F(x),xR。因此,解方程 f ( x ) = 0 f(x)=0 f(x)=0,等价于计算 F ( x ) F(x) F(x)的局部最小(大)值。譬如,设 f ( x ) f(x) f(x) [ a 0 , b 0 ] [a_0,b_0] [a0,b0]上连续且 f ( a 0 ) ⋅ f ( b 0 ) < 0 f(a_0)\cdot f(b_0)<0 f(a0)f(b0)<0,我们对解决局部优化问题的二分算法稍加修改即可用于在 ( a 0 , b 0 ) (a_0,b_0) (a0,b0)内解方程 f ( x ) = 0 f(x)=0 f(x)=0

def bisect_solv(fun,bracket,eps=1e-10):a0,b0=bracket							#初始区间端点a1=(a0+b0)/2							#区间中点f=fun(a1)								#当前函数值k=1										#迭代次数while (b0-a0>=eps) and (abs(f)>=eps):	#循环迭代if f*fun(a0)>0:						#当前点函数值与左端点同号a0=a1							#修改左端点else:								#否则b0=a1							#修改右端点a1=(a0+b0)/2						#当前中点f=fun(a1)							#当前点函数值k+=1								#迭代次数return a1,k

程序的第1~14行定义的函数bisect_solv实现解一元方程 f ( x ) = 0 f(x)=0 f(x)=0的二分算法。函数含有三个参数:fun表示连续函数 f ( x ) f(x) f(x)。bracket表示初始区间 [ a 0 , b 0 ] [a_0,b_0] [a0,b0],这是一个二元组。要求 f ( a 0 ) ⋅ f ( b 0 ) < 0 f(a_0)\cdot f(b_0)<0 f(a0)f(b0)<0。eps表示容错误差 ε \varepsilon ε,缺省值为 1 0 − 10 10^{-10} 1010。2~ 5行作初始化操作,第6~13行的while循环进行迭代,取区间中点 a 1 = a 0 + b 0 2 a_1=\frac{a_0+b_0}{2} a1=2a0+b0,计算 f 1 = f ( a 1 ) f_1=f(a_1) f1=f(a1),检测 f 1 f_1 f1是否与 f ( a 0 ) f(a_0) f(a0)同号,若是则修改 a 0 a_0 a0 a 1 a_1 a1,否则修改 b 0 b_0 b0 a 1 a_1 a1,以保持 f ( a 0 ) f(a_0) f(a0) f ( b 0 ) f(b_0) f(b0)异号。循环往复,直至 ∣ f ( a 1 ) ∣ < ε |f(a_1)|<\varepsilon f(a1)<ε ∣ b 0 − a 0 ∣ < ε |b_0-a_0|<\varepsilon b0a0<ε为止。第14行返回方程解的近似值a1及迭代次数k。
例1 ln ⁡ 2 \ln{2} ln2可视为方程 e x − 2 = 0 e^x-2=0 ex2=0的解。给定初始区间 [ a 0 , b 0 ] = [ 0 , 1 ] [a_0,b_0]=[0,1] [a0,b0]=[0,1],容错误差 ε = 1 0 − 10 \varepsilon=10^{-10} ε=1010,用二分法解方程 e x − 2 = 0 e^x-2=0 ex2=0,以算得 ln ⁡ 2 \ln{2} ln2的近似值。
:下列代码完成计算

f=lambda x: np.exp(x)-2			#设置函数f(x)
solution=bisect_solv(f,(0,1))	#求解f(x)=0在区间(0,1)内的根
print(solution)

程序的第1行设置函数 f ( x ) = e x − 2 f(x)=e^x-2 f(x)=ex2,第2行调用bisect_solv计算 f ( x ) = 0 f(x)=0 f(x)=0在区间 ( 0 , 1 ) (0,1) (0,1)内的根。运行程序,输出:

(0.6931471806019545, 29)

这意味着用二分法在 ε = 1 0 − 10 \varepsilon=10^{-10} ε=1010的容错误差下,迭代29次,算得 e x − 2 = 0 e^x-2=0 ex2=0 ( 0 , 1 ) (0,1) (0,1)内的根为0.6931,即 ln ⁡ 2 \ln2 ln2的近似值为0.6931。
scipy的optimize模块提供了函数
root_ scalar(f, method, ...) \text{root\_{}scalar(f, method, ...)} root_scalar(f, method, ...)
用于一元方程的求根。参数f表示方程 f ( x ) = 0 f(x)=0 f(x)=0中的函数 f ( x ) f(x) f(x)。method表示所用求根方法。返回值是包含收敛信息、函数调用次数、迭代次数及近似根等信息的元组。scipy.minimize为root_{}scalar的method参数提供了如下的可选方法

方法f的定义域初始区间1阶导数2阶导数收敛收敛率 p p p
bisectR必需不限不限保证1(线性)
brentqR必需不限不限保证 1 ≤ p ≤ 1.62 1\leq p\leq1.62 1p1.62
brenthR必需不限不限保证 1 ≤ p ≤ 1.62 1\leq p\leq1.62 1p1.62
ridderR必需不限不限保证 1.41 ≤ p ≤ 2.0 1.41\leq p\leq2.0 1.41p2.0
toms748R必需不限不限保证 1.65 ≤ p ≤ 2.7 1.65\leq p\leq2.7 1.65p2.7
secantR/C需近似解x0,x1无需无需不保证1.62
newtonR/C需近似解x0必需无需不保证 1.41 ≤ p ≤ 2.0 1.41\leq p\leq2.0 1.41p2.0
halleyR/C需近似解x0必需必需不保证 1.44 ≤ p ≤ 3.0 1.44\leq p\leq3.0 1.44p3.0

method参数的缺省值是系统按所提供的参数使用适用于所呈现情况的最佳方法。如果提供了包含根的区间,它可能会使用区间方法之一(bisect、brentq、brenth、rider、toms748)。如果指定了导数和初始值,它可以选择基于导数的方法之一(secant、newton、halley)。如果没有方法被判定为适用,它将引发异常。
例2:计算函数 f ( x ) = 1 + ( 2 − x ) 2 1 + x 2 f(x)=\frac{1+(2-x)^2}{1+x^2} f(x)=1+x21+(2x)2的最大值点 x 0 x_0 x0
:由于 f ( x ) f(x) f(x)二阶连续可微,为计算 f ( x ) f(x) f(x)的最大值点,先求得 f ( x ) f(x) f(x)驻点。令
f ′ ( x ) = 4 ( ( x − 1 ) 2 − 2 ) ( 1 + x 2 ) 2 = 0 f'(x)=\frac{4((x-1)^2-2)}{(1+x^2)^2}=0 f(x)=(1+x2)24((x1)22)=0
解此方程,得驻点。按二阶可微函数极值点的必要条件,计算 f ( x ) f(x) f(x)的二阶导数 f ′ ′ ( x ) f''(x) f′′(x)在驻点处的值,通过二阶导数值的正负以判断是极大值点或是极小值点。下列代码完成计算过程。

from scipy.optimize import root_scalar				  	#导入root_scalar
answer={True:'极小点',False:'极大点'}				  		#设置驻点标签字典
f=lambda x: (1+(2-x)**2)/(1+x**2)				  		#设置目标函数
f1=lambda x:4*((x-1)**2-2)/(1+x**2)**2				  	#设置导函数
x0=root_scalar(f1,bracket=(-2,0)).root				  	#计算区间(-2,0)内驻点
_,f2=der_scalar(f,x0)									#计算驻点处二阶导数
print('x0=%.4f为%s,f(x0)=%.4f'%(x0,answer[f2>0],f(x0)))	#驻点标签
x0=root_scalar(f1,bracket=(2,3)).root				  	#计算区间(2,3)内驻点
_,f2=der_scalar(f,x0)									#计算驻点处二阶导数
print('x0=%.4f为%s,f(x0)=%.4f'%(x0,answer[f2>0],f(x0)))	#驻点标签

程序的第2行设置驻点的极值属性标签字典answer:True对应“极小点”,False对应“极大点。第3、4行分别设置目标函数表达式f及其1阶导函数f1。第5行调用root_scalar(第1行导入),传递区间(-2,0)给参数bracket,method参数使用缺省值自动求解方程 f ′ ( x ) = 0 f'(x)=0 f(x)=0赋予x0。第6行调用der_scalar函数(详见博文《最优化方法Python计算:一元函数导数的数值计算》),计算 f ( x ) f(x) f(x)在驻点x0处的二阶导数赋予f2,第7行以f2是否大于零而确定x0的极值点属性。相仿地,第8~10行计算 f ( x ) f(x) f(x)在区间 ( 2 , 3 ) (2,3) (2,3)内的驻点,并确定其极值点属性。运行程序,输出

x0=-0.4142为极大点,f(x0)=5.8284
x0=2.4142为极小点,f(x0)=0.1716

这意味着驻点-0.4142,极大值为5.8284。驻点2.4142是函数 f ( x ) f(x) f(x)的极小值点,极小值为0.1716。所以,最大值点为-0.4142。

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

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

相关文章

【uniapp】uniapp使用微信开发者工具制作骨架屏:

文章目录 一、效果&#xff1a;二、过程&#xff1a; 一、效果&#xff1a; 二、过程&#xff1a; 【1】微信开发者工具打开项目&#xff0c;生成骨架屏&#xff0c;将wxml改造为vue页面组件&#xff0c;并放入样式 【2】页面使用骨架屏组件 【3】改造骨架屏&#xff08;去除…

Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs

目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 关于 Debian rootfs Debian 没有像 Ubuntu 提供 Ubuntu-…

以mod_jk方式整合apache与tomcat(动静分离)

前言&#xff1a; 为什么要整合apache和tomcat apache对静态页面的处理能力强&#xff0c;而tomcat对静态页面的处理不如apache&#xff0c;整合后有以下好处 提升对静态文件的处理性能 利用 Web 服务器来做负载均衡以及容错 更完善地去升级应用程序 jk整合方式介绍&#…

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

【验证码逆向专栏】最新某度旋转验证码 v2 逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

更新spring boot jar包中的BOOT-INF/lib目录下的jar包

更新spring-boot jar包中的BOOT-INF/lib目录下的jar包 场景 需要更新lib目录下某个jar包的配置文件 失败的解决方法 用解压软件依次打开spring-boot jar包&#xff08;设为a.jar&#xff09;、BOOT-INF/lib目录下的jar包&#xff08;设为b.jar&#xff09;&#xff0c;然后修改…

2021年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字判断 输入一个字符,如何输入的字符是数字,输出yes,否则输出no 输入 一个字符 输出 如何输入的字符是数字,输出yes,否则输出no 样例1输入 样例1输入 5 样例1输出 yes 样例2输入 A 样例2输出 no 下面是一个使用C语言编写的数字判断程序的示例代码,根据输入的字符…

怎么入驻抖音的产业带服务商呢?

作为互联网行业中的明星企业之一&#xff0c;抖音电商近年来一直备受市场瞩目&#xff0c;甚至于某种角度而言&#xff0c;围绕抖音电商的研究和解读已成为一门“显学”。 如果说2021年之前&#xff0c;抖音试水电商业务的方式大多以主播、品牌及商家申请找cmxyci自发摸索为主…

实践|Linux 中查找和删除重复文件

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您习惯使用下载管理器从互联网上下载各种内容&#xff0c;那么组织您的主目录甚至系统可能会特别困难。 通常&#xff0c;您可能会发现您下载了相同的 mp3、pdf 和 epub&#xff08;以及各种其他文件扩展名&#xff09;并将…

VB+sql小型超市管理系统设计与实现

1、项目计划 1.1系统开发目的 (1)大大提高超市的运作效率; (2)通过全面的信息采集和处理,辅助提高超市的决策水平; (3)使用本系统,可以迅速提升超市的管理水平,为降低经营成本, 提高效益,增强超市扩张力, 提供有效的技术保障。 1.2背景说明 21世纪,超市的…

在Linux中安装MySQL

在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…

【LeetCode 算法】Merge k Sorted Lists 合并 K 个升序链表

文章目录 Merge k Sorted Lists 合并 K 个升序链表问题描述&#xff1a;分析代码Heap Tag Merge k Sorted Lists 合并 K 个升序链表 问题描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并…

案例14 Spring MVC文件上传案例

基于Spring MVC实现文件上传&#xff1a; 使用commons-fileupload实现上传文件到本地目录。 实现上传文件到阿里云OSS和从阿里云OSS下载文件到本地。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case14-springmvc03。 ​ 2. 配置Maven依赖 <?xml ver…

Jenkins集成appium自动化测试(Windows篇)

一&#xff0c;引入问题 自动化测试脚本绝大部分用于回归测试&#xff0c;这就需要制定执行策略&#xff0c;如每天、代码更新后、项目上线前定时执行&#xff0c;才能达到最好的效果&#xff0c;这时就需要进行Jenkins集成。 不像web UI自动化测试可以使用无痕浏览器做到无界…

vue3+ts+vite全局配置Element-Plus主题色

概述 我找了很多博客&#xff0c;想全局配置Elmenet-Plus组件主题色&#xff0c;但都没有效果。所以有了这篇博客&#xff0c;希望能对你有所帮助&#xff01;&#xff01;&#xff01; 文章目录 概述一、先看效果二、创建全局颜色文件2.1 /src/styles 下新建 element-plus.sc…

“探索计算机世界:进程的基本概念与功能“

文章目录 前言什么是进程如何描述进程进程的属性1. 进程标识符2. 内存指针3. 文件描述符表4. 进程的状态5. 优先级6. 上下文7. 记账信息 内存分配并行和并发 前言 作为程序员&#xff0c;理解计算机的组成以及计算机是怎样运行的是很重要的&#xff0c;因为只有了解计算机我们…

k8s、docker添加daemon.json添加“exec-opts“: [“native.cgroupdriver=systemd“]后无法启动的问题

考虑k8s下docker下载镜像太慢&#xff0c;修改了daemon.json&#xff0c;按照手册抄&#xff0c;添加 {"exec-opts": ["native.cgroupdriversystemd"],"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"] }结果发现k8s起…

9.3.2.1网络原理(UDP)

1.UDP的基本特点:无连接,不可靠传输,面向数据报,全双工. 2.1~1024的端口号有特定的含义,不建议使用.比如21:ftp,22:ssh,80:http,443:https. 3.CRC校验算法:循环冗余校验和,把UDP报中的每个字节都依次进行累加,把累加的结果,放到两个字节的变量中,溢出也无所谓,因为都加了一遍.…

Java多线程(2)---线程控制和线程安全的详细讲解

目录 前言 一.线程控制方法 1.1启动线程--start() 1.2线程睡眠---sleep()方法 1.3中断线程--interrupt() 方法 1.4等待线程---join() 二.线程安全 2.1数据不安全---数据共享 ⭐不安全的演示和原因 ⭐不安全的处理方法 ⭐synchronized的使用 2.2数据不安全---内存可…

性能测试—Jmeter工具

文章目录 性能测试1. 术语介绍2. 方法3. 应用场景4. 工具&#xff08;Jmeter&#xff09;4.1 介绍4.2 元件和组件4.2.2 元件4.2.1 组件 4.3 作用域4.4 参数化4.5 执行脚本 性能测试 1. 术语介绍 响应时间(Response time)&#xff1a;对请求作出响应所需要的时间。 在互联网上对…