用了两天的时间搞出了一个求导计算器

大家在做高数题的时候很多都需要用到导数

虽然求导很简单,但是很费脑细胞

所以我有了一个大胆的想法

教我的电脑学习函数求导~

话不多说,开干!!


求导计算器的整体思路:(主要是递归思想)

  1. 首先定义一个表达式的类作为父类(也就是主程序主要调用的类)
  2. 定义常量和变量类
  3. 定义运算类(加、减、乘、除、取反、取对数、取幂、等等)
  4. 定义三角函数类(正弦、余弦、正切、余切)
  5. 在指定的类中定义求导方法
  6. 函数调用

  1. 定义表达式类
class Expr:

    def __init__(self):
        pass
    
    def eval(self, **values):
        pass
    
    def simplify(self):
        return self
    
    def __repr__(self):
        return str(self.value)

其中

  • eval是表达式方法
  • simplify方法是简化求导后输出的公式
  1. 在表达式类中添加内置方法(加法、减法、乘法等)以加法为例
    def __add__(self, other):
        return Add(self,to_expr(other)).simplify()
    
    def __radd__(self,other):
        return Add(to_expr(other),self).simplify()

其中 Add是定义的加法类
to_expr()方法是将当前输入的字符的类型转换成表达式的类型,代码如下:

def to_expr(value):
    if isinstance(value,Expr):
        return value
    elif type(value) in (float, int):
        return Const(value)
    else:
        raise Exception("Can't not convert into expr")
  1. 当内置函数添加完毕后,就开始实现常量和变量的类
    (1)常量
class Const(Expr):

    def __init__(self,value):
        self.value = value
   
    def eval(self, **values):
        return self.value
    
    def __repr__(self):
        return str(self.value)
  
    def deriv(self,x):
        return Const(0)

其中 deriv是求导的方法,因为常数项求导的结果为0所以返回的结果应该是0,但要注意类型
(2)变量

class Variable(Expr):

    def __init__(self,name):
        self.name = name
    
    def eval(self, **values):
        if self.name in values:
            return values[self.name]
        raise Exception(f'Variable {self.name} is not exit')
    
    def __repr__(self):
        return self.name
    
    def deriv(self,x):
        name = _get_name(x)
        return Const(1 if name == self.name else 0)

变量的定义和常量的定义是比较相似的,主要不同就是求导功能的实现
如果当前的函数名称是需要求导的则返回常量1(因为x的导数为1)
如果当前的函数名称不是需要求导的则返回常量0(比如y=x+z对z求偏导,x就为0咯~)

  1. 定义完了表达式类、常量类、变量类后,就开始定义运算类了(以加法类为例)
class Add(Expr):

    #----------------------------------------------------------------------
    def __init__(self, left, right):
        self.left = left
        self.right = right
        
    #----------------------------------------------------------------------
    def eval(self,**values):
        return self.left.eval(**values) + self.right.eval(**values)
        
    #----------------------------------------------------------------------
    def __repr__(self):
        return f"({self.left}+{self.right})"
    
    #----------------------------------------------------------------------
    def simplify(self):
        """简化表达式"""
        left, right = self.left,self.right
        if isinstance(left, Const):
            if left.value == 0:
                return right
            if isinstance(right, Const):
                return Const(left.value + right.value)
        elif isinstance(right, Const) and right.value == 0:
            return left
        return self
    
    #----------------------------------------------------------------------
    def deriv(self,x):
        """"""
        return self.left.deriv(x) + self.right.deriv(x)

对于相加类来说,主要关注的是求导的实现
两个函数相加的求导等于各自求导的相加
同时还有simplify的类就是将实现的表达式进行简化(不然一大串~~)
当我还定义了减、乘、除、取反、取对数、取幂、正弦、余弦、正切、余切、以及反三角函数的类
(原理类似,就不一一列举了)

  1. 最后就是函数的运行结果
    在这里插入图片描述
    总结:求导计算器基本覆盖了高等数学中所能用到的求导函数,
    唯一的不足就是函数不能自动的进行表达式的最简化求解,以后我在慢慢教电脑吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值