Math 导数计算器

Math 导数计算器,math,calculator,derivative,differentiation,Math,Calculator,Derivative,Differentiation,我对建立一个导数计算器感兴趣。我为解决这个问题绞尽脑汁,但根本没有找到正确的解决办法。你能告诉我怎么开始吗?谢谢 对不起!很明显,我想进行象征性的区分 假设函数f(x)=x^3+2x^2+x 我想显示导数,在这种情况下f'(x)=3x^2+4x+1 我想在iPhone的objective-c中实现它。我假设您试图找到函数的精确导数。(符号分化) 您需要解析数学表达式,并将函数中的各个操作存储在树结构中 例如,x+sin²(x)将被存储为+操作,应用于x的表达式和sin(x)和2的^求幂)操作 然

我对建立一个导数计算器感兴趣。我为解决这个问题绞尽脑汁,但根本没有找到正确的解决办法。你能告诉我怎么开始吗?谢谢

对不起!很明显,我想进行象征性的区分

假设函数f(x)=x^3+2x^2+x

我想显示导数,在这种情况下f'(x)=3x^2+4x+1


我想在iPhone的objective-c中实现它。

我假设您试图找到函数的精确导数。(符号分化)

您需要解析数学表达式,并将函数中的各个操作存储在树结构中

例如,
x+sin²(x)
将被存储为
+
操作,应用于
x
的表达式和
sin(x)
2
^
求幂)操作


然后,您可以通过将微分规则应用于每个节点来递归地区分树。例如,
+
节点将成为
u'+v'
,而
*
节点将成为
uv'+vu'

您需要记住您的演算。基本上你需要两样东西:基本函数的导数表和如何推导复合表达式的规则(比如
d(f+g)/dx=df/dx+dg/dx
)。然后使用表达式解析器,递归地转到另一棵树。()

对于什么类型的运算,您希望计算导数?如果允许使用正弦、余弦和切线等三角函数,这些函数最好存储在表中,而其他函数(如多项式)可能更容易实现。您是否允许函数具有多个输入,例如f(x,y)而不仅仅是f(x)

单变量中的多项式是我的建议,然后考虑增加三角函数、对数函数、指数函数和其他高级函数来计算可能比较难做的导数。

< P>将字符串解析成一个(即使这通常是在LISP上下文中进行的,但在几乎任何语言中都可以做一个等价的事情)。,使用lex/yacc或等效工具最简单,然后编写一个递归“派生”函数。在OCaml-ish方言中,类似于:

let rec derive var = function
    | Const(_) -> Const(0)
    | Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var))
    | Add(x, y) -> Add(derive var x, derive var y)
    | Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b))
    ...
(如果您不知道OCaml语法-
derivate
是两个参数的递归函数,第一个参数是变量名,第二个参数在连续的行中进行匹配;例如,如果此参数是形式为
Add(x,y)的结构)
,返回由两个字段构建的结构
Add
,值分别为派生
x
和派生
y
;对于其他情况,派生
可能会作为参数接收到的内容也是如此;
第一个模式中的
表示“匹配任何内容”)

在此之后,您可能有一些清理函数来整理结果表达式(减少分数等),但这会变得复杂,并且对于派生本身来说不是必需的(即,没有它的情况下得到的仍然是正确的答案)


完成s-exp的转换后,再次使用递归函数将结果s-exp转换为字符串形式,该函数已描述了符号微分过程。我只想补充几点:

  • 符号数学主要是解析和树转换。ANTLR对于这两个方面都是一个很好的工具。我建议从这本好书开始
  • 有一些开源程序可以满足您的需要(例如Maxima)。剖析这样一个程序可能也很有趣(但如果您首先尝试自己编写,可能更容易理解发生了什么)
  • 也许,您还需要对输出进行某种简化。例如,仅将基本派生规则应用于表达式
    2*x
    将产生
    2+0*x
    。这也可以通过树处理完成(例如,通过将
    0*[…]
    转换为
    0
    […]+0
    转换为
    […]
    等等)

普通函数(+、-、*、/、^、sin、cos等)上的符号微分很容易忽略函数或其导数未定义的区域。困难的是,也许与直觉相反,在事后简化结果


要进行微分,请将运算存储在树中(甚至只存储在波兰语表示法中),并制作每个基本运算的导数表。然后重复应用链式规则和基本导数,同时将常数的导数设置为0。这是一种快速且易于实现的方法。

您到底想做什么?符号微分?数值微分很简单。符号化显然更为复杂,但如果不要求简化输出,则很容易实现。@Andreas数值微分非常困难。如果你的意思是通过在附近点对函数进行采样来计算导数的近似值,至少是这样。这些点应该有多近?你怎么知道你是在测量“真实”值,而不是简单地测量数值误差?你的意图是最终评估你要区分的函数吗?或者您的目标纯粹是生成一个符号表达式?有些人不知道其他精确微分技术,他们说他们想要符号微分,而他们的最终目标是使用符号导数来计算数值。@Andreas:我不必担心他是火箭工程师;他只需要编写一些火箭工程师在没有真正理解的情况下决定使用的软件=)