我有一个符号向量方程式(实际上,通常有很多方程式),我想用一个不同的符号向量代替。我希望MATLAB用新的符号变量替换方程式,以便不保留任何旧的符号变量。我一直在使用subs
函数,但是它似乎是最早使用替代而不是完全替代的机会。
这是我的意思的示例:
>> M = sym('m',[1,4]).'
M =
m1
m2
m3
m4
>> N = sym('n',[1,4]).'
N =
n1
n2
n3
n4
>> eqn = N(2,1) + 2*N(3,1) - 4*N(4,1)
eqn =
n2 + 2*n3 - 4*n4
>> relation = [N(1,1);N(4,1); N(3,1) - 2*N(4,1); N(2,1)]
relation =
n1
n4
n3 - 2*n4
n2
>> subs(eqn,relation,M)
ans =
m4 - 4*m2 + 2*n3
通过手工,我可以清楚地看到eqn == m4 + 2*m3
。但是,当我要求用MATLAB替代时,方程式中仍然剩下+2*n3
。
我一直在寻找类似的问题而徒劳无功,如何让MatLab替代方程式中n的所有出现?
我通常会有很多这样的方程式,而且我知道可以用m's
来代替。
答案 0 :(得分:2)
您可以使用反关系,而不是使用M
表示的N
,而是可以得到反关系-N
表示的M
。对于subs
来说这更简单,因为您要替换N
:
M = sym('m',[1,4]).';
N = sym('n',[1,4]).';
eqn = N(2,1) + 2*N(3,1) - 4*N(4,1);
relation = [N(1,1);N(4,1); N(3,1) - 2*N(4,1); N(2,1)];
% Get invers of relation, N => M
invRelation = struct2array(solve(M - relation, N)).';
newEqn = subs(eqn,N,invRelation);
结果:
relation =
n1
n4
n3 - 2*n4
n2
invRelation =
m1
m4
2*m2 + m3
m2
eqn =
n2 + 2*n3 - 4*n4
newEqn =
2*m3 + m4
我不确定subs
的限制是否已记录在案,我没有发现任何限制,但这是另一个非常简单的示例,其中subs
失败了:
syms x y
eun = x;
subs1 = subs(x,x,-y)
subs2 = subs(x,-x,y)
输出:
subs1 =
-y
subs2 =
x