假设我有以下矩阵:
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
A
和B
是方形矩阵。我想解决这些方程组。我不想使用ode解决Matlab的命令。
如果我把上面的方程组变成:
(d/dt)a = M*a
然后我可以通过矩阵M的特征向量和值轻松地解决它。这里a
是包含变量的列向量,M是从B中提取的系数矩阵。
答案 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]
。
由于您提到此方法很慢,因此使用symvar
将coeffs
视为其变量的多项式可能会更快:
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)是可能的,那么你只需执行一次第一个版本。其余的只是替代结果。