如何在Matlab中提取矩阵中变量的系数

时间:2015-11-05 11:17:43

标签: matlab matrix linear-algebra symbolic-math

假设我有以下矩阵:

syms x y z
M = [x+y-z;2*x+3*y+-5*z;-x-y6*z];

我想要一个由变量x,y和z的系数组成的矩阵:

CM = [1,1,-1;2,3,-5;-1,-1,6];

如果我将CM乘以[x;y;z],我希望得到M

修改

我有一个ODE系统:

(d/dt)A = B

AB是方形矩阵。我想解决这些方程组。我不想使用ode解决Matlab的命令。 如果我把上面的方程组变成:

(d/dt)a = M*a

然后我可以通过矩阵M的特征向量和值轻松地解决它。这里a是包含变量的列向量,M是从B中提取的系数矩阵。

1 个答案:

答案 0 :(得分:3)

由于您似乎正在使用符号数学工具箱,因此您应该{i}符号地保存关于每个变量的派生词:

diff

然后你得到

syms x y z;
M=[x+y-z;2*x+3*y-5*z;-x-y+6*z];
Mdiff=[];
for k=symvar(M)
   Mdiff=[Mdiff diff(M,k)];
end

如果您想以非字典顺序排列列,那么您需要使用自己的矢量而不是Mdiff = [ 1, 1, -1] [ 2, 3, -5] [ -1, -1, 6]

更新

由于您提到此方法很慢,因此使用symvarcoeffs视为其变量的多项式可能会更快:

M

请注意,出于某种原因(我不明白), syms x y z; M=[x+y-z;2*x+3*y-5*z;-x-y+6*z]; Mdiff2=[]; varnames=symvar(M); for k=1:length(M) Mdiff2=[Mdiff2; coeffs(M(k),varnames(end:-1:1))]; end 的输出与其输入变量列表相比是反转的,这就是为什么我们使用coeffs的显式反转版本来调用它

输出:

symvar(M)

作为@horchler pointed out,如果符号向量在其组件中具有不同数量的变量,则第二个解决方案将不起作用。由于速度只对你必须多次执行此操作很重要,在>> Mdiff2 Mdiff2 = [ 1, 1, -1] [ 2, 3, -5] [ -1, -1, 6] 中有很多参数配置,我建议参数化地构造M(这样系数也是{{1} s)是可能的,那么你只需执行一次第一个版本。其余的只是替代结果。