Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用sympy逐步微分法_Python_Math_Sympy_Calculus_Differentiation - Fatal编程技术网

Python 用sympy逐步微分法

Python 用sympy逐步微分法,python,math,sympy,calculus,differentiation,Python,Math,Sympy,Calculus,Differentiation,我正在尝试制作一个python程序来查找导数和积分,并演示如何进行。到目前为止,我发现有一个积分_steps函数返回使用的步骤,但我还没有找到微分的等价函数 有人知道有没有等效的吗 如果没有,您对如何找到找到导数所需的步骤有何想法?方法1(手动) 看看代码,顶层逻辑就在这里。这只是最重要的部分。从那时起,计算需要计算内部不同节点的导数 表达式树的每个特定节点的逻辑存在于对应于每个特定节点类型的表达式中 这将允许您将代码添加到那些\u eval\u derivative方法中,以便跟踪整个过程并找

我正在尝试制作一个python程序来查找导数和积分,并演示如何进行。到目前为止,我发现有一个积分_steps函数返回使用的步骤,但我还没有找到微分的等价函数

有人知道有没有等效的吗

如果没有,您对如何找到找到导数所需的步骤有何想法?

方法1(手动) 看看代码,顶层逻辑就在这里。这只是最重要的部分。从那时起,计算需要计算内部不同节点的导数

表达式树的每个特定节点的逻辑存在于对应于每个特定节点类型的表达式中

这将允许您将代码添加到那些
\u eval\u derivative
方法中,以便跟踪整个过程并找到所有步骤

方法2(使用示踪剂) Python有多个包。编写者实际上非常好,非常适合这个用例

在许多其他特性中,它允许在函数开始执行时安装某些回调,并在函数返回其值时安装另一个回调。事实上,这正是我们需要的

下面的示例演示了如何使用它(我在Python 3.7.3、SymPy 1.7和hunter 3.3.1上运行并测试了它):

导入猎人
导入系统
从猎人导入Q,何时,停止
亨特·特雷斯(
Q(模块包含=“sympy”,函数=”“eval\u导数”,种类=[“call”,“return”],操作=hunter.CallPrinter(repr\u func=str))
)
从sympy进口*
x=符号('x')
f=1/(x*sin(x)**2)
f、 差异(x)
因此,这允许我们选择要检查的数据结构,如何打印它们,并允许我们查看差异化过程的中间步骤:

[...]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>
似乎有几个
diff
节点的参数等于返回值,我现在不知道如何解释

如果该图以某种方式提到了每个规则的应用位置(我想不出一个简单的方法来做到这一点),那么它可能会更有用

下面是这方面的代码:

导入猎人
导入系统
从hunter导入Q、何时、停止、操作
从hunter.actions导入ColorStreamAction
公式_ltx=r''
\documentclass[border=2pt,varwidth]{letter}
\usepackage{amsmath}
\页面编号{gobble}
\开始{document}
\[\texttt{TITLE}\]
\[公式\]
\结束{document}
'''
# ==============
#==跟踪===
# ==============
从sympy.printing.latex导入LatexPrinter,print_latex,latex
全局调用树根
#用于保存观察到的函数调用的节点对象
#带参数、返回值和函数名
类节点(对象):
定义初始化(self,arg=None,retval=None,func\u name=None):
self.arg=arg
self.retval=retval
self.arg_ascii=“”
self.retval_ascii=“”
self.func\u name=func\u name
self.uid=0
self.children=[]
#这是一个猎人行动,我们建立一个调用图并填充它
#所以我们可以在以后渲染它
#
#CGBAction(调用图生成器操作)
类别CGBAction(ColorStreamAction):
定义初始化(self,*args,**kwargs):
超级(ColorStreamAction,self)。\uuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs)
#自定义调用堆栈
self.tstack=[]
全局调用树根
call_tree_root=Node(arg=”“,func_name=“root”)
self.node_idx=1
self.tstack.append(调用\树\根)
定义调用(自身、事件):
如果event.kind位于['return','call']:
如果event.kind==“return”:
打印(str(event.arg))
如果len(self.tstack)>0:
top=self.tstack.pop()
top.retval=latex(event.arg)
top.retval_ascii=str(event.arg)
elif event.kind==“调用”:
打印(str(event.locals.get('self'))
new=Node()
new.uid=self.node\u idx
new.arg=latex(event.locals.get('self'))
new.arg_ascii=str(event.locals.get('self'))
top=自我。tstack[-1]
self.tstack.append(新)
top.children.append(新)
new.func_name=event.module+“:”+event.function
self.node_idx+=1
亨特·特雷斯(
Q(模块包含=“sympy”、函数中的函数=[“求值导数”、“差分”]、种类中的函数=[“调用”、“返回”]、操作=CGBAction)
)
从sympy进口*
x=符号('x')
f=1/(x*sin(x)**2)
#f=1/(x*3)
#f=sin(exp(cos(x)*asin(x)))
f、 差异(x)
# ============================
#==调用图呈现====
# ============================
导入操作系统
进口稀土
OUT_DIR=“公式”
如果操作系统路径不存在(OUT\u DIR):
os.mkdir(OUT_DIR)
def write_公式(前缀、uid、公式、标题):
TEX=uid+前缀+“.TEX”
PDF=uid+前缀+“.PDF”
PNG=uid+前缀+“.PNG”
TEX_路径=OUT_DIR+“/”+TEX
开放式(TEX_路径,“w”)为f:
ll=公式
ll=ll.替换(“公式”,公式)
ll=ll.替换(“标题”,标题)
f、 写作(ll)
#编译公式
CMD=”“”
cd公式;
pdflatex{TEX};
转换-修剪-密度300{PDF}-质量90-色彩空间RGB{PNG};
“”格式(TEX=TEX,PDF=PDF,PNG=PNG)
操作系统(CMD)
buf_节点=“”
buf_edges=“”
def dfs_树(x):
全局buf_节点,buf_边
arg=(“”如果x.arg不是其他x.arg)
rv=(“”如果x.retval不是其他x.retval)
arg=arg.replace(“\r”和“”)
rv=rv。替换(“\r”,”)
公式=arg+“\\Rightarrow”+rv
打印(x.func_name+“->”+x.arg_ascii+“->”+x.retval_ascii)
x、 func\u name=x.func\u name.replace(“\\”,“\\\”)
写入公式(“,str(x.uid),公式,x.func\u名称)
buf_节点+=“”“
{0}[image=“{0}.png”label=”“];
“”格式(x.uid);
对于x.children中的y:
buf_edges+=“{0}->{1};\n.”格式(x.uid,y.uid);
dfs_树(y)
dfs_树(调用_树_根)
g=开路(输出方向
function_name
argument => return_value
<policy domain="coder" rights="read|write" pattern="PDF" />