python中计算梯度值

在python中,有关函数梯度的计算方法均在python库sympy的vector包里,要想实现梯度计算首先要从vector包里导入两个类,分别是:CoordSys3D和Del.
CoordSys3D类的方法主要是构建一个三维标量坐标系,而不是矢量坐标系,我们需要将函数变量通过CoordSys3D的实例化对象映射到三维标量坐标系中。而Del类中包含gradient()即计算函数梯度的方法。具体应用实例如下:
在这里插入图片描述
这里关于类CoordSys3D的构造函数的参数有很多,有很多不常用的参数建议等到用的时候再去了解。构造函数源代码如下:

__init__(self, name, location=None, rotation_matrix=None, parent=None, vector_names=None, variable_names=None, latex_vects=None, pretty_vects=None, latex_scalars=None, pretty_scalars=None, transformation=None)

最常用的是name参数,即给实例化的CoordSys3D对象起一个新名字。
下面是Del类中gradient()方法的参数说明:

gradient(self, scalar_field, doit=False)
 |      Returns the gradient of the given scalar field, as a
 |      Vector instance.
 |      
 |      Parameters
 |      ==========
 |      
 |      scalar_field : SymPy expression
 |          The scalar field to calculate the gradient of.
 |      
 |      doit : bool
 |          If True, the result is returned after calling .doit() on
 |          each component. Else, the returned expression contains
 |          Derivative instances

函数作用是返回给定标量场的梯度,参数scalar_field必须是sympy表达式,参数doit是布尔值,默认情况下是False。如果为True,则在调用.doit()后返回结果每个组件。否则,返回的表达式包含导数实例。其中doit()方法的官方解释如下:

doit(self, **hints)
 |      Evaluate objects that are not evaluated by default like limits,
 |      integrals, sums and products. All objects of this kind will be
 |      evaluated recursively, unless some species were excluded via 'hints'
 |      or unless the 'deep' hint was set to 'False'.

即在默认情况下,像极限、积分、和积等数学运算对象都是不进行计算的。这些对象一般都是通过递归进行计算,除非某些东西通过“hint”参数被排除在外又或者除非“deep”关键字被设为“False”,才能计算出这些默认情况下不进行计算的对象。
例如下面的求2乘以x的不定积分:
在这里插入图片描述
显然,对于前半部分求解梯度的过程中,我们并没有调用doit()方法也没有将gradient()函数中参数doit设置为True,所以最后得的梯度结果包含导数实例,即在默认情况下不进行计算。如果我们使用两者中的任意一个方法都能求解出梯度值:
在这里插入图片描述
在这里插入图片描述

发布了81 篇原创文章 · 获赞 22 · 访问量 7706

猜你喜欢

转载自blog.csdn.net/qq_38883271/article/details/103423409
今日推荐