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

这篇具有很好参考价值的文章主要介绍了最优化方法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
bisect R 必需 不限 不限 保证 1(线性)
brentq R 必需 不限 不限 保证 1 ≤ p ≤ 1.62 1\leq p\leq1.62 1p1.62
brenth R 必需 不限 不限 保证 1 ≤ p ≤ 1.62 1\leq p\leq1.62 1p1.62
ridder R 必需 不限 不限 保证 1.41 ≤ p ≤ 2.0 1.41\leq p\leq2.0 1.41p2.0
toms748 R 必需 不限 不限 保证 1.65 ≤ p ≤ 2.7 1.65\leq p\leq2.7 1.65p2.7
secant R/C 需近似解x0,x1 无需 无需 不保证 1.62
newton R/C 需近似解x0 必需 无需 不保证 1.41 ≤ p ≤ 2.0 1.41\leq p\leq2.0 1.41p2.0
halley R/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。文章来源地址https://www.toymoban.com/news/detail-645399.html

到了这里,关于最优化方法Python计算:解一元方程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (最优化理论与方法)第一章最优化简介-第二节:最优化典型实例之稀疏优化和低秩矩阵恢复

    考虑下面线性方程组的求解问题,其中 x ∈ R n , b ∈ R m xin R^{n},bin R^{m} x ∈ R n , b ∈ R m ,矩阵 A ∈ R m × n Ain R^{m×n} A ∈ R m × n ,且向量 b b b 的维数远小于向量 x x x 的维数,也即 m m m n n n A x = b Ax=b A x = b 在相关问题中,当我们建立这样的模型后,常常希望 解出向量

    2024年02月08日
    浏览(31)
  • 无约束最优化方法

    求解无约束最优化的基本思路 给定初始点 x 0 ∈ R n , k = 0 x_0in mathbb{R}^n,k=0 x 0 ​ ∈ R n , k = 0 判断当前解是否满足终止准则,若满足则停止迭代,若不满足则转3. 确定 f ( x ) f(x) f ( x ) 在 x k x_k x k ​ 点的下降方向 确定步长 λ k lambda_k λ k ​ ,使 f ( x k + λ k d k ) f(x_k+lambda_

    2023年04月08日
    浏览(86)
  • 最优化方法

    1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景:道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图,按边大小排序 prim 稠密图

    2024年02月15日
    浏览(29)
  • python程序大全(7)——一元一次、一元二次方程解及函数解析

    从1月到6月一直没更新,学习太忙辣。马上就要暑假了,今天是六一儿童节,所以抽出空来更新更新。 本文讲述的是1元1次方程,1元2次方程的python解法。只用给出一般形式的系数和常数,自动给出方程的解。还附带函数解析。 写作不易,支持一波~(好久没打这八个字了)

    2024年02月07日
    浏览(93)
  • python解决一元二次方程

    题目: 求一元二次方程ax*x+b*x+c=0的解 从键盘输入a,b,c的值,分多种情况输出解。 a等于0,b也等于0时,输出“方程无解”; a等于0,b不等于0时,输出“方程有1个解,x= ?”;?表示方程的解 a不等于0时,计算判别式d=b*b-4*a*c的值: 若d小于0,输出“方程无实数解”; 若d等于

    2023年04月08日
    浏览(43)
  • 最优化方法与数学建模

    目录 1. 梯度下降法 2. 牛顿法 3. 遗传算法 4. 数学建模案例

    2024年02月08日
    浏览(28)
  • 最优化方法(三)——矩阵QR分解

    1.熟练掌握 QR 分解 Gram–Schmidt方法; 2.掌握 Householder 方 法 ; 3. 能够判断 矩阵是否可逆 ,并 求出其逆矩阵 。 读取附件 MatrixA.mat 文件中的 矩阵 A , 利用 Gram–Schmidt(GS) 算法对A进行QR分解 。 (1)   验证GS是否 能稳定 进行QR分解矩阵A ,其 Q矩阵 是否正交? (2) 实现 Householder

    2024年01月24日
    浏览(29)
  • 最优化方法-牛顿法一维搜索

    导言: 在最优化问题中,找到函数的最小值或最大值是一个重要的任务。牛顿法是一种经典的迭代方法,常用于优化问题的求解。本文将详细介绍最优化方法中的牛顿法一维搜索,包括其基本原理、算法步骤以及应用场景。 牛顿法,也称为牛顿-拉夫逊方法,是一种迭代的优

    2024年02月06日
    浏览(27)
  • 最优化方法实验三--矩阵QR分解

    1.熟练掌握 QR 分解 Gram–Schmidt方法; 2.掌握 Householder 方 法 ; 3. 能够判断 矩阵是否可逆 ,并 求出其逆矩阵 。 1 .1向量投影 向量的投影包含了两层意思:①正交关系:矢量与投影的差称为误差,误差和投影正交;②最短距离:投影空间中所有矢量中,与原矢量距离最近的,

    2024年02月22日
    浏览(32)
  • 机器学习笔记之最优化理论与方法(五)凸优化问题(上)

    本节将介绍 凸优化问题 ,主要介绍 凸优化问题的基本定义 、 凸优化与非凸优化问题的区分 。 关于最优化问题 P mathcal P P 描述如下: P ⇒ { min ⁡ f ( x 1 , x 2 , ⋯   , x n ) s.t.  { G i ( x 1 , x 2 , ⋯   , x n ) ≤ 0 i = 1 , 2 , ⋯   , m H j ( x 1 , x 2 , ⋯   , x n ) = 0 j = 1 , 2 , ⋯   ,

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包