如何教 Maxima 使用单位?

计算科学 符号计算
2021-12-03 19:05:24

我想在Maxima/wxmaxima中进行工程和科学计算。我不想每次都手动检查我的单位是否有意义,我该如何实现?

我正在看 Maxima,因为它是免费的,如果被问到,它可以象征性地解决方程等。

3个回答

还有dimension巴顿威利斯的包。它很可能已经是您maxima安装的一部分。

http://sourceforge.net/p/maxima/code/ci/master/tree/share/physics

带有文档的 pdf 文件的直接链接:

http://sourceforge.net/p/maxima/code/ci/master/tree/share/physics/dimension.pdf?format=raw

您可能会发现此示例很有用

  load("dimension");
  depends(v, [t, x]);
  depends(p, [t, x]);
  /* put known dimensions */
  qput(rho, mass/length^3, dimension);
  qput(v, length/time, dimension);
  qput(t, time, dimension);
  qput(x, length, dimension);
  qput(L, length, dimension);

  /* Navier-Stokes equation */
  ns: rho*(diff(v, t) + v*diff(v, x)) = -diff(p, x) + mu*diff(v, x, 2);

  /* assume dimensions for `p' and `mu' are unknown and derive them */
  eq1: dimension(lhs(ns)) = dimension(part(rhs(ns), 1));
  eq2: dimension(lhs(ns)) = dimension(part(rhs(ns), 2));
  sol: solve([eq1, eq2], [dimension(p), dimension(mu)])[1];

  /* this line should give an error becouse `ns' is dimensionally inconsistent */
  /* dimension(ns); */

  /* put dimensions for `p' and `mu'  */
  put(p, assoc(dimension(p), sol),   'dimension);
  put(mu, assoc(dimension(mu), sol), 'dimension);

  /* now it is OK */
  dimension(ns);

  /* define Reynolds number as dimensionless reverse viscosity */
  one_over_mu_unit: natural_unit(1/mu, [L, rho, v]);
  Re: (1/mu)/one_over_mu_unit;

  print("dimension(mu):          ", dimension(mu));
  print("dimension(p):          ", dimension(p));
  print("Reynolds number:        ", Re);
  print("dimension(ns):        ",   dimension(ns));

输出应该是:

                            mass
dimension(mu):           ----------- 
                         length time
                            mass
dimension(p):           ------------ 
                                   2
                        length time
                          rho v L
Reynolds number:         [-------] 
                            mu
                           mass
dimension(ns):         ------------- 
                             2     2
                       length  time

我还想找到一种使用 wxMaxima 进行方便计算的方法,最后想出了一个非常简单的修复方法,使我能够使用任何单位组合进行工程计算,混合英制、美国习惯或 SI 等都在体内相同的计算工作表。
解决方法是在工作表的开头批量加载单位转换文件。IE

(%i1) batchload("/*path*/mks_UNITS_CONVERSION.wxm")

mks_UNITS_CONVERSION.wxm 
"MKSK system conversion factors.
metre kilogram seconds kelvin radians"

LENGTH
> m:1;
mm:.001;
cm:.01;
km:1000;
ins:25.4*mm;
ft:0.3048;
feet:ft;
yards:yd:36*ins;
mile:1609.344;
NM:1852;
Rad:1;
degrees:deg:%pi/180;
Radians:Rads:Rad;
MASS
> kg:1; g:0.001; tonne:1000;
lb:0.45359237; oz:lb/16;
kip:1000*lb; ton:2240*lb;cwt:112*lb;
TIME
> s:1; min:60; hour:3600; h:hour; day:24*hour; week:7*day; year:365.25*day;

对于所有需要的相关派生单位,力、功率、压力、热量、面积、体积、流量等单位,以涵盖所需的所有类型的单位。然后使用一组连贯的基本单位(在本例中为 MKS)进行所有计算。输入数据的单位在输入点通过将数量乘以相关单位名称来声明。例如 10.5* 英寸;(= 10.5 英寸),或 17.35*cm;(= 17.35 厘米)。所有随后的计算都在连贯的 MKS 单元集中。但是,可以以任何单位生成输出以适应用户的方便。在这种情况下(可能与直觉相反),所需单位的输出是通过将计算得到的答案除以所需单位的名称来获得的。需要一些基本的内务管理来保持单元集的完整性,
对我来说,发现这种方法完全改变了 wxMaxima 的实用性。它所需要的只是首先创建并存储一个 .wxm 转换文件。批量加载文件的使用对新工作表所需的运行时间没有可检测到的影响。希望这对某人有帮助!我认为不可能在 wxMaxima 的标准库中包含适当的 .wxm 文件吗?