필터 지우기
필터 지우기

how to correctly use the function "subs"

조회 수: 29 (최근 30일)
Tony Cheng
Tony Cheng 2024년 7월 24일 3:08
댓글: Umar 2024년 7월 24일 7:39
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