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

jje*_*omi 1 matlab symbolic-math polynomials

我在MATLAB中对符号多项式进行了部分分数分解,它给出了一个符号表达式,如下所示:

poly = -2i/(x - 1.0 - 1.7i) + 0.57i/(x - 1.0 + 1.1559i)
Run Code Online (Sandbox Code Playgroud)

如您所见,此符号表达式包含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
Run Code Online (Sandbox Code Playgroud)

还请注意,A应包含数字,而不是符号表达式poly.


我读了coeffs-function,但它要求输入是多项式.使用children-function我可以将符号表达式中的求和项除以符号表达式的向量,如下所示:

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)]
Run Code Online (Sandbox Code Playgroud)

And*_*eak 7

让我先说一下,我真的不知道你想用它做什么.但是,只要您的表达式遵循此严格形式(即表单的分数之和A/(x+B)),您就可以解决问题的解决方案.

我将使用您的示例输入(pol为了不影响命名的函数而重命名为poly):

x = sym('x');
pol = -2i/(x - 1.0 - 1.7i) + 0.57i/(x - 1.0 + 1.1559i);
Run Code Online (Sandbox Code Playgroud)

首先,将其分为两部分children:

fractions = children(pol);
frac1 = fractions(1);
Run Code Online (Sandbox Code Playgroud)

现在,使用numden以下方法分解分数:

[n,d] = numden(frac1);
A = n;
Run Code Online (Sandbox Code Playgroud)

现在我们有一小部分形式的术语A/(B*x+C),其中n == Ad == B*x + C.你可以用多种方式提取后两个参数,我更喜欢微积分:

B = diff(d,x);
C = subs(d,x,0);
Run Code Online (Sandbox Code Playgroud)

现在你知道你的第一个分数A/(B*x+C),或者如果你愿意,你可以把AC通过B让你的分数的"规范"的形式.为第二个(以及更多,如果有的话)孩子做同样的事情pol.

校验:

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

ans =

TRUE
Run Code Online (Sandbox Code Playgroud)

  • 没问题,我很抱歉有点简短的总结,但很难在这里很快解释.如果我把一切都搞定了,我会尝试将所有内容都写成手稿并发布.这不是什么大结果.只是在一个非平凡的非教科书 - 不错的案例中测试理论. (2认同)
  • @jjepsuomi哦,不,没关系,你没有义务详细解释,你的问题是自成一体的.我只是想知道这可能是一个XY问题,这就是为什么我问:) (2认同)
  • @AndrasDeak哦,是的,我道歉,我太匆忙地读了最后一部分.我不确定在这种情况下规范是什么意思.很好,现在我明白了.它100%非常好.谢谢=) (2认同)