eval not working for a range of numbers

1 Ansicht (letzte 30 Tage)
Matthew Covington
Matthew Covington am 5 Apr. 2021
Beantwortet: Steven Lord am 6 Apr. 2021
I have typed a code for the position of a mechanism with 6 links using vector loop equations with Euler. My code works from theta2 = 0*pi/180 to 97*pi/180. It also works around 330 degrees and higher. Why does it not work at 98 degrees or higher?
clc,clear
format shortg
% known values
Crank = 0.10 ; % length in meters
AB = 0.20 ; % legnth in meters
BC = 0.113 ; % length in meters
Link4 = 0.35 ; % length in meters
theta2 = 0*pi/180 ; % radians
%% Position
% known vectors
Crank_ = Crank*[cos(theta2) sin(theta2) 0] ;
Ground1_ = [0.1646 0.0250 0] ; % O2 to O6, meters
Ground2_ = [0.197 -0.2262 0] ; % O2 to O4, meters
Ground3_ = [0.0324 -0.2512 0] ; % O6 to O4, meters
% create symbolic variables
syms thetaAB theta4
% set assumptions
assume(theta4 >= 0 & theta4 <= pi)
assume(thetaAB >= 0 & thetaAB <= pi/2)
thetaBC = thetaAB - 64*pi/180 ;
% convert to polar coordinates
[theta_g1,Ground1] = cart2pol(Ground1_(1),Ground1_(2)) ;
[theta_g2,Ground2] = cart2pol(Ground2_(1),Ground2_(2)) ;
[theta_g3,Ground3] = cart2pol(Ground3_(1),Ground3_(2)) ;
% set up equations
Pos1 = Ground2*cos(theta_g2) + Link4*cos(theta4) - Crank*cos(theta2) - AB*cos(thetaAB) ;
Pos2 = Ground2*1i*sin(theta_g2) + Link4*1i*sin(theta4) - Crank*1i*sin(theta2) - AB*1i*sin(thetaAB) ;
% solve
sol = solve(Pos1, Pos2, thetaAB, theta4) ;
thetaAB = eval(sol.thetaAB) ;
theta4 = eval(sol.theta4) ;
% second syms to find theta6 and O6_C
syms theta6 O6_C
assume(O6_C >= 0 & O6_C <= 0.24)
assume(theta6 >= 0 & theta6 <= pi)
% set up equations
Pos3 = Ground1*cos(theta_g1) + O6_C*cos(theta6) - Crank*cos(theta2) - AB*cos(thetaAB) - BC*cos(thetaBC) ;
Pos4 = Ground1*1i*sin(theta_g1) + O6_C*1i*sin(theta6) - Crank*1i*sin(theta2) - AB*1i*sin(thetaAB) - BC*1i*sin(thetaBC) ;
% solve
sol = solve(Pos3, Pos4, theta6, O6_C) ;
theta6 = eval(sol.theta6) ;
O6_C = eval(sol.O6_C) ;

Antworten (2)

Steven Lord
Steven Lord am 6 Apr. 2021
There's no need for eval.
% known values
Crank = 0.10 ; % length in meters
AB = 0.20 ; % legnth in meters
BC = 0.113 ; % length in meters
Link4 = 0.35 ; % length in meters
theta2 = 0*pi/180 ; % radians
%% Position
% known vectors
Crank_ = Crank*[cos(theta2) sin(theta2) 0] ;
Ground1_ = [0.1646 0.0250 0] ; % O2 to O6, meters
Ground2_ = [0.197 -0.2262 0] ; % O2 to O4, meters
Ground3_ = [0.0324 -0.2512 0] ; % O6 to O4, meters
% create symbolic variables
syms thetaAB theta4
% set assumptions
assume(theta4 >= 0 & theta4 <= pi)
assume(thetaAB >= 0 & thetaAB <= pi/2)
thetaBC = thetaAB - 64*pi/180 ;
% convert to polar coordinates
[theta_g1,Ground1] = cart2pol(Ground1_(1),Ground1_(2)) ;
[theta_g2,Ground2] = cart2pol(Ground2_(1),Ground2_(2)) ;
[theta_g3,Ground3] = cart2pol(Ground3_(1),Ground3_(2)) ;
% set up equations
Pos1 = Ground2*cos(theta_g2) + Link4*cos(theta4) - Crank*cos(theta2) - AB*cos(thetaAB) ;
Pos2 = Ground2*1i*sin(theta_g2) + Link4*1i*sin(theta4) - Crank*1i*sin(theta2) - AB*1i*sin(thetaAB) ;
% solve
sol = solve(Pos1, Pos2, thetaAB, theta4) ;
thetaAB = sol.thetaAB
thetaAB = 
theta4 = sol.theta4
theta4 = 
If you need the numeric values of thetaAB and theta4:
thetaAB_double = double(thetaAB)
thetaAB_double = 0.6297
thetaAB_vpa = vpa(thetaAB)
thetaAB_vpa = 
0.62968959483025850693174017557764
theta4_double = double(theta4)
theta4_double = 1.3850
theta4_vpa = vpa(theta4)
theta4_vpa = 
1.3850382471662801075251989294477

Image Analyst
Image Analyst am 5 Apr. 2021
Why are you even using eval at all instead of simply doing this:
thetaAB = sol.thetaAB;
theta4 = sol.theta4;
???
  2 Kommentare
Matthew Covington
Matthew Covington am 5 Apr. 2021
Bearbeitet: Matthew Covington am 5 Apr. 2021
I didn't know you could do that, my professor just told us to use eval whenever we solve using syms.
Image Analyst
Image Analyst am 5 Apr. 2021
I don't know. I don't use syms. He may be right. But do you need to use syms? Can't you define theta over some range with linspace() and do it numerically? What does this show:
whos sol

Melden Sie sich an, um zu kommentieren.

Produkte


Version

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by