最优化方法Python计算:一元函数导数的数值计算

news2024/9/20 20:31:09

定义1 给定连续函数 f ( x ) f(x) f(x) x ∈ Ω ⊆ R x\in\Omega\subseteq\text{ℝ} xΩR。设 x , x 1 ∈ Ω x,x_1\in\Omega x,x1Ω
Δ x = x − x 1 \Delta x=x-x_1 Δx=xx1
称为变量 x x x差分。此时, x = x 1 + Δ x x=x_1+\Delta x x=x1+Δx。称
f ( x 1 + Δ x ) − f ( x 1 ) Δ x \frac{f(x_1+\Delta x)-f(x_1)}{\Delta x} Δxf(x1+Δx)f(x1)
f ( x ) f(x) f(x) x 1 x_1 x1处的前向差分。称
f ( x 1 ) − f ( x 1 − Δ x ) Δ x \frac{f(x_1)-f(x_1-\Delta x)}{\Delta x} Δxf(x1)f(x1Δx)
f ( x ) f(x) f(x) x 1 x_1 x1处的后向差分。称
f ( x 1 + Δ x / 2 ) − f ( x 1 − Δ x / 2 ) Δ x \frac{f(x_1+\Delta x/2)-f(x_1-\Delta x/2)}{\Delta x} Δxf(x1+Δx/2)f(x1Δx/2)
f ( x ) f(x) f(x) x 1 x_1 x1处的中心差分
若函数 f ( x ) f(x) f(x) x 1 x_1 x1处可微,则 f ( x ) f(x) f(x) x 1 x_1 x1处的导数为
f ′ ( x 1 ) = lim ⁡ Δ x → 0 f ( x ) − f ( x 1 ) Δ x = lim ⁡ Δ x → 0 f ( x 1 + Δ x ) − f ( x 1 ) Δ x f'(x_1)=\lim_{\Delta x\rightarrow0}\frac{f(x)-f(x_1)}{\Delta x}=\lim_{\Delta x\rightarrow0}\frac{f(x_1+\Delta x)-f(x_1)}{\Delta x} f(x1)=Δx0limΔxf(x)f(x1)=Δx0limΔxf(x1+Δx)f(x1)
f ( x ) f(x) f(x) x 1 x_1 x1处的导数 f ′ ( x 1 ) f'(x_1) f(x1) f ( x ) f(x) f(x) x 1 x_1 x1处的前向差分 f ( x 1 + Δ x ) − f ( x 1 ) Δ x \frac{f(x_1+\Delta x)-f(x_1)}{\Delta x} Δxf(x1+Δx)f(x1) x x x的差分 Δ x \Delta x Δx趋于0时的极限。因此,当 ∣ Δ x ∣ |\Delta x| ∣Δx充分小时,
f ′ ( x 1 ) ≈ f ( x 1 ) − f ( x 1 − Δ x ) Δ x . f'(x_1)\approx \frac{f(x_1)-f(x_1-\Delta x)}{\Delta x}. f(x1)Δxf(x1)f(x1Δx).
f ( x ) f(x) f(x) x 1 x_1 x1处的后向差分 f ( x 1 ) − f ( x 1 − Δ x ) Δ x \frac{f(x_1)-f(x_1-\Delta x)}{\Delta x} Δxf(x1)f(x1Δx)中对变量差分 Δ x \Delta x Δx作变换 Δ x ′ = − Δ x \Delta x'=-\Delta x Δx=Δx,得
f ( x 1 ) − f ( x 1 − Δ x ) Δ x = f ( x 1 ) − f ( x 1 + Δ ′ x ) − Δ x ′ = f ( x 1 + Δ x ′ ) − f ( x 1 ) Δ x ′ \frac{f(x_1)-f(x_1-\Delta x)}{\Delta x}=\frac{f(x_1)-f(x_1+\Delta'x)}{-\Delta x'}=\frac{f(x_1+\Delta x')-f(x_1)}{\Delta x'} Δxf(x1)f(x1Δx)=Δxf(x1)f(x1+Δx)=Δxf(x1+Δx)f(x1)
由于 Δ x ′ → 0 \Delta x'\rightarrow0 Δx0当且进当 Δ x → 0 \Delta x\rightarrow0 Δx0,故当 ∣ Δ x ∣ |\Delta x| ∣Δx充分小时,有
f ′ ( x 1 ) ≈ f ( x 1 ) − f ( x 1 − Δ x ) Δ x . f'(x_1)\approx\frac{f(x_1)-f(x_1-\Delta x)}{\Delta x}. f(x1)Δxf(x1)f(x1Δx).
对于 f ( x ) f(x) f(x) x 1 x_1 x1处的中心差分
f ( x 1 + Δ x / 2 ) − f ( x 1 − Δ x / 2 ) Δ x = f ( x 1 + Δ x / 2 ) − f ( x 1 ) + f ( x 1 ) − f ( x 1 − Δ x / 2 ) Δ x = 1 2 f ( x 1 + Δ x / 2 ) − f ( x 1 ) + f ( x 1 ) − f ( x 1 − Δ x / 2 ) Δ x / 2 = 1 2 [ f ( x 1 + Δ x / 2 ) − f ( x 1 ) Δ x / 2 + f ( x 1 ) − f ( x 1 − Δ x / 2 ) Δ x / 2 ] \frac{f(x_1+\Delta x/2)-f(x_1-\Delta x/2)}{\Delta x}=\frac{f(x_1+\Delta x/2)-f(x_1)+f(x_1)-f(x_1-\Delta x/2)}{\Delta x}\\ =\frac{1}{2}\frac{f(x_1+\Delta x/2)-f(x_1)+f(x_1)-f(x_1-\Delta x/2)}{\Delta x/2}\\ =\frac{1}{2}\left[\frac{f(x_1+\Delta x/2)-f(x_1)}{\Delta x/2}+\frac{f(x_1)-f(x_1-\Delta x/2)}{\Delta x/2}\right] Δxf(x1+Δx/2)f(x1Δx/2)=Δxf(x1+Δx/2)f(x1)+f(x1)f(x1Δx/2)=21Δx/2f(x1+Δx/2)f(x1)+f(x1)f(x1Δx/2)=21[Δx/2f(x1+Δx/2)f(x1)+Δx/2f(x1)f(x1Δx/2)]
所以
f ′ ( x 1 ) ≈ f ( x 1 + Δ x / 2 ) − f ( x 1 − Δ x / 2 ) Δ x . f'(x_1)\approx\frac{f(x_1+\Delta x/2)-f(x_1-\Delta x/2)}{\Delta x}. f(x1)Δxf(x1+Δx/2)f(x1Δx/2).

g ( x ) = f ( x + Δ x / 2 ) − f ( x − Δ x / 2 ) Δ x g(x)=\frac{f(x+\Delta x/2)-f(x-\Delta x/2)}{\Delta x} g(x)=Δxf(x+Δx/2)f(xΔx/2)
称其为 f ( x ) f(x) f(x)广义导数。对 f ( x ) f(x) f(x)的广义导数 g ( x ) g(x) g(x)计算其在 x 1 x_1 x1处的中心差分,可得 f ( x ) f(x) f(x) x 1 x_1 x1处的二阶导数近似计算公式
f ′ ′ ( x 1 ) ≈ f ( x 1 + Δ x ) + f ( x 1 − Δ x ) − 2 f ( x 1 ) Δ x 2 . f''(x_1)\approx\frac{f(x_1+\Delta x)+f(x_1-\Delta x)-2f(x_1)}{\Delta x^2}. f′′(x1)Δx2f(x1+Δx)+f(x1Δx)2f(x1).
利用 f ′ ( x 1 ) f'(x_1) f(x1) f " ( x 1 ) f"(x_1) f"(x1)的近似公式,实现一元函数二阶可微的一、二阶导数计算的Python函数定义如下

def der_scalar(f,x1):						#f表示函数,x1表示自变量值
   dx=1e-7									#设置Δx=0.0000001
   f1=(f(x1+dx/2)-f(x1-dx/2))/dx			#计算一阶导数
   f2=(f(x1+dx)+f(x1-dx)-2*f(x1))/dx**2		#计算二阶导数
   return f1,f2

程序中第1~5定义函数der_scalar。两个参数之一f表示二阶可微函数 f ( x ) f(x) f(x),x1表示自变量值 x 1 x_1 x1。第2行设置自变量增量 Δ x = 1 0 − 7 \Delta x=10^{-7} Δx=107为dx。第3行按 f ′ ( x 1 ) f'(x_1) f(x1)的中心差分近似式计算 x 1 x_1 x1处的一阶导数 f ′ ( x 1 ) f'(x_1) f(x1)为f1。第4行按广义导数的中心差分计算 x 1 x_1 x1处的二阶导数 f ′ ′ ( x 1 ) f''(x_1) f′′(x1)为f2。
例1 考虑函数 f ( x ) = sin ⁡ x 2 f(x)=\sin{x^2} f(x)=sinx2,其一阶导数 f ′ ( x ) = 2 x cos ⁡ x 2 f'(x)=2x\cos{x^2} f(x)=2xcosx2,二阶导数 f ′ ′ ( x ) = 2 ( cos ⁡ x 2 − 2 x 2 sin ⁡ x 2 ) f''(x)=2(\cos{x^2}-2x^2\sin{x^2}) f′′(x)=2(cosx22x2sinx2)。故对 x 1 = π 3 x_1=\frac{\pi}{3} x1=3π可算得 f ′ ( x 1 ) = 0.9563 f'(x_1)=0.9563 f(x1)=0.9563 f ′ ′ ( x 1 ) = − 2.9893 f''(x_1)=-2.9893 f′′(x1)=2.9893。下列代码比较直接由导函数解析式计算和调用上列程序定义的der_scalar函数计算的结果。

import numpy as np									#导入numpy
f=lambda x:np.sin(x**2)								#设置函数f(x)
f1=lambda x:2*x*np.cos(x**2)						#设置一阶导数f'(x)
f2=lambda x:2*(np.cos(x**2)-2*np.sin(x**2)*x**2)	#设置二阶导数f"(x)
x1=np.pi/3											#设置自变量x1
print((f1(x1),f2(x1)))								#解析计算
print(der_scalar(f,x1))								#数值计算

程序的2、3、4行分别设置 f ( x ) f(x) f(x) f ′ ( x ) f'(x) f(x) f ′ ′ ( x ) f''(x) f′′(x)的解析式。第5行设置自变量的值 x 1 = π 3 x_1=\frac{\pi}{3} x1=3π。第6行输出解析计算结果,第7行调用der_scalar函数数值地计算 f ′ ( x 1 ) f'(x_1) f(x1) f ′ ′ ( x 1 ) f''(x_1) f′′(x1)。运行程序,输出

(0.9563079109495481, -2.9893240816612874)
(0.9563079098976839, -3.0000693287648676)

输出的第1行为解析计算的结果,第2行为数值计算结果。比较两者可见der_scalar函数计算的一阶导数结果精度是很高的,二阶导数的计算精度稍差。这是因为,这是对“广义导数”进行差分计算的结果。换句话说,在计算二阶导数时,累积了两次计算误差,产生了误差的“放大”效应。尽管如此,der_scalar函数在大多数场合都能满足应用的要求。
例2: 下图给出了移动无线通信系统的简化模型。有两个同为 1 1 1个高度单位相矩 2 2 2个长度单位的相邻基站,手机用户所处位置为 x x x,手机收到的基站信号的功率与用户与基站之间的距离平方成反比。试确定用户最为合适的位置,使得信号干扰比最大,即用户接收到来自基站 1 1 1的信号功率与来自基站 2 2 2的信号功率之间的比值最大。
请添加图片描述
:按题意,手机收到的基站信号的功率与用户与基站之间的距离平方成反比。即收到基站1和基站2的功率分别为
w 1 = 1 1 + x 2 w 2 = 1 1 + ( 2 − x ) 2 \begin{array}{l} w_1=\frac{1}{1+x^2}\\ w_2=\frac{1}{1+(2-x)^2} \end{array} w1=1+x21w2=1+(2x)21
为使得信号干扰比最大,即用户接收到来自基站1的信号功率与来自基站2的信号功率之间的比值最大,求函数 f ( x ) = w 1 w 2 = 1 + ( 2 − x ) 2 1 + x 2 f(x)=\frac{w_1}{w_2}=\frac{1+(2-x)^2}{1+x^2} f(x)=w2w1=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 ) = − 2 ( 2 − x ) ( 1 + x 2 ) − 2 x ( 1 + ( 2 − x ) 2 ) ( 1 + x 2 ) 2 = 4 ( x 2 − 2 x − 1 ) ( 1 + x 2 ) 2 = 4 ( ( x − 1 ) 2 − 2 ) ( 1 + x 2 ) 2 = 4 ( ( x − 1 − 2 ) ( x − 1 + 2 ) ) ( 1 + x 2 ) 2 f'(x)=\frac{-2(2-x)(1+x^2)-2x(1+(2-x)^2)}{(1+x^2)^2}\\ =\frac{4(x^2-2x-1)}{(1+x^2)^2}=\frac{4((x-1)^2-2)}{(1+x^2)^2}\\ =\frac{4((x-1-\sqrt{2})(x-1+\sqrt{2}))}{(1+x^2)^2} f(x)=(1+x2)22(2x)(1+x2)2x(1+(2x)2)=(1+x2)24(x22x1)=(1+x2)24((x1)22)=(1+x2)24((x12 )(x1+2 ))
f ′ ( x ) = 0 f'(x)=0 f(x)=0,即得驻点 x 1 = 1 − 2 x_1=1-\sqrt{2} x1=12 x 2 = 1 + 2 x_2=1+\sqrt{2} x2=1+2 。按二阶可微函数极值点的必要条件,需计算 f ( x ) f(x) f(x)的二阶导数 f ′ ′ ( x ) f''(x) f′′(x)在驻点处的值,通过二阶导数值的正负以判断是极大值点或是极小值点。下列代码完成计算过程。

import numpy as np					#导入numpy
f=lambda x:(1+(2-x)**2)/(1+x**2)	#设置函数f(x)
x1=1-np.sqrt(2)						#驻点x1
x2=1+np.sqrt(2)						#驻点x2
print('%.1f,%.4f'%der_scalar(f,x1))	#计算x1处一、二阶导数
print('%.1f,%.4f'%der_scalar(f,x2))	#计算x2处一、二阶导数

利用代码中的注释信息不难理解程序。仅提请注意第3、4行分别设置的是驻点 x 1 = 1 − 2 x_1=1-\sqrt{2} x1=12 x 2 = 1 + 2 x_2=1+\sqrt{2} x2=1+2 。运行程序,输出:

0.0,-8.2107
0.0,0.2566

第1行输出的是 f ( x ) f(x) f(x) x 1 = 1 − 2 x_1=1-\sqrt{2} x1=12 处的一、二阶导数值,说明 x 1 x_1 x1确实为驻点,且由于在 x 1 x_1 x1处的二阶导数值近似为-8.2107,根据极值点的充分条件知 x 1 x_1 x1 f ( x ) f(x) f(x)的唯一极大值点,即为本题所求。第二行的输出表明 x 2 = 1 + 2 x_2=1+\sqrt{2} x2=1+2 f ( x ) f(x) f(x)的极小值点,也是最小值点。

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

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

相关文章

黑盒测试过程中【测试方法】详解5-输入域,输出域,猜错法

在黑盒测试过程中,有9种常用的方法:1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类,边界值,判定表_朝一…

Linux下实现共享内存的两种机制(附源码)

START Hello 大家好。 今天来讲一下Linux进程通信中重要的通信方式:共享内存作为Linux软件开发攻城狮,进程间通信是必须熟练掌握的重要技能,而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。 下面我们就来聊一聊Linux下进程间…

【C++】string类的深浅拷贝问题

string类的深浅拷贝问题 浅拷贝问题构造/析构函数拷贝构造/赋值运算符重载的多种写法 浅拷贝问题 我们知道,定义一个类的时候,如果我们没有写构造,拷贝构造,赋值运算符重载,析构方法的话,编译器会自动生成。…

Django学习笔记001之创建项目

学习目标: 了解前端后台框架 掌握vs搭建Django环境 学习内容 1.背景学习 优缺点: 2.vs搭建Django开发环境 2.1. 准备vscode工具 可以从github上获取:https://github.com/microsoft/vscode。 2.2. 构建python虚拟环境 使用的命令是pyth…

微分方程数值解法(Runge-Kutta法PLC实现)

微分方程数值解法之欧拉法请参看下面的博客文章: 微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)_数学微积分算法plc编程实例_RXXW_Dor的博客-CSDN博客微分方程除极特殊情况外,大部分不可能求出它的精确解,只能用各种近似方法得到满足一定精度的近似解,微分方程由…

