我需要进行大量简单的计算,并以预定义的方式呈现我的报告中的每一步:(例如,我得到B = 2,C = 3):
A=B+12-6/C^2; A=2+12-6/3^2=13.333;
我可以获得第一个区块并且这样回答:
B:2$ C:3$
A:'(B+12-6/C^2)$
print("A=",A,"; ","A= ??? =",ev(A, numer) );
得到:
6
A= (- --) + B + 12 ; A= ??? = 13.33333333333333
2
C
我需要什么而不是'???'获得理想的输出?
Maxima区分了计算结果的两个部分:评估和简化。评估=用一个东西(值)代替另一个东西(变量或函数)。简化=应用数学身份来获得“更简单”的等效结果。
在您的问题中,您似乎想要推迟简化。你可以说simp: false
这样做。这是一种可能的方法。我将禁用简化,将值替换为表达式,打印替换的表达式,然后重新启用简化以获得最终结果。
(%i2) expr: A=B+12-6/C^2;
6
(%o2) A = (- --) + B + 12
2
C
(%i3) simp: false $
(%i4) subst ([B = 2, C = 3], expr);
- 2
(%o4) A = 12 + 2 + (- 6) 3
(%i5) simp: true $
(%i6) %o4;
40
(%o6) A = --
3
请注意,Maxima中的许多操作都是通过简化(例如将数字加在一起)发生的,因此通常,当simp
为false
时,Maxima将显着不同。但在这种情况下,这就是你想要的。
编辑:OP指出替换后的结果显示有点不同。其原因与Maxima的一些模糊实现细节有关。尽管如此,通过使用Lisp替换函数SUBST(在Maxima中引用为?subst
)而不是Maxima subst,可以解决该行为。 SUBST与Maxima subst略有不同;语法是?subst(new_thing, old_thing, some_expression)
。在通过SUBST替换之后,有必要明确地重新简化;一种方法是说expand(..., 0, 0)
(它不会扩展任何东西,唯一的效果是重新简化)。
(%i2) expr: A=B+12-6/C^2;
6
(%o2) A = (- --) + B + 12
2
C
(%i3) simp: false $
(%i4) ?subst (3, C, ?subst (2, B, expr));
6
(%o4) A = (- --) + 2 + 12
2
3
(%i5) simp: true $
(%i6) expand (%o4, 0, 0);
40
(%o6) A = --
3
由于SUBST对内部表示具有不同的影响,因此有可能为new_thing
,old_thing
和some_expression
的某些选项创建无效表达式。我不会试着在这里解决这个问题。