3 views (last 30 days)

w=30; x=60; y=45; z=90; u=35; v=75;

% "w,x,y,z are known" and "u and v are free choices". %

a12_c=cosd(w); a12_s=sind(w); a13_c=cosd(x); a13_s=sind(x);

b12_c=cosd(y); b12_s=sind(y); b13_c=cosd(z); b13_s=sind(z);

c12_c=cosd(u); c12_s=sind(u); c13_c=cosd(v); c13_s=sind(v);

A=[1 0 1 0 -1 0; 0 1 0 1 0 -1; a12_c -a12_s c12_c -c12_s -b12_c b12_s;...

a12_s a12_c c12_s c12_c -b12_s -b12_c; a13_c -a13_s c13_c -c13_s -b13_c b13_s;...

a13_s a13_c c13_s c13_c -b13_s -b13_c];

B=[1 0 1 0 1 0]';

% disp(A); disp(B);

X=A\B; % X=[P Q R S T U]';

disp('The required matrix is:')

disp(X);

P=X(1,1); Q=X(2,1); R=X(3,1); S=X(4,1); T=X(5,1); U=X(6,1);

a=sqrt(P.^2 + Q.^2); b=sqrt(R.^2 + S.^2); c=sqrt(T.^2 + U.^2);

disp('The link lengths are:');

fprintf('a= %.3f \n',a); fprintf('b= %.3f \n',b);

fprintf('c= %.3f \n',c); fprintf('d= 1\n');

theta1_1_a= acosd(P/a); theta1_1_b=-theta1_1_a;

theta1_2_a= asind(Q/a); theta1_2_b=180-theta1_2_a;

theta=0;

fprintf('theta1_1_a= %.2f \n',theta1_1_a);

fprintf('theta1_1_b= %.2f \n',theta1_1_b);

fprintf('theta1_2_a= %.2f \n',theta1_2_a);

fprintf('theta1_2_b= %.2f \n',theta1_2_b);

if theta1_1_a==theta1_2_a || theta1_1_a==theta1_2_b

theta=theta1_1_a;

fprintf('theta= %.2f\n', theta1_1_a);

elseif (theta1_1_b==theta1_2_a) || (theta1_1_b==theta1_2_b)

theta=theta1_1_b;

end

fprintf('theta= %.2f\n', theta);

John D'Errico
on 25 Jun 2020

Without even trying to exceute your code...

You set theta to zero.

The value of theta will ONLY ever be changed if a test is satisfied for exact equality between two floating point numbers. So tests like this:

if theta1_1_a==theta1_2_a || theta1_1_a==theta1_2_b

Now, l'll look at the result of your code.

[theta1_1_a, theta1_2_a]

ans =

64.4196851608345 -64.4196851608345

>> [theta1_1_a, theta1_2_b]

ans =

64.4196851608345 244.419685160834

So that test must fail.

Then you have an elseif clause.

elseif (theta1_1_b==theta1_2_a) || (theta1_1_b==theta1_2_b)

Is it satisfied?

[theta1_1_b, theta1_2_a]

ans =

-64.4196851608345 -64.4196851608345

Gosh, it looks like they are the same numbers. Are they really the same?

[theta1_1_b == theta1_2_a]

ans =

logical

0

theta1_1_b - theta1_2_a

ans =

1.4210854715202e-14

As you can see, they are not in fact identical.

NEVER TEST FOR EXACT EQUALITY BETWEEN FLOATING POINT NUMBERS. At least not until you truly understand why I just told you not to do so, and you understand when you can expect such a test to be valid. And even then, be careful.

Learn to use tolerances.

Geoff Hayes
on 25 Jun 2020

Srinjoy - the problem is that you are using the equality operator when comparing floats. Look at your conditions for the if/elseif

if theta1_1_a==theta1_2_a || theta1_1_a==theta1_2_b

theta=theta1_1_a;

fprintf('theta= %.2f\n', theta1_1_a);

elseif (theta1_1_b==theta1_2_a) || (theta1_1_b==theta1_2_b)

theta=theta1_1_b;

end

See Avoiding Common Problems with Floating-Point Arithmetic for details. When comparing floats, you can use a tolerance check

if abs(theta1_1_a - theta1_2_a) < eps || abs(theta1_1_a - theta1_2_b) < eps

theta=theta1_1_a;

fprintf('theta= %.2f\n', theta1_1_a);

elseif abs(theta1_1_b - theta1_2_a) < eps || abs(theta1_1_b - theta1_2_b) < eps

theta=theta1_1_b;

end

Try the above and see what happens!

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.