简单的求导的符号运算算法

本文介绍了使用Python实现简单的符号运算求导算法,包括构建表达式语法树、递归求导、表达式化简和从语法树生成函数。目前算法支持二元运算,后续计划增加对一元函数的支持和中缀表达式输入转换。
摘要由CSDN通过智能技术生成

简单的求导的符号运算算法

最近准备做一个有意思的事情,想实现基于符号运算法则来实现求导的算法。
  现在做出了一个比较简单的雏形,写一篇博客总结一下,顺便介绍一下这个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' (lr)=lr<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值