更新符号数组时,无法再更新使用第一个数组元素的另一个变量

When symbolic array gets updated, another variable that uses an element of the first array cannot be updated anymore

为了简化我的实际问题,让我们定义以下符号表达式。

a=sym('a',[1,3]);
b=a(1);

如果我以某种方式将新事物分配给 a,我无法让 b 进行更新。这样做的正确方法是什么?

示例 1:

a=sym('a',[1,3]);
b=a(1);
a=sym([1,2,3]);
b
subs(b)
subs(b,a(1),100)

示例 1 输出:

b =

a1


ans =

a1


ans =

a1

示例 2:

a=sym('a',[1,3]);
b=a(1);
a=subs(a,a(1),3);
b
subs(b)
subs(b,a(1),100)

示例 2 输出:

b =

a1


ans =

a1


ans =

a1

示例 3:

a=sym('a',[1,3]);
b=a(1);
a(1)=sym(3);
b
subs(b)
subs(b,a(1),100)

示例 3 输出:

b =

a1


ans =

a1


ans =

a1

我的实际问题如下。我有 N 个未知数

a=sym('a',[1,N]);

N方程。

EQN=sym('EQN',[1,N]);

N 是根据用户输入定义的,我事先不知道它会是什么。我还有其他依赖于 a.

的变量
% some code here such as b = [2*a(1),3*a(2),..] etc.

然后我求解未知数的方程

% some code here to derive EQN(1), EQN(2), ... EQN(N).
SOL=solve(EQN,a);

并将解决方案替换为

SOL = struct2cell(SOL);
SOL = [SOL{:}];
a=subs('a',a,SOL);

现在我想去掉 b 中的未知数,但由于我在开始时试图解释的原因,我做不到。

问题是您正在覆盖 a,而不是为 a1a2a3 分配新值。因此,您应该更改基础变量而不是 a 本身。

a=sym('a',[1,3]);
b = a(1)
a1 = 1; 
subs(b) % returns 1
subs(b, 'a1', a1) % returns 1
subs(a) % [ 1, a2, a3]

如果你想用它来代替solve操作的结果,最好的解决办法是使用subs with the output structure of solve as input:

sol = solve(a == [1 2 3], a);
subs(b, sol) % returns 1

请注意,您也可以手动构建此结构,如下所示:

sol.(char(a(1))) = 1 % sol.a1 = 1;