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)
让我先说一下,我真的不知道你想用它做什么.但是,只要您的表达式遵循此严格形式(即表单的分数之和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 == A
和d == B*x + C
.你可以用多种方式提取后两个参数,我更喜欢微积分:
B = diff(d,x);
C = subs(d,x,0);
Run Code Online (Sandbox Code Playgroud)
现在你知道你的第一个分数A/(B*x+C)
,或者如果你愿意,你可以把A
和C
通过B
让你的分数的"规范"的形式.为第二个(以及更多,如果有的话)孩子做同样的事情pol
.
校验:
>> simplify(frac1 == A/(B*x+C))
ans =
TRUE
Run Code Online (Sandbox Code Playgroud)