Formatting 将表达式格式化为Maxima中的标准格式

Formatting 将表达式格式化为Maxima中的标准格式,formatting,expression,maxima,Formatting,Expression,Maxima,我是Maxima的新手,我发现这个工具非常有用。对我来说,一个更常见的用例是验证学术文本中给出的表达式。以此为例: 这是一个以标准格式编写的传递函数。注意分母中的平方项是如何单独出现的。很公平 所以,我开始构建这个表达式,我的期望是在最后比较结果。如果使用通用格式显示表达式,则会有所帮助。所以,我试图使我的结果具有与书中表达式相同的规范化格式 在这种情况下,我将执行以下操作: (%i10) F(s):=(1+s*tau_2)/(1+s*(tau_1+tau_2)); (%o10) F(s

我是Maxima的新手,我发现这个工具非常有用。对我来说,一个更常见的用例是验证学术文本中给出的表达式。以此为例:

这是一个以标准格式编写的传递函数。注意分母中的平方项是如何单独出现的。很公平

所以,我开始构建这个表达式,我的期望是在最后比较结果。如果使用通用格式显示表达式,则会有所帮助。所以,我试图使我的结果具有与书中表达式相同的规范化格式

在这种情况下,我将执行以下操作:

(%i10)  F(s):=(1+s*tau_2)/(1+s*(tau_1+tau_2));

(%o10)  F(s):=(1+s*tau_2)/(1+s*(tau_1+tau_2))

(%i13)  H(s):=(K_0*K_d*F(s))/(s+((K_0*K_d*F(s)/N)));

(%o13)  H(s):=(K_0*K_d*F(s))/(s+(K_0*K_d*F(s))/N)

(%i81)  H_1(s):=ratsimp(H(s),s);

(%o81)  H_1(s):=ratsimp(H(s),s)

(%i82)  H_1(s);

(%o82)  (K_0*K_d*N*s*tau_2+K_0*K_d*N)/(s^2*(N*tau_2+N*tau_1)+s*(K_0*K_d*tau_2+N)+K_0*K_d)

非常接近。但是,我尝试了几种不同的方法,将表达式除以N*(tau_1+tau_2),使s^2没有系数,并且没有效果。有没有简单的方法来解决这个问题

更新: 我尝试过的一些选项:

 -->    divthru(e,d):=map(lambda([u], multthru(u,d)),e); /* map applies function f() to each subpart of expr*/

(%o164) divthru(e,d):=map(lambda([u],multthru(u,d)),e)
 -->    divthru(H_1(s), 1/(N*tau_2+N*tau_1));

(%o165) (K_0*K_d*N*s*tau_2+K_0*K_d*N)/(s^2*(N*tau_2+N*tau_1)+s*(K_0*K_d*tau_2+N)+K_0*K_d)

(%i35)  matchdeclare([A,B,C,D],all);

(%o35)  done

(%i26)  defmatch(isDefPoly, A/(s^2*B+s*C+D), x);

(%o26)  isDefPoly

(%i27)  isDefPoly(H_1(s),s);

(%o27)  [A=K_0*K_d*N*s*tau_2+K_0*K_d*N,D=K_0*K_d,B=N*tau_2+N*tau_1,C=K_0*K_d*tau_2+N,x=s]

(%i36)  tellsimpafter(A/(s^2*B+s*C+D), (A/B)/(s^2+(s*C)/B+D/B));

(%o36)  [\*rule1,simptimes]

ratsimp
试图以标准化的格式放置表达式,这使得进一步的操作更加简单,并且很难说服它以其他方式重新排列术语。例如,对于像
(a+b/c)/(d+e/f)
这样的表达式,
ratsimp
将尝试将其重新排列为一个术语和另一组术语

我认为有一些附加功能可以以不同的方式重新排列术语,但我不确定是否有什么可以实现您所展示的形式


有一件事在小范围内会有所帮助。我的建议是将下标变量写成
x[k]
,而不是
x_k
。这有助于TeX格式代码识别变量名称,例如,
tau
,并将其格式化为希腊字母。此外,您还可以输入Unicode字符(来自任何语言,包括多字节字符)作为变量名。

我对此做了更多的研究,也许这里有一些想法可以帮助您。这是一个上下分开的函数。我将把它应用于
Hs
,如问题陈述所示

(%i1) divabovebelow (e, r) := (multthru (1/e, num(r)))/(multthru (1/e, denom(r))) $

(%i2) Hs: (K_0*K_d*N*s*tau_2+K_0*K_d*N)/(s^2*(N*tau_2+N*tau_1)+s*(K_0*K_d*tau_2+N)+K_0*K_d);
                   K_0 K_d N s tau_2 + K_0 K_d N
(%o2) --------------------------------------------------------
       2
      s  (N tau_2 + N tau_1) + s (K_0 K_d tau_2 + N) + K_0 K_d
(%i3) divabovebelow (N*tau_2 + N*tau_1, Hs);
             K_0 K_d N s tau_2       K_0 K_d N
             ----------------- + -----------------
             N tau_2 + N tau_1   N tau_2 + N tau_1
(%o3)    ----------------------------------------------
         s (K_0 K_d tau_2 + N)        K_0 K_d         2
         --------------------- + ----------------- + s
           N tau_2 + N tau_1     N tau_2 + N tau_1
这里还有几个函数可能会有所帮助<代码>多项式_in重新排列术语,将一个变量与其他变量隔离开来
nicer\u rational
通过
polymonal\u in
使有理函数看起来更漂亮

(%i4) Hs1: ratsimp (Hs);
                  K_0 K_d N s tau_2 + K_0 K_d N
(%o4) -----------------------------------------------------
          2                         2
      (N s  + K_0 K_d s) tau_2 + N s  tau_1 + N s + K_0 K_d
(%i5) polynomial_in (var, e) := apply ("+", makelist (var^k * ratcoef (e, var, k), k, 0, hipow (e, var))) $

(%i6) nicer_rational (var, e) := (polynomial_in (var, num(e)))/(polynomial_in (var, denom(e))) $

(%i7) nicer_rational (s, Hs1);
                   K_0 K_d N s tau_2 + K_0 K_d N
(%o7) --------------------------------------------------------
       2
      s  (N tau_2 + N tau_1) + s (K_0 K_d tau_2 + N) + K_0 K_d
它们产生的最终结果与上面的
ratsimp
相同,但可能更有意义,因为它们是为您正在使用的表达式设计的


我在考虑一些额外的函数来更接近教科书的形式,但它有点脆弱,因为Maxima希望将表达式重新组织为其标准形式,因此无论好坏,都可以得到一个漂亮的显示,或者一个用于处理的表达式。希望这对您有所帮助。

您好,谢谢您的回复!我已经用我一直在试验的一些选项更新了这个问题。我想知道tellsimp选项是否正确?此特定规则在ratsimp之后尝试计算H_1时会导致错误。你在这里有什么改进吗?它不一定要漂亮或太笼统;-)很遗憾,因为这将是一个很好的功能。控制系统理论中的许多传递函数被安排成具有以下格式的分母:s^2+2*ZetaOmegas+Omega^2。接近这种格式是非常有用的。