====== Math 445 HW4 solutions====== **Problem 1:** Write a function ''coincount'' that computes the dollar value of a number of quarters, dimes, and nickels. Use it to compute the dollar value of 18 quarters, 5 dimes, and 12 nickels. function dollars = coincount(q, d, n) % return dollar value of q quarters, d dimes, and n nickels dollars = 0.25*q + 0.10*d + 0.05*n; end >> coincount(18,5,12) ans = 5.6000 Note: It would be good programming practice to check that arguments ''q, d, n'' all have integer values and emit and warning if not. function dollars = coincount(q, d, n) % return dollar value of q quarters, d dimes, and n nickels if q != round(q) || d != round(d) || n != round(n) fprintf('error: arguments q,d,n should all have integer values'); dollars = 0.25*q + 0.10*d + 0.05*n; end **Problem 2:** Write a function ''hms2decimal'' that converts a time in hours, minutes, and seconds and converts it to hours in decimal. Use it to calculate the decimal equivalent of 6 hours, 27 minutes, and 18 seconds. function d = hms2decimal(h,m,s) % compute decimal time from hours h, minutes m, and seconds s d = h + m/60 + s/3600; end >> hms2decimal(6,27,18) ans = 6.4550 **Problem 3:** Write a function ''decimal2hms'' that converts a time in decimal hours to hours, minutes, and seconds. Use it to compute the hours, minute, and seconds equivalent of 18.782 hours. function [h,m,s] = decimal2hms(t) % compute hours h, minutes m, and seconds s from time t in decimal hours % change all times to positive for ease of conversion sig = sign(t); t = abs(t); % at this point t = xxx.xxxxx hours h = floor(t); % get # hours by rounding t down to next integer t = t - h; % remove integer hour part, so that t is 0.xxxxx hr t = t*60; % convert t to minutes: 0.xxxx hr * 60 min/hr = yy.yyy min m = floor(t); % get # minutes by rounding t down to next integer t = t - m; % remove integer hour part, so that t is 0.yyy min t = t*60; % convert t to seconds: 0.yyyy min * 60 sec/min = zz.zzz min s = t; % no further conversion, so keep decmial part of seconds end First test ''decimal2hms'' by inverting the decimal time we got from ''hms2decimal'' for 6 hrs, 27 min, 18 sec. >> [h,m,s] = decimal2hms(6.455) h = 6 m = 27 s = 18.0000 Hooray! We get the same answer. Now evaluate 18.782 hours as asked >> [h,m,s] = decimal2hms(18.782) h = 18 m = 46 s = 55.2000 **Problem 4:** Write a function ''polar2cartesian'' that converts polar coordinates ''r, theta'' to Cartesian coordinates ''x,y''. Use it to compute the Cartesian coordinates of ''r=2, theta=pi/6''. fucntion [x,y] = polar2cartesian(r, theta); % convert polar (r,theta) coordinates to Cartesian (x,y) x = r*cos(theta); y = r*sin(theta); end polar2cartesian >> [x,y] = polar2cartesian(2,pi/6) x = 1.7321 y = 1.0000 **Problem 5:** Write a function ''cartesian2polar'' that converts Cartesian coordinates ''x,y'' to polar coordinates ''r, theta''. Use it to compute the polar coordinates of ''x=2, y=3''. Hint: use the arctangent function ''atan'' to compute ''theta'' from ''x'' and ''y''. function [r, theta] = cartesian2polar(x, y) % convert Cartesian coordinates (x,y) to polar (r, theta) r = sqrt(x^2 + y^2) theta = atan(y/x) end Test this code by inverting ''x,y'' answer from previous problem. Should give us ''r, theta = 2, pi/6''. >> [r, theta] = cartesian2polar(1.7321,1) r = 2.0000 theta = 0.5236 >> pi/6 ans = 0.5236 Yay! **Problem 6:** Are there any values of ''x,y'' for which your function from problem 4 fails? Try these values of ''(x,y)'': ''(1,0), (-1,0), (0,0)''. Revise ''cartesian2polar'' function to fix these the problems these examples point out using ''if-else'' statements, so that your function gives correct ''r, theta'' values for all ''x,y'' values. function [r, theta] = cartesian2polar(x, y) % convert Cartesian coordinates (x,y) to polar (r, theta) r = sqrt(x^2 + y^2); % the computation atan(y/x) is problematic for x == 0, so spell out % possible cases without doing this division if x == 0 if y == 0 % x,y is origin => theta is arbitray, set it to zero theta = 0.0; elseif y>0 % x,y is on positive y axis, set theta to pi/2 theta = pi/2; else % x,y is on negative y axis, set theta to -pi/2 theta = -pi/2; end % for x ~= 0, there are still possible problems with atan(y/x) since % x,y == -1,-1 in 3rd quadrant will produce the same theta as x,y == 1,1, % which is in the 1st quadrant!! Experimenting with Matlab's atan function % a bit shows it returns atan(theta) in the range -pi/2 to /pi/2 (4th and % 1st quadrants). So we have to adjust theta if x,y falls in the 2nd or % 3rd quadrant. else theta = atan(y/x); % produces theta in 1st or 2nd quadrant if x <= 0 & y>=0 % x,y is really in 2nd quadrant theta = theta + pi; % add pi to move theta from 4th to 2nd quadrant elseif x => 0 & y<=0 % x,y is really in 3rd quadrant theta = theta + pi; % subtract pi to move theta from 1st to 3rd quadrant end % theta will now fall in the range -pi to pi. end Now test the code on the origin and (x,y) == (r cos theta, r sin theta) for theta ranging from -pi to pi >> [r,theta] = cartesian2polar(0,0) r = 0 theta = 0 >> r=1; theta=-pi; [r,theta] = cartesian2polar(r*cos(theta),r*sin(theta)) r = 1 theta = -3.1416 >> r=1; theta=-3*pi/4; [r,theta] = cartesian2polar(r*cos(theta),r*sin(theta)) r = 1 theta = -2.3562 etc. Continuing around the unit circle in steps of delta theta = pi/4, it gets them all right. **Problem 7:** Write a ''tempconvert'' function that converts a temperature in any of C, F,or K units and converts it to any desired units. The function should take a single input argument ''t''. It should then prompt the user for the units of ''t'' using an ''input'' statement, prompt again for the desired units of the output, print a statement using ''fprintf'' of the form ''67 F is equivalent to 292.594 K'' (where the numbers and units depend on the input values), and then return the numerical value of the temperature in the desired output units. If the input temperature is below absolute value, the program should print an error message and return absolute zero in the desired units. function Tout = tempconvert2(Tin) % convert input temperature T from any of K,C,F units to any of same units. uin = input('Enter the current units of temperature, K, C, or F: ', 's'); % convert input temperature T to Celsius switch uin case 'C' T = Tin; case 'F' T = (Tin-32)*(5/9); case 'K' T = Tin-273.15; otherwise disp('Input unit is not valid. Returning NaN.') T = NaN; end if T < -273.15 disp('Warning: temperature is less than absolute zero') end uout = input('Enter the unit you want to convert to, K, C, or F: ', 's'); % convert T from Celsiss to output units switch uout case 'C' Tout = T; case 'F' Tout = (9/5)*T+32; case 'K' Tout = T + 273; otherwise disp('Output unit is not valid. Returning NaN.') Tout = NaN; end fprintf('%d %s is equivalent to %d %s\n', Tin, uin, Tout, uout) end A few non-comprehensive tests: >> T = tempconvert(0) Enter the current units of temperature, K, C, or F: C Enter the unit you want to convert to, K, C, or F: F 0 C is equivalent to 32 F T = 32 >> T = tempconvert(0) Enter the current units of temperature, K, C, or F: K Enter the unit you want to convert to, K, C, or F: C 0 K is equivalent to -2.731500e+02 C T = -273.1500