Использование функции Matlab subs - менее уродливый способ, который я нашел для этого. Вы получите матрицу 14x14 sym
:
A = repmat(V,1,14);
for j=1:14
y = double((1:14)==j);
A(:,j) = subs(A(:,j), 'Y[1]', y(1));
A(:,j) = subs(A(:,j), 'Y[2]', y(2));
A(:,j) = subs(A(:,j), 'Y[3]', y(3));
A(:,j) = subs(A(:,j), 'Y[4]', y(4));
A(:,j) = subs(A(:,j), 'Y[5]', y(5));
A(:,j) = subs(A(:,j), 'Y[6]', y(6));
A(:,j) = subs(A(:,j), 'Y[7]', y(7));
A(:,j) = subs(A(:,j), 'Y[8]', y(8));
A(:,j) = subs(A(:,j), 'Y[9]', y(9));
A(:,j) = subs(A(:,j), 'Y[10]', y(10));
A(:,j) = subs(A(:,j), 'Y[11]', y(11));
A(:,j) = subs(A(:,j), 'Y[12]', y(12));
A(:,j) = subs(A(:,j), 'Y[13]', y(13));
A(:,j) = subs(A(:,j), 'Y[14]', y(14));
end
Вы можете избавиться от всех строк, используя функцию eval
:
A = repmat(V,1,14);
for j=1:14
y = double((1:14)==j);
for k=1:14
A(:,j) = eval(sprintf('subs(A(:,j), ''Y[%d]'', y(%d));',k,k));
end
end
В столбце j
, мы заменяем Y[i]
на 1
if i==j
else 0
.
Test:
>> size(A)
ans =
14 14
>> A(:,10)
ans =
0
0
1
0
0
0
0
-(Tf*b_1 - Tf*b_2 + Tr*b_3 - Tr*b_4 - Tf*u1(t) + Tf*u2(t) - Tr*u3(t) + Tr*u4(t))/Ir
-(a_dis*b_1 + a_dis*b_2 - b_3*b_dis - b_4*b_dis - a_dis*u1(t) - a_dis*u2(t) + b_dis*u3(t) + b_dis*u4(t))/Ip
-(b_1 + b_2 + b_3 + b_4 - u1(t) - u2(t) - u3(t) - u4(t))/Ms
(b_1 - u1(t) + ku1*w1(t))/m_1
(b_2 - u2(t) + ku2*w2(t))/m_2
(b_3 - u3(t) + ku3*w3(t))/m_3
(b_4 - u4(t) + ku4*w4(t))/m_4