我需要进行大量简单的计算,并以预定义的方式在报告中呈现每个步骤: (例如,我的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
我需要什么而不是“ ???”获得所需的输出?
答案 0 :(得分:1)
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
的某些选择,您可能会创建无效的表达式。我不会在这里尝试解决问题。