Seq*_*ens 2 python math sympy calculus differentiation
我正在尝试制作一个 python proram 来查找导数和积分以及展示如何进行。到目前为止,我发现有一个integral_steps函数返回所使用的步骤,但我还没有找到等效的微分函数。
有谁知道是否有等效的?
如果没有,您对如何找到找到导数所需的步骤有什么想法吗?
查看代码,Derivative 类是顶层逻辑所在的地方。这只是顶层部分。从那时起,计算需要计算表达式树内不同节点的导数。
表达式树的每个特定节点的逻辑存在于与每个特定节点类型相对应的_eval_derivative方法中。
这将允许您向这些方法添加代码,_eval_derivative以便跟踪整个过程并找到所有步骤。
Python 有多个跟踪包。python-hunter由@ionelmc编写实际上非常好,并且非常适合这个用例。
在许多其他功能中,它允许在函数开始执行时安装某些回调,并在函数返回其值时安装另一个回调。事实上这正是我们所需要的。
下面是一个展示如何使用它的示例(我在 Python 3.7.3、SymPy 1.7 和 Hunter 3.3.1 上运行并测试了它):
import hunter
import sys
from hunter import Q, When, Stop
hunter.trace(
Q(module_contains="sympy",function='_eval_derivative',kind_in=["call","return"],action=hunter.CallPrinter(repr_func=str))
)
from sympy import *
x = symbols('x')
f = 1/(x * sin(x)**2)
f.diff(x)
Run Code Online (Sandbox Code Playgroud)
因此,这允许我们选择我们想要检查的数据结构,我们想要如何打印它们,并且它允许我们看到微分过程的中间步骤:
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=sin(x)**(-2), s=x)
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=<sympy.core.power.Pow object at 0x7f5925337150>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]ite-packages/sympy/core/function.py:598 call => _eval_derivative(self=sin(x), s=x)
[...]ite-packages/sympy/core/function.py:598 call => _eval_derivative(self=<sympy.functions.elementary.trigonometric.sin object at 0x7f592589ee08>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]ite-packages/sympy/core/function.py:612 return <= _eval_derivative: cos(x)
[...]ite-packages/sympy/core/function.py:612 return <= _eval_derivative: <sympy.functions.elementary.trigonometric.cos object at 0x7f592525fef8>
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: -2*cos(x)/sin(x)**3
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: <sympy.core.mul.Mul object at 0x7f5925259b48>
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=1/x, s=x)
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=<sympy.core.power.Pow object at 0x7f5925337200>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: -1/x**2
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: <sympy.core.mul.Mul object at 0x7f5925259f10>
Run Code Online (Sandbox Code Playgroud)
如果您还想涵盖该diff功能,您可以更改上面的代码并拥有function_in=['_eval_derivative','diff']. 这样,你不仅可以查看部分结果,还可以查看函数的调用diff及其返回值。
使用 graphviz、latex 和跟踪器(同样是python-hunter),您实际上可以更清楚地看到调用图。渲染每个中间步骤的所有公式确实需要一些时间,因为pdflatex正在使用(我确信乳胶有更快的渲染器)。
每个节点的值采用以下格式:
function_name
argument => return_value
Run Code Online (Sandbox Code Playgroud)
好像有几个diff节点的参数等于返回值,我目前不确定如何解释。
如果该图以某种方式提到了每个规则的应用位置(我想不出一个简单的方法来做到这一点),那么它可能会更有用。
这也是代码:
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=sin(x)**(-2), s=x)
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=<sympy.core.power.Pow object at 0x7f5925337150>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]ite-packages/sympy/core/function.py:598 call => _eval_derivative(self=sin(x), s=x)
[...]ite-packages/sympy/core/function.py:598 call => _eval_derivative(self=<sympy.functions.elementary.trigonometric.sin object at 0x7f592589ee08>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]ite-packages/sympy/core/function.py:612 return <= _eval_derivative: cos(x)
[...]ite-packages/sympy/core/function.py:612 return <= _eval_derivative: <sympy.functions.elementary.trigonometric.cos object at 0x7f592525fef8>
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: -2*cos(x)/sin(x)**3
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: <sympy.core.mul.Mul object at 0x7f5925259b48>
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=1/x, s=x)
[...]7/site-packages/sympy/core/power.py:1267 call => _eval_derivative(self=<sympy.core.power.Pow object at 0x7f5925337200>, s=<sympy.core.symbol.Symbol object at 0x7f5925b6a2b0>)
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: -1/x**2
[...]7/site-packages/sympy/core/power.py:1271 return <= _eval_derivative: <sympy.core.mul.Mul object at 0x7f5925259f10>
Run Code Online (Sandbox Code Playgroud)
我认为剩下的一步是将中间节点从 SymPy 映射到微分规则。以下是我能够绘制的一些内容:
我还没有看到 Fraction 类,所以商规则sympy.core可能是通过乘积规则和广义幂规则间接处理的间接处理的。
为了让它运行,你需要:
function_name
argument => return_value
Run Code Online (Sandbox Code Playgroud)
/etc/ImageMagick-6/policy.xml并且必须使用以下行更新该文件以允许从以下位置进行转换PDF->PNG:
<policy domain="coder" rights="read|write" pattern="PDF" />
Run Code Online (Sandbox Code Playgroud)
还有另一个称为jonga的调用图库,但它有点通用,并且不允许完全过滤掉不需要的调用。