如何将符号表达式中的所有数值提取到矩阵中?

How to extract all numeric values from a symbolic expression into a matrix?

我已经在 MATLAB 中对符号多项式进行了部分分数分解,这给了我一个符号表达式,例如以下:

poly = -2i/(x - 1.0 - 1.7i) + 0.57i/(x - 1.0 + 1.1559i)

如您所见,此符号表达式包含 x 变量和常量复数。如何从 MATLAB 中的这个表达式中提取所有数值?数字是真实的还是复杂的信息不能丢失。

那么对于给定的表达式 poly,我将如何获得以下矩阵 A:

A = [-2i, -1-1.7i; .57i, -1+1.1559i]

A =

     0 - 2i        -1 - 1.7i
     0 + 0.57i     -1 + 1.1559i

另请注意,A 应包含数字,而不是像 poly 那样的符号表达式。


我读到 coeffs-函数,但它要求输入是多项式。 使用 children-函数,我可以将符号表达式中的求和项划分为符号表达式的向量,如下所示:

p = - 0.57735026918962576450914878050196i/(x - 1.0 - 1.7320508075688772935274463415059i) + 0.57735026918962576450914878050196i/(x - 1.0 + 1.7320508075688772935274463415059i);
terms = children(p)

terms = 
[ -0.57735026918962576450914878050196i/(x - 1.0 - 1.7320508075688772935274463415059i), 0.57735026918962576450914878050196i/(x - 1.0 + 1.7320508075688772935274463415059i)]

让我开始吧,我真的不知道你想用它做什么。但是,只要您的表达式遵循这种严格的形式(即 A/(x+B) 形式的分数之和),您就可以破解您的问题的解决方案。

我将使用您的示例输入(重命名为 pol 以免隐藏名为 poly 的函数):

x = sym('x');
pol = -2i/(x - 1.0 - 1.7i) + 0.57i/(x - 1.0 + 1.1559i);

首先,用children将其分成两部分:

fractions = children(pol);
frac1 = fractions(1);

现在,使用 numden 分解一个分数:

[n,d] = numden(frac1);
A = n;

现在我们有了 A/(B*x+C) 形式的分数项,其中 n == Ad == B*x + C。你可以通过多种方式提取后两个参数,我更喜欢微积分:

B = diff(d,x);
C = subs(d,x,0);

现在您知道您的第一个分数是 A/(B*x+C),或者如果您愿意,可以将 AC 除以 B 得到 "canonical" 你分数的形式。对 pol.

的第二个(如果有的话)child 执行相同的操作

检查:

>> simplify(frac1 == A/(B*x+C))

ans =

TRUE