how to correctly use the function "subs"

29 次查看(过去 30 天)
Hi there,
I am using subs to replace some symbols in a symbolic expression Jacobian_mtx_1. The symbols that I want to be replaced are A, B and C, which are a 6*1 symbolic vector, a symbolic scalar, and a 2*1 symbolic vector, respectively. I write the code:
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , { A , B , C } , { A_val ,B_val , C_val } ) ;
where A_val is a 6*1 vector containing 6 function calls, B_val is a numeric scalar, and C_val is a 2*1 numeric vector.
However, the software reminds me that
Errors using sym/subs
Entries in second argument must be scalar.
Could anyone tell me how to resolve this issue?
Many thanks!
  3 个评论
Tony Cheng
Tony Cheng 2024-7-24,6:47
Hi Umar,
Many thanks to your reply! I think your way is feasible, but the following manner is a little bit easier
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , A , A_all ) ;
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , B , B_val ) ;
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , C , C_val) ;
cause on
it says If old and new are both vectors or cell arrays of the same size, subs replaces each element of old with the corresponding element of new.
Then we can use vector replacements directly.
Cheers
Umar
Umar 2024-7-24,7:39
No problem, Tony, glad to help you out. Please let us know if you have any further questions.

请先登录,再进行评论。

采纳的回答

Piyush Kumar
Piyush Kumar 2024-7-24,4:07
Hi Tony,
I tried reproducing the issue you are facing -
syms B
A = sym('A', [6 1]);
C = sym('C', [2 1]);
A_val = [1, 2, 3, 4, 5, 6];
B_val = 7;
C_val = [8, 9];
Jacobian_mtx_1 = [A(1)*B + C(1), A(2), A(3);
A(4), A(5)*B + C(2), A(6);
B, C(1), C(2)];
disp(Jacobian_mtx_1);
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , { A , B , C } , { A_val ,B_val , C_val } ) ;
Error using sym/subs (line 156)
Entries in second argument must be scalar.
Instead of directly replacing A and C with vectors, I tried replacing the elements one by one and it wokred for me -
syms B
A = sym('A', [6 1]);
C = sym('C', [2 1]);
A_val = [1, 2, 3, 4, 5, 6];
B_val = 7;
C_val = [8, 9];
Jacobian_mtx_1 = [A(1)*B + C(1), A(2), A(3);
A(4), A(5)*B + C(2), A(6);
B, C(1), C(2)];
disp(Jacobian_mtx_1);
for i = 1:length(A)
Jacobian_mtx_1 = subs(Jacobian_mtx_1, A(i), A_val(i));
end
for i = 1:length(C)
Jacobian_mtx_1 = subs(Jacobian_mtx_1, C(i), C_val(i));
end
% Now replace B
Jacobian_mtx_1 = subs(Jacobian_mtx_1, B, B_val);
disp(Jacobian_mtx_1);
  1 个评论
Tony Cheng
Tony Cheng 2024-7-24,6:47
Hi Kumar,
Many thanks to your reply! I think your way is feasible, but the following manner is a little bit easier
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , A , A_all ) ;
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , B , B_val ) ;
Jacobian_mtx_1 = subs( Jacobian_mtx_1 , C , C_val) ;
cause on
it says If old and new are both vectors or cell arrays of the same size, subs replaces each element of old with the corresponding element of new.
Then we can use vector replacements directly.
Cheers

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Symbolic Math Toolbox 的更多信息

标签

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by