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

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

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

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

话不多说,开干!!


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

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

  1. 定义表达式类
class Expr:def __init__(self):passdef eval(self, **values):passdef simplify(self):return selfdef __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 valueelif 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 = valuedef eval(self, **values):return self.valuedef __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 = namedef 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.namedef 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 = leftself.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.rightif isinstance(left, Const):if left.value == 0:return rightif isinstance(right, Const):return Const(left.value + right.value)elif isinstance(right, Const) and right.value == 0:return leftreturn self#----------------------------------------------------------------------def deriv(self,x):""""""return self.left.deriv(x) + self.right.deriv(x)

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

  1. 最后就是函数的运行结果

    总结:求导计算器基本覆盖了高等数学中所能用到的求导函数,
    唯一的不足就是函数不能自动的进行表达式的最简化求解,以后我在慢慢教电脑吧。

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

  1. 用numpy、PyTorch自动求导、torch.nn库实现两层神经网络

    用numpy.PyTorch自动求导.torch.nn库实现两层神经网络 1 用numpy实现两层神经网络 2 用PyTorch自动求导实现两层神经网络 2.1 手动求导 2.2 gradient自动 ...

  2. 如何在python中找到两个日期时间对象之间的时差?

    本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...

  3. 拼字符串成为时间,和两个计算时间点的中间值

    拼字符串成为时间,和两个计算时间点的中间值 select convert(datetime,'2016-09-18 '+SUBSTRING(CONVERT(varchar(100),d_bdate, ...

  4. 快两年的时间,我都干了啥

    ‍‍ ‍‍大家好,我是写代码的篮球球痴 这是一篇总结性的文章,主要是总结这一年多快两年的时间,我都在做了些什么. 公司名字我就不说了,知道的人一眼就知道了. 我们是一家智能家居的公司. 提到智能家居, ...

  5. imageJ把两张图片在时间轴上进行合并

    imageJ把两张图片在时间轴上进行合并 方案1: 1.把单张图片都放在一个文件夹中: 2.把文件夹拖到imageJ中: 3.点击确定,自动完成了合并 定,自动完成了合并 方案2: https://b ...

  6. 想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗

    背景: 汇总了下老王在其他平台的原创回复,欢迎关注老王原创公众号[软件老王],关注不迷路! 1.想在深圳自己花一两万块钱速学互联网行业,大概花两三个月的时间,出来好找工作吗? 老王观点: 评论区很多留 ...

  7. vue - 比较两个日期大小、比较同一天两个时间大小(判断两个日期时间的大小)JS 解决方法

    介绍 vue项目中,可能需要对比两个日期时间的大小,如下代码所示: 2018-8-12 12:30 | 2018-8-12 02:30 它们谁大? 比较两个日期大小 方法一: //比较两个日期大小.格 ...

  8. java两个时间相差分钟_Java计算两个日期时间相差几天,几小时,几分钟等

    展开全部 思路是先计算两个62616964757a686964616fe59b9ee7ad9431333365666264日期相差的毫秒数,然后分别根据每天的毫秒数.每小时的毫秒数.每分钟的毫秒数来计 ...

  9. js计算两个时间是否大于一个月

    转载自 miskss /*** 获取某年某月的总天数* @param {Number} year 获取天数的年份* @param {Number} month 获取天数的月份* @returns {N ...

最新文章

  1. java中char占的二进制,java数据类型与二进制详细介绍
  2. [Phonegap+Sencha Touch] 移动开发18 Sencha Touch项目通过phonegap打包后的程序名字的问题...
  3. travis-ci中的checkpatch工具使用
  4. ITK:计算两个图像之间的均方度量值
  5. 属性总结(一):marker
  6. NOIP练习赛题目6
  7. Apache POI导出Excel
  8. VCSA 6.7 U3部署(vCenter Server Appliance(VCSA)6.7 U3部署指南)
  9. UnityShader20.1:CommandBuffer初见(下)
  10. Cmake构建_选择debug与release的库
  11. [HDU3756]Dome of Circus
  12. python 穷举法 算24点(史上最简短代码)
  13. 专门感染word文件的计算机病毒是什么,计算机病毒分类及详细介绍.doc
  14. 关于微信小程序下拉刷新、上拉触底方法的实现
  15. R语言绘制校正协变量后的ROC曲线
  16. 安装MySQL过程中,出现“Staring the server”错误的解决方法
  17. 回望2019,互联网产品发展只剩焦虑?
  18. uClinux on Blackfin BF533 STAMP - A DSP Linux Port
  19. 机器学习实战(11)——初识人工神经网络
  20. 微信小程序点击按钮弹出弹窗_微信小程序带图片弹窗简单实现

热门文章

  1. ArcGIS基础实验操作100例--实验60三维模型转体模型
  2. 为什么开源可以提高程序员的编程技能?
  3. 电商进入“后补贴时代”,为什么玩家集体做起长期投入?
  4. 教练式管理工具与技术(附58页课件下载)
  5. 解析摄影测量之单像空间后方交会(MATLAB)
  6. 计算机主机怎么装系统,计算机系统安装 如何一键安装系统
  7. 头歌实践教学平台:Java面向对象 - 封装、继承和多态
  8. IA32汇编语言 —— 贪吃蛇游戏
  9. javascript性能优化-repaint和reflow
  10. 轻量型注意力模块:ULSAM