How to vary angles at constant rate in a kinematics problem?
21 views (last 30 days)
Show older comments
o2 = [0, 0, 0]; % Origin
ain = [26,0,0]; % Initial vector
input_axis = [0,1,0]; % Axis of rotation (z-axis)
theta1 = deg2rad(157.5); % Angle of rotation in radians
% Rotation matrix function
rot_matrix = @(axis, theta) cos(theta) * eye(3) + ...
sin(theta) * [0, -axis(3), axis(2); axis(3), 0, -axis(1); -axis(2), axis(1), 0] + ...
(1 - cos(theta)) * (axis' * axis);
% Compute the rotated vector
a_rotated = rot_matrix(input_axis, theta1) * (ain' - o2') + o2';
% Transpose to row vector for display
a_rotated = a_rotated';
a_final=a_rotated;
bin=[29.5,46,0];
o4=[13.5,46,0];
output_axis=[0,1,0];
theta2= deg2rad(105);
b1_rotated = rot_matrix(output_axis, theta2) * (bin' - o4') + o4';
b1_final=b1_rotated';
u3=[0,0,1];
c1=[125,0,0];
% Compute the rotated vector in terms of phi
syms phi;
rot_matrix_phi = rot_matrix(u3, phi);
c1_afinal_rotated = rot_matrix_phi * (c1 - a_final)'+a_final' ;
c1_afinal_rotated = c1_afinal_rotated'; % Transpose to row vector for display
o4o2=o4-o2;
%disp(o4o2);
coupler=(c1_afinal_rotated-b1_final);
% Define the initial rotated components of the coupler
syms phi;
coupler = subs(coupler, conj(phi), phi);
%disp('Coupler vector without conjugate:');
disp(coupler);
% Parametric substitution
syms t;
cos_phi = (1 - t^2) / (1 + t^2);
sin_phi = 2 * t / (1 + t^2);
% Substitute parametric forms into coupler components
coupler_parametric = subs(coupler, [cos(phi), sin(phi)], [cos_phi, sin_phi]);
% Display the parametric coupler
disp('Parametric form of coupler:');
disp(coupler_parametric);
syms targetvalue % it might be 3.5 ...
normsq = expand(sum(coupler_parametric.^2) - targetvalue^2);
normpoly = simplify(normsq*(t^2+1)^2);
vpa(expand(normpoly),4);
tsolve = solve(normpoly,t,'maxdegree',4,'returnconditions',true);
h=vpa(subs(tsolve.t,targetvalue, 106));
%disp(h);
real_solutions = h(imag(h) == 0);
disp('Real roots:');
disp(real_solutions);
% Convert real values of t to angles using angle = 2 * atan(t)
angles_rad = 2 * atan(real_solutions);
angles_deg = rad2deg(angles_rad);
% Display angles in degrees
disp('Angles in degrees before adjustment:');
disp(angles_deg);
phi=double(angles_rad(1));
p=double(angles_deg(1));
c1_position = double(rot_matrix(u3, phi) * (c1' - a_final') + a_final');
p=(c1_position'-a_final)';
disp(p');
disp(p(2)/norm(c1_position'-a_final));
final_angle_phi=acosd(p(2)/norm(c1_position'-a_final)); % angle with y axis
disp(final_angle_phi) ;
disp(norm(c1_position'-b1_final));
disp(norm(a_rotated-o2));
%% in this code i want to change theta1 at rate of 90deg/sec and theta2 at rate of 60 deg/sec varying from 0 to 360 deg and want to calculate corresponding value of final_angle_phi with the y axis
%please help someone
3 Comments
Deepak Gupta
on 6 Jun 2024
You should not need to write a for loop. Matlab works on vectors and matrices. So just define time as a vector and calculate corresponding theta values. i.e.
t = 0:0.01:10;
theta1 = 90 * t;
theta2 = 60 * t;
Accepted Answer
Aquatris
on 6 Jun 2024
Edited: Aquatris
on 6 Jun 2024
For loops are easy to understand but as mentioned in comments, once you understand the logic you should vectorize it. The basic idea is as follow:
t = 0:0.01:4; % 4 seconds since 90*4 = 360, meaning theta1 goes from 0 to 360
theta1_vec = deg2rad(90*t); % array with theta1 angles at 0 sec upto 4 sec
theta2_vec = deg2rad(60*t); % array with theta2 angles at 0 sec upto 4 sec
for i = 1:length(t)
theta1 = theta1_vec(i);
theta2 = theta2_vec(i);
%%====rest of your code======%%
% store values you want as array
final_angle_phi(i)=acosd(p(2)/norm(c1_position'-a_final));
end
0 Comments
More Answers (0)
See Also
Categories
Find more on Number Theory in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!