星期一, 五月 04, 2009

maxima 中添加化简规则

maxima里有一个可以宣称在某种情况下就怎样化简的方法,tellsimp(当然还有很多和它类似,作用略不同的其它函数)。

这个东东自动跌代使用,化简到不能话位置,而且全局自动有效(也有需要声明才有效的函数)。 所以很容易定义一个规则,然后所有的计算自动对此化简。

最简单的例子:
(%i1) matchdeclare(a,true);
(%o1) done
(%i2) tellsimp(a^a,123);
(%o2) [^rule1, simpexpt]
(%i3) x^x;
(%o3) 123
(%i4) 2^2;
(%o4) 123
其中 matchdeclare(a,true);宣称a对所有的地方有效;
然后告诉说出现a^a这种情况就“简化”为123. 看,效果多明显!


这个还可以进行条件简化,就是在某个条件成立的情况下才简化。这时候lambda函数很重要,虽然我还没搞清楚lambda到底是什么工作原理,但这里的一个应用还是蛮简单的。

例子:
(%i5) matchdeclare (bb, lambda ([x], x > 0));
(%o5) done
(%i7) tellsimp(bb^2,1);
(%o7) [^rule2, ^rule1, simpexpt]
(%i8) assume(b>1);
(%o8) [b > 1]
(%i9) b^2;
(%o9) 1
(%i10) 6^2;
(%o10) 1

而我的更实际的例子是这样:
matchdeclare(sim_aa, true, sim_bb, lambda ([x], abs(x) < 0.0000001))$
tellsimp(sim_aa^sim_bb,1)$
/*This two lines are used to force some items like x^1e-10 to be 1, which may produce some errors like "6.0968278859352144E-18 Exponent out of range" or "INTEXP-MAXIMUM-EXPONENT".*/
要解决的问题是有很多在计算过程本来是0的,但由于精度问题而出现一个很小的值,比如x^0, 它写成x^1.111E-16之类的。带来两个麻烦,结果里边老是有一个这么一个本来是1的东西,却还很占空间; 更糟的是在做radcan简化的时候,这个东东报错! 但是用了上面这个大法之后,就解决了!

不过这个东西实在太强大,慎用慎用。 你看上面都改变了数学规则,让6^2等于1了。

没有评论: