how to correctly use the function "subs"

38 Ansichten (letzte 30 Tage)
Tony Cheng
Tony Cheng am 24 Jul. 2024
Kommentiert: Umar am 24 Jul. 2024
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 Kommentare
Tony Cheng
Tony Cheng am 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 am 24 Jul. 2024
No problem, Tony, glad to help you out. Please let us know if you have any further questions.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Piyush Kumar
Piyush Kumar am 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 Kommentar
Tony Cheng
Tony Cheng am 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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Tags

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by