如何在没有评估的情况下输出方程式,但将变量替换为它们的值?
How to output equation without evaluation, but with variables replaced to their values?
我需要进行大量简单的计算,并以预定义的方式在报告中呈现每个步骤:
(例如,我得到 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 区分计算结果的两个部分:评估和简化。评估 = 用一件事(值)代替另一件事(变量或函数)。简化 = 应用数学恒等式得到 "simpler" 等效结果。
在您的问题中,您似乎想推迟简化。你可以说 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
的某些选择,您可能会创建无效的表达式。我不会在这里尝试解决这个问题。
我需要进行大量简单的计算,并以预定义的方式在报告中呈现每个步骤: (例如,我得到 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 区分计算结果的两个部分:评估和简化。评估 = 用一件事(值)代替另一件事(变量或函数)。简化 = 应用数学恒等式得到 "simpler" 等效结果。
在您的问题中,您似乎想推迟简化。你可以说 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
的某些选择,您可能会创建无效的表达式。我不会在这里尝试解决这个问题。