Maxima ezunits:将单位应用于列表的所有元素

Maxima ezunits: apply a unit to all elements of a list

自从我发现 ezunits 包后,我在 Maxima 中广泛使用了它,但我找不到将单位应用于列表元素的令人满意的方法。

例如 [1,2,3]`hour 显然有效

a: [1,2,3]`hour;
>> [1,2,3] ` hour

(5`km)/a[2];
>> 5/2 ` km/hour

但我无法循环遍历它

makelist((5`km)/x, x, [1,2,3]`hour);
>>> makelist: third argument must be a number or a list; found: [1.0,2.0,3.0] ` hour

然而,如果我手动将单位应用到列表的每个元素,一切正常:

makelist((5`km)/x, x, [1`hour,2`hour,3`hour]);
[5 ` km/hour,5/2 ` km/hour,5/3 ` km/hour]

在此先感谢您提供的任何帮助。

解决方法可能在以下函数中:

unit2list(l,u):= makelist(x`u,x,l)$

不是很优雅,但似乎可行。

tellsimp 上面的建议是个好主意。这是另一个取决于仅部分记录的 distribute_over 属性:

(%i7) :lisp (setf (get '$\` 'distribute_over) '(mlist $matrix mequal))
(MLIST $MATRIX MEQUAL)
(%i7) [1,2,3]`m;
(%o7)                        [1 ` m, 2 ` m, 3 ` m]

注意标点符号!仔细区分反引号和单引号。

请注意,我已将反引号分布在列表、矩阵和方程式上,即

(a = b)`m

简化为:

a`m = b`m

当我编写 ezunits 程序包时,我曾考虑过让反引号自动分布在列表中,但最终还是放弃了。您对此话题有何评论?我很想听听用户对此有何评论。

提出问题的另一个解决方案。当全局标志 listarithtrue(默认值)时,许多算术运算分布在列表上。所以在你的例子中:

(%i22) a: [1,2,3]`hour;
(%o22)                         [1, 2, 3] ` hour
(%i23) (5`km)/a;
                                   5  5     km
(%o23)                         [5, -, -] ` ----
                                   2  3    hour
(%i24) %[2];
                                   5    km
(%o24)                             - ` ----
                                   2   hour