필터 지우기
필터 지우기

Converting from symbolic to numerical data

조회 수: 1 (최근 30일)
Bright
Bright 2023년 11월 7일
편집: John D'Errico 2023년 11월 7일
I tried using double to convert from symbolic to numerical data but it is giving me the wrong answer.
syms A B C D theta(t) omega1(t) alpha1(t) t
assume([A B C D],"real")
Displacement analysis
syms beta(t) phi(t)
%for equilibrium, sum of displacement component on x and y axis must
%respectively be equal to zero
xdisp = A*cos(theta) + B*cos(beta) - C*cos(phi) - D == 0;
ydisp = A*sin(theta) + B*sin(beta) - C*sin(phi) == 0;
[angB,angD] = solve([xdisp,ydisp],[beta(t),phi(t)])
Warning: Solutions are only valid under certain conditions. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
angB = 
angD = 
angB = simplify(angB);
angD = simplify(angD);
Velocity analysis
xvel = diff(xdisp,t);
yvel = diff(ydisp,t);
syms omega2(t) omega3(t)
xvel = subs(xvel,[diff(beta(t), t),diff(phi(t), t),diff(theta(t), t)],[omega2(t),omega3(t),omega1(t)]);
yvel = subs(yvel,[diff(beta(t), t),diff(phi(t), t),diff(theta(t), t)],[omega2(t),omega3(t),omega1(t)]);
[velB,velD] = solve([xvel,yvel],[omega2(t),omega3(t)]);
velB = simplify(velB);
velD = simplify(velD);
Acceleration analysis
xacc = diff(xvel,t);
yacc= diff(yvel,t);
syms alpha2(t) alpha3(t)
xacc = subs(xacc,[diff(omega1(t),t),diff(omega2(t),t),diff(omega3(t),t),diff(beta(t),t),diff(phi(t),t),diff(theta(t),t)],[alpha1(t),alpha2(t),alpha3(t),omega2(t),omega3(t),omega1(t)]);
yacc = subs(yacc,[diff(omega1(t),t),diff(omega2(t),t),diff(omega3(t),t),diff(beta(t),t),diff(phi(t),t),diff(theta(t),t)],[alpha1(t),alpha2(t),alpha3(t),omega2(t),omega3(t),omega1(t)]);
[accB,accD] = solve([xacc,yacc],[alpha2(t),alpha3(t)]);
accB = simplify(accB);
accD = simplify(accD);
Numerical values of the displacement, velocity and acceleration
angB = subs(angB,[A B C D theta(t) omega1(t) alpha1(t)],[300 360 360 600 30 10 -30]);
angD = subs(angD,[A B C D theta(t) omega1(t) alpha1(t)],[300 360 360 600 30 10 -30]);
angB = simplify(angB)
angB = 
angD = simplify(angD)
angD = 
angulardisp1 = double(angB)
angulardisp1 = 2×1
1.0024 -0.0194
If i use calculator to check th answer of angB it gives 35.12 which is correct but if i use double to convert the symbolic data to numerical data it gives 1.0024 which is wrong.

채택된 답변

John D'Errico
John D'Errico 2023년 11월 7일
편집: John D'Errico 2023년 11월 7일
Do you understand that sin and cos assume RADIANS, NOT degrees? But you are substituting in angles that are clearly in terms of DEGREES.
angB = subs(angB,[A B C D theta(t) omega1(t) alpha1(t)],[300 360 360 600 30 10 -30]);
There is a difference, and it is important.
help sin
SIN Sine of argument in radians. SIN(X) is the sine of the elements of X. See also ASIN, SIND, SINPI. Documentation for sin doc sin Other uses of sin codistributed/sin fixedpoint/sin sym/sin tabular/sin dlarray/sin gpuArray/sin symbolic/sin
MATLAB cannot know that you think of angles in terms of degrees, since it cannot read your mind. Even after all these years, the mindreading toolbox is still in the debugging phase.
You can convert degrees to radians by multiplying by pi/180, or you can use the deg2rad function to do it for you. For example, 30 degrees is pi/6 radians.
  댓글 수: 1
Cris LaPierre
Cris LaPierre 2023년 11월 7일
To add on to this answer, either substitute radian degress, or use cosd and sind to define xdisp and ydisp.
syms A B C D theta(t) omega1(t) alpha1(t) t
assume([A B C D],"real")
syms beta(t) phi(t)
%for equilibrium, sum of displacement component on x and y axis must
%respectively be equal to zero
xdisp = A*cosd(theta) + B*cosd(beta) - C*cosd(phi) - D == 0;
ydisp = A*sind(theta) + B*sind(beta) - C*sind(phi) == 0;
[angB,angD] = solve([xdisp,ydisp],[beta(t),phi(t)]);
Warning: Solutions are only valid under certain conditions. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
angB = simplify(angB);
angD = simplify(angD);
xvel = diff(xdisp,t);
yvel = diff(ydisp,t);
syms omega2(t) omega3(t)
xvel = subs(xvel,[diff(beta(t), t),diff(phi(t), t),diff(theta(t), t)],[omega2(t),omega3(t),omega1(t)]);
yvel = subs(yvel,[diff(beta(t), t),diff(phi(t), t),diff(theta(t), t)],[omega2(t),omega3(t),omega1(t)]);
[velB,velD] = solve([xvel,yvel],[omega2(t),omega3(t)]);
velB = simplify(velB);
velD = simplify(velD);
xacc = diff(xvel,t);
yacc= diff(yvel,t);
syms alpha2(t) alpha3(t)
xacc = subs(xacc,[diff(omega1(t),t),diff(omega2(t),t),diff(omega3(t),t),diff(beta(t),t),diff(phi(t),t),diff(theta(t),t)],[alpha1(t),alpha2(t),alpha3(t),omega2(t),omega3(t),omega1(t)]);
yacc = subs(yacc,[diff(omega1(t),t),diff(omega2(t),t),diff(omega3(t),t),diff(beta(t),t),diff(phi(t),t),diff(theta(t),t)],[alpha1(t),alpha2(t),alpha3(t),omega2(t),omega3(t),omega1(t)]);
[accB,accD] = solve([xacc,yacc],[alpha2(t),alpha3(t)]);
accB = simplify(accB);
accD = simplify(accD);
angB = subs(angB,[A B C D theta(t) omega1(t) alpha1(t)],[300 360 360 600 30 10 -30]);
angD = subs(angD,[A B C D theta(t) omega1(t) alpha1(t)],[300 360 360 600 30 10 -30]);
angB = simplify(angB);
angD = simplify(angD)
angD = 
angulardisp1 = double(angB)
angulardisp1 = 2×1
35.1162 -82.7042

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Number Theory에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by