# Having problems with function theta = acosfull(x,y) command

4 views (last 30 days)
Thomas on 12 Sep 2013
Edited: Walter Roberson on 28 Oct 2018
Consider the inverse (arc) cosine function cos−1(z), where z = x / r, r = (x2 + y2 )1/2 in the x-y Cartesian coordinate plane and −1≤ z ≤ +1 . The MATLAB inverse sine function acos(z) returns values only in the range 0 ≤ cos−1(z) <π (i.e., only in the first and second quadrants); however, we want to have the value in the correct quadrant over the full range 0 ≤ cos−1(z) < 2π . Write a MATLAB function m-file to solve this problem. Your function must be defined as follows:
function theta = acosfull(x,y)
in which the x and y coordinates are the input arguments and theta is the output angle in radians in the correct quadrant over the range 0 < theta < 2*pi. You may assume that the values of the input arguments passed to your function are double precision real numbers. Your program should include trapping for invalid computation cases (e.g., x=y=0), in which event it should assign a value of 0 to theta and display an appropriate error message on the screen.
(NOTE: You may use the MATLAB built-in acos function in your code.)
This is the code I have so far:
function [theta] = acosfull(x,y)
if r==sqrt(x^2 + y^2);
z=x/r;
acos(z);
else y == x && y == 0
theta=0
disp('Error.')
end
I keep receiving the error message:
Undefined function 'acosfull' for input
arguments of type 'double'.

Roger Stafford on 12 Sep 2013
Edited: Roger Stafford on 12 Sep 2013
In your code as it stands the variable 'r' is never defined, but matlab is asked to make computations with it. No wonder it gets upset.
Consider what it is about your inputs x and y that distinguishes between the first or second quadrants on the one hand and the fourth and third quadrants on the other hand. What aspect of the variable 'y' allows you to make this distinction - hint, hint!
As a side remark, matlab has a function 'atan2' which almost does everything being asked for, but I would imagine your teacher would frown on its use in this problem. You are clearly expected to use 'acos' but to use it in an appropriate way.

Jan on 12 Sep 2013
Edited: Jan on 12 Sep 2013
While there are problems inside the function also, as Roger has explained already, the message:
Undefined function 'acosfull' for input arguments of type 'double'
means, that the corresponding M-file is neither found in the folders contains in Matlab's path nor in the current folder. Where did you save the M-file and how is it called?
Btw., due to the limited numerical precision, it is very unlikely that the condition r==sqrt(x^2 + y^2) is ever met. Better use a certain interval, e.g.:
if abs(r - sqrt(x^2 + y^2)) < 10 * eps(r)
##### 1 CommentShow NoneHide None
Walter Roberson on 12 Sep 2013
Ensure that the .m file is named acosfull.m

theodore panagos on 28 Oct 2018
Edited: Walter Roberson on 28 Oct 2018
For acos(x,y) you can use the formula :
f(x,y)=pi-pi/2*(1+sgn(x))*(1-sgn(y^2))-pi/4*(2+sgn(x))*sgn(y) -sgn(abs(x)-abs(y))*sgn(x*y)*acos((abs(x)+abs(y))/sqrt(2*x^2+2*y^2))
x=x2-x1 and y=y2-y1

### Categories

Find more on Discrete Math 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!

Translated by