不指定单位,我可以表示面积和体积,并让Maxima显示关系:
(%i1) areaNoUnits: area = width * length$
(%i2) volumeNoUnits: volume = area * height$
(%i3) volumeNoUnits, areaNoUnits;
(%o3) volume = height length width
(%i4) subst(areaNoUnits, volumeNoUnits);
(%o4) volume = height length width
现在我想指定单位,所以我将使用ezunits包。
'(反勾号)操作符是ezunits的组成部分:
表达式a ' b表示一个量纲量,其中a表示非量纲量,b表示量纲单位。
当我在面积和体积表达式中添加单位时,求值和替换不起作用:
(%i1) load ("ezunits")$
(%i2) areaWithUnits: area ` m^2 = (width ` m) * (length ` m);
2 2
(%o2) area ` m = length width ` m
(%i3) volumeWithUnits: volume ` m^3 = (area ` m^2) * (height ` m);
3 3
(%o3) volume ` m = area height ` m
(%i4) volumeWithUnits, areaWithUnits;
3 3
(%o4) volume ` m = area height ` m
(%i5) subst(areaWithUnits, volumeWithUnits);
3 3
(%o5) volume ` m = area height ` m
期望输出为:
volumeWithUnits, areaWithUnits;
3 3
volume ` m = height length width ` m
我在ezunits包中没有看到一个函数来执行求值或替换。正确的做法是什么?
我会这样表达:
(%i2) load (ezunits) $
(%i3) width: W ` m;
(%o3) W ` m
(%i4) length: L ` m;
(%o4) L ` m
(%i5) area: width * length;
2
(%o5) L W ` m
(%i6) height: H ` m;
(%o6) H ` m
(%i7) volume: area * height;
3
(%o7) H L W ` m
我把每一部分都写成conceptualname: symbolforquantity ` unit
,然后在进一步的计算中只写conceptualname
,而不是conceptualname ` unit
。
您在%i5中尝试的替换不起作用,因为subst
是一个纯粹的形式替换—如果没有与替换表达式相同的文字子表达式,则不匹配;subst
不查找可能有助于匹配的重排或分解。有一些方法可以解决这个问题,所以有可能使您的原始配方工作,但我认为总体上避开这个问题并使用conceptualname
和symbolforquantity ` unit
会更好。
说一下我们可以用上面的%o7
这样的表达式做些什么。至少有两种方法可以用特定的值替换符号H
、L
和W
。一个是调用subst
:
(%i2) load (ezunits) $
(%i3) volume: H*L*W ` m^3;
3
(%o3) H L W ` m
(%i4) subst ([L = 20, W = %pi], volume);
3
(%o4) 20 %pi H ` m
另一种是利用ev
。
(%i5) ev (volume, L = 20, W = %pi);
3
(%o5) 20 %pi H ` m
注意,在输入提示符中,something, someflags, somevalues
相当于ev(something, someflags, somevalues)
。
(%i6) volume, L = 20, W = %pi;
3
(%o6) 20 %pi H ` m
这只是为了方便。在函数中,必须说ev(...)
;这里不理解较短的语法。
ev
通常很方便,但是用subst
来预测结果通常更简单。