数组符号向量替换问题-MATLAB缺少精确替换的能力

时间:2019-06-25 12:18:08

标签: matlab

我有一个符号向量方程式(实际上,通常有很多方程式),我想用一个不同的符号向量代替。我希望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来代替。

1 个答案:

答案 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的限制是否已记录在案,我没有发现任何限制,但这是另一个非常简单的示例,其中subs失败了:

syms x y
eun = x;
subs1 = subs(x,x,-y)
subs2 = subs(x,-x,y)

输出:

subs1 =

-y


subs2 =

x