CTA进网检验要求修订原则和变更说明 SAR新国标在2024年正式实施

《进网检验要求文件》 实行定期及动态更新原则,其中检测项目应能体现进网监管的职责定位。 第一部分 基本功能性能 第二部分 空间性能 SAR 新版进网检验要求细化了各场景的测试距离: SAR新要求的实施日期: 第二部分 空间性能 EMC 第二部分 空…

【MySQL】查询中,NULL值转换为空字符串

系列文章 C#底层库–MySQLBuilder脚本构建类(select、insert、update、in、带条件的SQL自动生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类(推荐阅读&#xff0…

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/,他的用途是将前端用到的众多资源(css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候,原来我们可能这样写 &l…

C嘎嘎~~ [类 上篇]

类 上篇 1.面向过程和面向对象的认识2.类的引入3.类的定义4.类的访问限定符和封装4.1封装4.2访问限定符 5.类的作用域 1.面向过程和面向对象的认识 面向过程 和 面向对象的区别: 面向过程关注的是过程, 而面向对象关注的是对象之间的关系, 交互. C语言是面向过程的, 而C是面向对…

webshell gif图片文件绕过

目录页/dev/index. php允许GIF上传。尝试上传不同的文件类型将被拒绝。 这可以通过首先上传合法的GIF文件来绕过。使用了一个小的GIF https://giphy.com/gifs/obi-won-hvE0PhVAnGQAo 下载一个小的字节图片测试 上传文件并使用Burpsuite捕获请求。尝试上传时的请求应类似于下…

淘宝天猫店铺新品如何运营?

新品在店铺运营过程中是十分重要的部分,你知道新品在店铺运营中有何作用?了解新品运营机制吗?今天就来快速了解关于新品的知识点。 新品在店铺运营的角色: 01、商品生命周期有限 商品的普遍生命周期在3个月左右,3个…

Codeforces Round 867 (Div. 3)

Problem - E - Codeforces 思路: 首先,如果n为奇数,中间那个数无法调整,所以只考虑偶数只有26个字母,我们用cnt[]记录每个字母需要交换的对数。设maxn为交换对数最多的字母。显然,如果cnt[maxn]>n/2,显…

速锐得解码奔驰CAN数据应用于海外车联网远程控制与防盗系统

人们常说,奔驰征服一切,你征服奔驰。速锐得帮你征服奔驰的数据。 前日,有个海外客户,问我们做了奔驰哪些数据,他们需要一个车联网的远程控制系统,用于管理他们的车队。客户比较豪横,大多数都是…

大数据管理中心规划设计方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 统一汇聚 推动业务数据协同5 价值提炼 支撑精准服务与科学管理6 实时感知 辅助城市治理高效运行7 大数据资源平台目标体系规划11 建设目标与思路12 使能高效协同&#xff0…

榜上有名 | 创宇盾荣登“2023 IT市场权威榜单”!

4月20日,已连续成功举办23届的IT市场年会在北京举行,作为权威咨询机构赛迪主办,中国IT业界延续时间最长的年度盛会之一,“2023 IT市场年会”隆重发布重磅权威榜单。 创宇盾作为云防护领域专业防护产品,在国家经济产业…

C++的默认成员函数

上一次我们说到了C的类,我们还知道在C的类中可以写函数,而且这个函数也属于这个类,我们可以直接使用这个类的对象去调用这个函数。 今天我们来看一下C的六个默认成员函数(这里说是6个,但是重要的只有4个) 构造函数 在C语言中&a…

Raft 共识算法3-日志复制

Raft 共识算法3-日志复制 Raft算法中译版地址:https://object.redisant.com/doc/raft%E4%B8%AD%E8%AF%91%E7%89%88-2023%E5%B9%B44%E6%9C%8823%E6%97%A5.pdf 英原论文地址:https://raft.github.io/raft.pdf Etcd Assistant 是一款 etcd 可视化管理软件&a…

idea使用 ( 一 ) 安装及初步使用

1.介绍 1.1.什么是 IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面]等工具。简单说就是开发工具,java开发中常用的…

一文读懂数据安全分级分类

目录 为什么要分级分类? 通用数据分级分类框架 数据分类 数据分类的常用方法 数据分类流程 数据分级 数据分级的常用方法 数据定级流程 行业数据安全分级分类指南 金融行业 电信行业 政务数据 健康医疗 企业实践 附录:数据分级分类大合集…

CAD格式交换全能:CAD DLL 15.0 Crack

添加对 SLDASM、FSAT、SAB、SMT、IPT 和 IFC 格式的支持。 2023 年 4 月 25 日 - 16:27 新版本 特征 改进的 3D: 打开 3D 文件时提高了速度。改进了对 SAT、STEP、SLDPRT、X_T、X_B、OBJ 格式的读取。添加了对 SLDASM、FSAT、SAB、SMT、IPT、IFC 格式的支持。添加了…