根据导数或指数水平对Mathematica中的公式进行排序

时间:2011-02-21 21:17:31

标签: sorting wolfram-mathematica exponent derivative

我有一个阻抗方程式,我已将其转移到Mathematica以期简化它。它代表电路原理图,电路阻抗(Z,V = iZ)是s平面中几个项的很大一部分。

作为一个简短的例子,它可能看起来像:

 L0s + (R1/(1 + R1 C1 s) + R3b + L3s + V3/s)/(R2a L2a s/(R2a + L2a s))

我想将数据重新排列为:

k1*s^-1 + k2*s^0 + k3*s^1 ...  

所有值k表示过量数据(各种R-,L-和C-值的分数)。

哪种配方操作最适合用于制作这些类型的结构?



我相信Collect函数无法根据s的指数处理事物,即使方程是简化的,然后由于术语之间的划分水平而扩展所有 - 有几层未解析的分数

在想知道这一点时,我也很好奇,如果我将所有内容都转换为时域,是否可以按素数排序(派生/整合的次数)?

S c0 + c1 + d/dt*c2 + d^2/dt^2*c3 ...

2 个答案:

答案 0 :(得分:4)

您的功能不是ss^(-1)中的多项式。我最接近理解你的问题的方法是将你的表达式发展成围绕s==0的系列,然后确定系列系数。这可以使用SeriesCoefficient

完成
In[80]:= SeriesCoefficient[
 L0*s + (R1/(1 + R1*C1*s) + R3b + L3s + V3/s)/(R2a*
     L2a*(s/(R2a + L2a*s))), {s, 0, n}]

Out[80]= Piecewise[{
          {(R1*((-C1)*R1)^n*(L2a - C1*R1*R2a))/(L2a*R2a), n > 1}, 
          {L0 + (C1*R1^2*(-L2a + C1*R1*R2a))/(L2a*R2a), n == 1}, 
          {((-C1)*R1^2*R2a + L2a*(L3s + R1 + R3b))/(L2a*R2a), n == 0}, 
          {V3/L2a, n == -2}, 
          {(L3s*R2a + R1*R2a + R2a*R3b + L2a*V3)/(L2a*R2a), n == -1}
         }, 0]

我希望这有用。

答案 1 :(得分:1)

我对原始方程无能为力,为了说明可行的有用方法,我将使用以下大大简化的版本。可能,这根本不是你所需要的。

myeqn = Expand[L0 s + (R3b + L3 s + V3/s)/(R2a L2a s/(R2a + L2a s))]

,并提供:

enter image description here

SelectFreeQMemberQ现在可用于定义k0,k1 ......如下:

k0 = Select[myeqn, FreeQ[#, s] &]

enter image description here

类似地:

k1 = Expand[Select[myeqn, MemberQ[#, s] &] 1/s];

km1 = Expand[Select[myeqn, MemberQ[#, 1/s] &] s];

km2 = Expand[Select[myeqn, MemberQ[#, 1/s^2] &] s^2];

以下现在评估为True(我假设最终你需要这样的东西)

Expand[k0 + k1 s + km1/s + km2/s^2] == myeqn

然而,Sasha给出above的方法看起来好多了:

scoeff = SeriesCoefficient[myeqn, {s, 0, n}];

其中,例如,

k0alt = First@scoeff[[1, 2]]