如何将符号表达式中的所有数值提取到矩阵中?
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 == A
和 d == B*x + C
。你可以通过多种方式提取后两个参数,我更喜欢微积分:
B = diff(d,x);
C = subs(d,x,0);
现在您知道您的第一个分数是 A/(B*x+C)
,或者如果您愿意,可以将 A
和 C
除以 B
得到 "canonical" 你分数的形式。对 pol
.
的第二个(如果有的话)child 执行相同的操作
检查:
>> simplify(frac1 == A/(B*x+C))
ans =
TRUE
我已经在 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 == A
和 d == B*x + C
。你可以通过多种方式提取后两个参数,我更喜欢微积分:
B = diff(d,x);
C = subs(d,x,0);
现在您知道您的第一个分数是 A/(B*x+C)
,或者如果您愿意,可以将 A
和 C
除以 B
得到 "canonical" 你分数的形式。对 pol
.
检查:
>> simplify(frac1 == A/(B*x+C))
ans =
TRUE