Formatting 将表达式格式化为Maxima中的标准格式
我是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
(%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。接近这种格式是非常有用的。