| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> gitmodel学习笔记(一):利用sympy分析高等数学 -> 正文阅读 |
|
[Python知识库]gitmodel学习笔记(一):利用sympy分析高等数学 |
引言本篇是在复习到中途参加的一个关于gitmodel的学习活动,本系列分为三个部分,分别为高等数学、线性代数以及概率论与数理统计。本篇为第一篇——利用sympy分析高等数学,看完活动文档,查找了相关资料后,汇成笔记在这里记录一下。 sympy包介绍sympy包相当于让python具备了MATLAB与mathematica相同的解部分数学问题的能力,但是也只是能初步解决一些并不复杂的例子,而且因为还是依赖于python的输出终端,感觉output打印出来的结果没有经过太多美化,不如mathematica足够赏心悦目,但至少还是可以学一学了解一下的。SymPy具有的主要方法为:
下面我就针对上述能力进行简单举例。 解线性方程组解方程组: { 2 x ? y = 3 , ( 1 ) 3 x + y = 7 , ( 2 ) \left\{\begin{array}{l}2 x-y=3,(1) \\ 3 x+y=7,(2) \end{array}\right. {2x?y=3,(1)3x+y=7,(2)? 那么我们可以使用sympy包进行解方程组,跟MATLAB的步骤差不多,首先是定义符号:
然后使用solve函数,第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数。还有一些其他的参数,想了解的可以去看官方文档:https://docs.sympy.org/latest/index.html,完整代码为:
关于solve函数,与MATLAB中用法基本一致,MATLAB中为:
求极限与微积分求极限: 直接写出代码为:
这里需要解释一下结果中出现的符号:
还有很多数学符号比如,log取对数,exp是e的指数次幂等等,可以去官方文档查看,这里不再概述。可以参考 python之sympy库–数学符号计算与绘图必备 中的表格,我顺带小修了一下,改成如下形式:
另外可以使用init_printing()来使我们的输出更美观,也可直接用pprint()函数,但是美化后的感觉,一言难尽,可能有相关适用场景:
既然有美化的功能,那自然就有画图,sympy中自带了plotting,在jupyter lab中,调用plotting使用show方法即可展示图像,它的底层我看了一下,好像是走的matplotlib中的show()方法,其自动被调用,代码为:
求定积分: 关于定积分,根据上述表格的调用函数,为
解本题的过程为先对
f
(
x
)
f(x)
f(x)进行换元: 再对
∫
f
(
x
)
\int f(x)
∫f(x)进行积分,为: 最后交换积分次序: 解微分方程求
y
′
=
2
x
y
y^{'}=2xy
y′=2xy的通解。这里先给出过程: 两边积分为: 结题代码为:
dsolve函数的用法为 这里我们可以用pprint美化方程表示形式,为:
这算是方程的一个中间态,但显示效果就,仁者见仁智者见智了。 简化矩阵( x 1 , x 2 , x 3 ) ( a 11 a 12 a 13 a 12 a 22 a 23 a 13 a 23 a 33 ) ( x 1 x 2 x 3 ) . \left(x_{1}, x_{2}, x_{3}\right)\left(\begin{array}{lll} a_{11} & a_{12} & a_{13} \\ a_{12} & a_{22} & a_{23} \\ a_{13} & a_{23} & a_{33} \end{array}\right)\left(\begin{array}{l} x_{1} \\ x_{2} \\ x_{3} \end{array}\right) . (x1?,x2?,x3?)???a11?a12?a13??a12?a22?a23??a13?a23?a33????????x1?x2?x3?????. 我感觉这个功能,跟上面这些功能比,用到概率非常小,因为numpy的能力足够丰富和完整,这里只介绍两个demo,感兴趣的话,可以进官网看该部分的内容,链接为:https://docs.sympy.org/latest/tutorial/matrices.html gitmodel学习笔记一元函数求极值
根据高数中第二章导数应用里面,就有关于极值的定义,我写到这里的时候就不翻书了,直接按百度百科的通俗定义为:
笔记中有一张图可以很好的解释其几何定义与必要条件,即一阶导(驻点)为0,而二阶导小于0 或 大于0. 代码如下:
然后对此式求驻点,为:
计算二阶导数,求出驻点的二阶导数值,验证正负:
因为 f ′ ′ ( x ) f^{''}(x) f′′(x)二阶导的驻点值大于0,则 x = 5000 x=5000 x=5000为极小值点,带回原来的式子,求出极小值为:
经验证 , , , n 0 = 5000 n_0=5000 n0?=5000 确实为 C  ̄ ( n ) \overline{C}(n) C(n) 的极小值点 , , , 即第一批 GitNum 生产台数计划为 5000 5000 5000 台时平均成本最小 , , , 为 1250 1250 1250 元/台. 在建模中 , , , 优化问题是渗透到各个方面的 , , , 小到最优参数的确定 , , , 大到最优策略的规划. 每一个优化问题都可以以如下标准形式给出 :
max
?
f
(
x
)
s
.
t
.
{
g
i
(
x
)
?
0
,
i
=
1
,
2
,
?
?
,
n
h
j
(
x
)
=
0
,
j
=
1
,
2
,
?
?
,
m
\max f(x) \\ \mathrm{s.t.} \begin{cases} g_i(x)\geqslant 0,i=1,2,\cdots,n\\ h_j(x)=0,j=1,2,\cdots,m \end{cases}
maxf(x)s.t.{gi?(x)?0,i=1,2,?,nhj?(x)=0,j=1,2,?,m? 上文提到的GitNum生产台数问题即为一个最简单的无约束优化问题——目标函数有明确表达式,二阶以上可导,定义域离散程度不高. 往往生产一批产品的数量范围是足够大的以至于我们可以将离散的整数视为连续的. 对于这样的简单优化问题 , , , 利用数学分析的知识可以做到精确的分析. 二(多)元函数求极值现实中的问题往往可能非单个变量,参数与变量可能是多次,与多元的,这个过程是由以上的点线关系,变为了线面判定: 正如上图所示,想要判断临界点是极大值还是极小值,最直观的方式当然是作图,但是二元函数通常很难作图,更多元的函数甚至无法作图,这就需要使用更高级的方法,这将涉及到海森矩阵,上述表格中的
?
f
(
x
)
\nabla f(x)
?f(x)即为Hesse矩阵的代号表示,它完整的数学式为: 其中, f f f 是对变量 x i x_i xi? 方向的偏导数为 f i ′ , f'_i, fi′?, 称所有偏导数组成的列向量 [ f 1 ′ , f 2 ′ , ? ? , f n ′ ] T : = ? f , [f_1',f_2',\cdots,f_n']^T := \nabla f, [f1′?,f2′?,?,fn′?]T:=?f, 为函数 f f f 的全导数 , , , 亦称梯度. 这里就会有两个条件,一个是必要条件,一个是充分条件,分别为: 多元无约束问题二阶最优化必要条件: 其中 ? 2 f \nabla^2 f ?2f 是 f f f 的 Hesse 矩阵. 多元无约束问题二阶最优化充分条件: 则 x ? x^* x? 是 f f f 的极大 ( ( (小 ) ) )值点. 而代数学的知识告诉我们,验证一个对称矩阵是否正(负)定只需要 check 其所有特征值是否大(小)于0.上述理论给出的一个事实是:不管函数 f f f 表达式复杂与否 , , , 只要二阶以上可导 , , , 我们只需要找出满足 Hesse 矩阵 ? 2 f \nabla ^2f ?2f 半负定 ( ( (半正定 ) ) )的梯度零点 , , , 极大 ( ( (小 ) ) )值点必定存在其中! 梯度下降与牛顿法但从实际操作上,不论是依据条件去判定海森矩阵,亦或者根据高数里提到的关于二元函数的定义去求,其实相对来讲,如果超越2元以上,解都是相对来说很麻烦的,所以出现了依靠计算机来求近似解的——梯度下降法,牛顿法。 这里主要介绍一下
关于minimize这个api,help(minimize)下可以看见这个函数的详细说明,因为源码里提到的注释非常长,这里只提到我这里会出现的问题。
更详细的可以去官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html 它里面对Unconstrained minimization的一些算法,比如说BFGS等做了相应的说明,即这个关键字代表着什么算法。这里面自然有梯度下降和牛顿法的一些变式,而关于这两种算法的简要定义与推导,可以看我之前写的一篇博客: 关于梯度下降,很多机器学习与深度学习算法都将它封装得比较好,大部分只需要调用一个api即可,上述博文中也从零实现,写得很详细了,而可能只有牛顿法使用的不多,其实它本身也是用的嗨森矩阵与泰勒展开,具体的可以查查其它资料,这里不再引述,代码推导方面,给出我看到的感觉挺好理解的两篇博文: 【python】牛顿迭代法求解多元函数的最小值–以二元函数为例 第一篇完全从解例题的过程考虑,没有经过什么修饰,第二篇相当于在此基础进行了封装,两篇都挺利于理解得。 以插值知识解决数据处理问题这里基本上不怎么涉及sympy了,因为有另外的包专门处理这类问题——
在高中我们就已经学过了给定一组数据点可通过最小二乘法来拟合出一条回归直线 , , , 诚然 , , , 两点一直线的数学直觉告诉我们能过 24 24 24 个数据点的直线几乎不存在 , , , 那么我们可否放宽条件 , , , 构造出过 24 24 24 个数据点的折线呢? 这显然是可以的! 过数据点的条件可由分段函数来解决. 用数学的语言 , , , 即是分别在每一个区间 [ t i , t i + 1 ] , i = 1 , 2 , ? ? , 23 [t_i,t_{i+1}],i=1,2,\cdots,23 [ti?,ti+1?],i=1,2,?,23 上以 ( t i , s i ) , ( t i + 1 , s i + 1 ) (t_i,s_i),(t_{i+1},s_{i+1}) (ti?,si?),(ti+1?,si+1?) 为两端构造线段 s i ( t ) = k i t + b i , t ∈ [ t i , t i + 1 ] , i = 1 , 2 , ? ? , 23 , s_{i}(t)=k_it+b_i,t\in [t_i,t_{i+1}],i=1,2,\cdots,23, si?(t)=ki?t+bi?,t∈[ti?,ti+1?],i=1,2,?,23, 其中 k i , b i k_i,b_i ki?,bi? 为参数 , , , 但确定 k i , b i k_i,b_i ki?,bi? 对我们来说也是小菜一碟的. 具体构造如下图 : 对比 s ( t ) s(t) s(t) 要满足的条件 , , , 折线的构造方式显然满足了前两个条件 , , , 我们再结合上图进行思考 : 折线不满足 s ′ ( t ) s'(t) s′(t) 连续是因为在数据点 ( t i , s i ) (t_i,s_i) (ti?,si?) 处不一定可导 , , , 即左右导数不相同 , , , 以此反推 , , , 我们希望构造出来的分段函数 s i ( t ) s_i(t) si?(t) 们在 " " "连接处 " ( t i , s i ) , ( t i + 1 , s i + 1 ) "(t_{i},s_i),(t_{i+1},s_{i+1}) "(ti?,si?),(ti+1?,si+1?) 都应该有导数以及二阶导数相等. 现在 , , , 我们正式将条件写为数学形式 : 过点 :
s
i
(
t
i
)
=
s
i
,
i
=
1
,
2
,
?
?
,
23
,
s
23
(
t
24
)
=
s
24
s_{i}\left(t_{i}\right)=s_{i}, i=1,2, \cdots, 23, s_{23}\left(t_{24}\right)=s_{24}
si?(ti?)=si?,i=1,2,?,23,s23?(t24?)=s24? 那么,既然折线即分段一次函数不满足导数相等,从求导的难度上我们自然会考虑分段二次函数怎么样呢? Unfortunately 分段二次函数满足了导数相等但二阶导数不相等,而按图索骥我们即知道分段三次函数即能满足我们对 s ( t ) s(t) s(t) 的所有期待,即: 分段直线构造
→
\rightarrow
→ 解决
s
(
t
)
s(t)
s(t) 过 24 个数据点且连续 构造出来的分段三次曲线如下: 这里建议用scipy进行解题,虽然说根据我查询到的资料sympy也可以,但是api并没有scipy那么好用,比如说下面的demo。 scipy的单变量插值: 在一维插值中,点是针对单个曲线拟合的,而在样条插值中,点是针对使用多项式分段定义的函数拟合的。 单变量插值使用 UnivariateSpline() 函数,该函数接受 xs 和 ys 并生成一个可调用函数,该函数可以用新的 xs 调用。
sympy三次样条插值: 在sympy中,有一个内置方法,为
插值一般依照实际情况选择到底做哪种,过度选用高阶的插值,其实就跟泰勒公式一样,前面的低次已经有着很高贡献率,后面的可能是锦上添花,但也可能是负反馈。这也是更推荐scipy包做相关算法,因为它的选择多,并且内部封装得很完整,关于,插值,还有其它的一些插值方法为: 积分应用
这题涉及曲面积分,目前我不是太了解,另外感觉时间有点晚了,详细的推导过程可以看gitmodel源文件,我也就不加入自己的理解,直接得到铁链的总质量计算式为: 解此题的代码为:
referencehttps://gitee.com/gitmodel/init-modeling?_from=gitee_search |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 11:50:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |