简单的求导的符号运算算法
最近准备做一个有意思的事情,想实现基于符号运算法则来实现求导的算法。
现在做出了一个比较简单的雏形,写一篇博客总结一下,顺便介绍一下这个python小项目。
下面的思路和代码片段展现了我的思路,如果有感兴趣的同学应该可以写出实现,如果需要代码可以联系我。因为完整代码里面有很多无聊的提示信息和格式转化,所以我不打算放上来了。
表达式语法树
语法树
语法树是我这个项目里面所有表达式的存在形式,树的一个结点定义如下:
# the class of expression tree
class ExpTree:
def __init__(self, op, args):
self.op = op
self.args = args
前缀表达式转化为语法树
算法比较简单,递归实现表达式解析即可:
# cast a expression string in scheme formation to a expression tree
def expr_to_tree(line):
# cast a expression element list in scheme formation to a expression tree
def expr_list_to_tree(line_list):
del line_list[0]
op = line_list[0]
del line_list[0]
args = []
while True:
if line_list[0] == ')':
del line_list[0]
return ExpTree(op, args)
if line_list[0] == '(':
args.append(expr_list_to_tree(line_list))
else:
args.append(line_list[0])
del line_list[0]
line = line.replace('(', '( ')
line = line.replace(')', ' )')
line_list = line.split()
return simplify(expr_list_to_tree(line_list))
对语法树求导
这里是算法的核心,这个版本只加入了二元运算的法则,一元函数的法则以后会加入。
算法为递归求导,规则如下:
1.叶子结点:x导数为1,常数导数为0。
2.非叶子结点,左右子树为l,r。那么结点的运算来递归求导:
( l + r ) ′ = l ′ + r ′ (l+r)'=l'+r' (l+r)′=l′+r′
( l − r ) ′ = l ′ − r ′ (l-r)'=l'-r' (l−r)′=l′−r<