how to correctly use the function "subs"

38 views (last 30 days)
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 Comments
Tony Cheng
Tony Cheng on 24 Jul 2024
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 on 24 Jul 2024
No problem, Tony, glad to help you out. Please let us know if you have any further questions.

Sign in to comment.

Accepted Answer

Piyush Kumar
Piyush Kumar on 24 Jul 2024
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 Comment
Tony Cheng
Tony Cheng on 24 Jul 2024
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

Sign in to comment.

More Answers (0)

Tags

Products

Community Treasure Hunt

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

Start Hunting!