F#表达式求导

简介: 用F#实现一个简单的表达式求导推理: diff(sin(x^3-x)) => cos(x^3-x) * (3*x^2-1)

     Matlab可以对数学公式进行求导操作,这里用F#实现一个简单的表达式求导推理。首先还是定义一个自定义的Expr数据类型:

typeExpr=|CstFoffloat|Varofstring|AddofExpr*Expr// +|SubofExpr*Expr// -|MulofExpr*Expr// *|DivofExpr*Expr// / |PowofExpr*Expr// ^ |SinofExpr|CosofExpr|NegofExpr

  定义一个递归的求导函数diff,由于求导的规则比较多,这里就简单的实现几个场景的求导公式:

letrecdiffe=matchewith|CstFf->CstF0.0|Varx->CstF1.0|Add(CstFa, Varx)   ->CstF1.0|Add(e1, e2)  ->Add(diffe1, diffe2)
|Sub(e1, e2)  ->Sub(diffe1, diffe2)
|Mul(CstFa, Varx) ->CstFa|Mul(e1, e2) ->Mul(diffe1, diffe2)
|Pow(Varx,CstFa) ->Mul(CstFa,Pow(Varx,CstF (a-1.)))
|Pow(e1,e2)  ->Mul(e2,Pow(e1, Sub(e2,CstF1.)))
|Sin(e1)  ->Mul(Cos(e1),diffe1)
|Cos(e1)  ->Mul(Neg(Sin(e1)),diffe1)
|Neg(e1)  ->Neg(diffe1)
|e->e ;;

  为了更到的输出DSL到控制台,定义一个打印表达式的函数:

letrecprintExpr2e=matchewith|CstFf->stringf|Varx->x|Add(e1 , e2) ->"("+ (printExpr2e1) +"+"+ (printExpr2e2) +")"|Sub(e1 , e2) ->"("+ (printExpr2e1) +"-"+ (printExpr2e2) +")"|Mul(e1 , e2) ->"("+ (printExpr2e1) +"*"+ (printExpr2e2) +")"|Div(e1 , e2) ->"("+ (printExpr2e1) +"/"+ (printExpr2e2) +")"|Pow(e1 , e2) ->"("+ (printExpr2e1) +"^"+ (printExpr2e2) +")"|Sin(e1) ->"sin("+ (printExpr2e1) +")"|Cos(e1) ->"cos("+ (printExpr2e1) +")"|Neg(e1) ->"-("+ (printExpr2e1) +")"|_->failwith"unknown operation";;

   严格来讲,每个操作的前后用()进行分组应该更加严谨,但是过多的()嵌套会让数学表达式不容易理解。但,关于括号的嵌套化简问题,还需要一定的工作才能工作,这里先不进行处理。下面定义一个求导示例:

lete1=Sin(Sub(Pow(Var"x", CstF3.0), Var"x")) ;; 
lete2=diffe1;;
printExpr2e2;;

 执行如上代码,则输出如下图所示:

1628574321590046518.jpg

这与网上的求导工具(https://zh.numberempire.com/derivativecalculator.php)求出的一致:

1628574321590046518.jpg

相关文章
|
3月前
|
测试技术
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
|
5月前
|
存储 Serverless C语言
『C/C++』Eg3:多项式求值
『C/C++』Eg3:多项式求值
|
7月前
卡诺图化简法的介绍
卡诺图化简法:从真值表到逻辑电路设计 一、引言(100字) 卡诺图化简法是一种常用的布尔代数化简方法,可以将复杂的逻辑电路简化为更简单的形式。本文将介绍卡诺图化简法的基本原理、应用技巧和实际案例,以帮助读者更好地理解和应用该方法。 二、卡诺图化简法的基本原理(200字) 卡诺图是一种二维表格,用于表示布尔代数中的逻辑函数。卡诺图的每个格子代表一个输入变量的取值组合,而格子内的数值则表示该输入变量组合下逻辑函数的输出值。通过卡诺图的排列和组合,可以找到逻辑函数的最简形式,并设计对应的逻辑电路。 卡诺图化简法的基本原理是利用逻辑函数的真值表,将相邻的1合并成更大的1组,从而找到最简的逻辑表达
126 0
|
10月前
1238:一元三次方程求解 2020-12-27
1238:一元三次方程求解 2020-12-27
|
11月前
|
算法
求二元二次方程的解
求二元二次方程的解
168 0
二元函数偏导数的几何意义
二元函数偏导数的几何意义
|
Python
列表解析(推导)
列表解析(推导)
64 0
|
存储 人工智能 Serverless
6-2 多项式求值 (15 分)
6-2 多项式求值 (15 分)
103 0
|
自然语言处理 索引
一种快速的复杂逻辑表达式求取方法
背景最简单的逻辑表达式求取方法是求取所有每个子表达式的值,然后再带入复杂逻辑表达式依次计算得到最终结果,时间复杂度较高。简单的“或运算”和“与运算”,以短路方式实现,不需要计算所有的子表达式的值,计算效率较高。但是,以“或运算”、“与运算”、“否运算”和“嵌套运算”等子表达式组成的复杂逻辑表达式,不能简单的套用短路运算。本专利,通过“构建逻辑表达式树”及“逐级向上触发树节点”的方式,实现了一种快速
一种快速的复杂逻辑表达式求取方法