从公式求值到函数单变量求导 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
crella

从公式求值到函数单变量求导

  •  
  •   crella 2020 年 3 月 14 日 via Android 1040 次点击
    这是一个创建于 2232 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业余写编程,纯属兴趣驱动。写了个小脚本,在给定 x=1 时,求出 f(x)=1+(1+(x*sin(x^2-x^3)))*6 的值。主要就是先逐步找到括号里的表达式,求值,消去括号和表达式;不断循环。

    一直有个心愿把求导功能做出来。随便想了一个多月里的零碎时间,做了不少让步,包括仅限对 x 求导;暂时不用合并同类项;求导函数仅以 x 为变量;……

    一开始打算扩展 Ruby 的 Float 类型,加自定义属性,把 x 设为这个自定义 Float 类的实例,像给表达式求值一样,跟踪 x 被处理的流程。后来发现难如天书,无法下手。

    现在是把括号内表达式设成类 PolyList 的实例,这个类有 @store 存储表达式的切割字符列表,有 @func 记录括号外是否挂载函数(比如'sin'或者 undef ),有 @derv_list 记录当前表达式及其挂载函数的导数,也是与 @store 相似的列表。

    目前版本求值也是用了 PolyList 来存储括号内表达式,求值方面通过之前写好的测试。

    下午写了一些代码,发现真是太难了,什么东西放什么位置,比一开始规划的乱得多;定义每个函数的功能往往也不准确,怎么切分功能?;还不知道会不会写出互相依赖的死循环……感觉自己没有系统学习过规划项目的能力。

    如果是科班学习的各位来想,怎样在已有的公式求值引擎的基础上写求导功能?

    而且目前看来,合并同类项也是一个很棘手的功能。比如 a=2*x^3+x^3=3*x^3,这个初中生都会的化简,编程来写还不一定容易写。

    问题:
    1、用字符还是自定义类来存储 3 和 x 之类的元素?

    2、如果把 x^3 存储成一个元素,那么 a=2*(x-1+1)^3+(2*x)^3/8 的合并同类项又该怎样写处理流程呢?

    感觉自己还是倾向于自力更生,一旦找到已有的解决方案,就泄气了、再也不想想这个事。谁不知道有 SymPy 啊,哈哈。
    crella
        1
    crella  
    OP
       2020 年 3 月 15 日   1
    有点开心,出了初步的成果,说明我的设想是基本可行的……

    打印结果:

    公式:x^2+x
    求导结果: ( x * 2 ) + 1
    ---
    公式:x*x/2
    求导结果: ( ( x * 2 ) / 2.0 )
    ---
    公式:x*sin(x)
    求导结果: ( x * ( {cos{{x}}} ) + sin{x} )
    ---
    公式:1+sin(x)/x
    求导结果: 0 + ( {{cos{{x}}}, *, x, -, sin{x}} / x ^ 2 )
    ---
    公式:sin(x^3+x^2)
    求导结果: ( {cos{{x, ^, 3, +, x, ^, 2}}} * ( ( x ^ 2.0 * 3.0 ) + ( x * 2 ) ) )
    ---
    公式:1+sin(x^3+x^2)*cos(x)
    求导结果: 0 + ( sin{x, ^, 3, +, x, ^, 2} * ( {-1, *, sin{{x}}} ) + cos{x} * ( {cos{{x, ^, 3, +, x, ^, 2}}} * ( ( x ^ 2.0 * 3.0 ) + ( x * 2 ) ) ) )
    ---
    公式:1+(1+x*sin(x^2-x^3))*6
    求导结果: 0 + ( ( 0 + ( x * ( {cos{{x, ^, 2, -, x, ^, 3}}} * ( ( x * 2 ) - ( x ^ 2.0 * 3.0 ) ) ) + sin{x, ^, 2, -, x, ^, 3} ) ) * 6.0 )
    ---

    以后如果测试更多的用例也可以的话,那么接下来最大的问题就是合并同类项了,哈哈。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2720 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 15:16 PVG 23:16 LAX 08:16 JFK 11:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86