User Tools

Site Tools


gibson:teaching:fall-2014:math445:hw4solns

====== Differences ====== This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
gibson:teaching:fall-2014:math445:hw4solns [2014/10/21 12:40]
gibson created
gibson:teaching:fall-2014:math445:hw4solns [2014/10/23 09:09] (current)
gibson
Line 6: Line 6:
 <code matlab> <code matlab>
 function dollars = coincount(q,​ d, n) 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
 +</​code>​
 +
 +<code matlab>
 +>> coincount(18,​5,​12)
 +ans =
 +    5.6000
 +</​code>​
 +
 +Note: It would be good programming practice to check that arguments ''​q,​ d, n''​ all have integer values and emit and warning if not.
 +<code matlab>
 +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 end
 +</​code>​
 +
  
 **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. ​ **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. ​
 +
 +<code matlab>
 +function d = hms2decimal(h,​m,​s)
 +% compute decimal time from hours h, minutes m, and seconds s
 +  d = h + m/60 + s/3600;
 +end
 +</​code>​
 +
 +<code matlab>
 +>> hms2decimal(6,​27,​18)
 +ans =
 +    6.4550
 +</​code>​
  
 **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. ​ **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. ​
 +
 +<code matlab>
 +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
 +</​code>​
 +
 +First test ''​decimal2hms''​ by inverting the decimal time we got from ''​hms2decimal''​ for 6 hrs, 27 min, 18 sec.
 +<code matlab>
 +>> [h,m,s] = decimal2hms(6.455)
 +h =
 +     6
 +m =
 +    27
 +s =
 +   ​18.0000
 +</​code>​
 +Hooray! We get the same answer. Now evaluate 18.782 hours as asked
 +<code matlab>
 +>> [h,m,s] = decimal2hms(18.782)
 +h =
 +    18
 +m =
 +    46
 +s =
 +   ​55.2000
 +</​code>​
  
 **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''​. **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''​.
 +<code matlab>
 +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
 +</​code>​
 +<code matlab>
 +>> [x,y] = polar2cartesian(2,​pi/​6)
 +x =
 +    1.7321
 +y =
 +    1.0000
 +</​code>​
 +
  
 **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''​. **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''​.
 +
 +<code matlab>
 +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
 +</​code>​
 +
 +Test this code by inverting ''​x,​y''​ answer from previous problem. Should give us ''​r,​ theta = 2, pi/​6''​.
 +<code matlab>
 +>> [r, theta] = cartesian2polar(1.7321,​1)
 +r =
 +    2.0000
 +theta =
 +    0.5236
 +>> pi/6
 +ans =
 +    0.5236
 +</​code>​
 +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. **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.
 +<code matlab>
 +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
 +</​code>​
 +
 +Now test the code on the origin and (x,y) == (r cos theta, r sin theta) for theta ranging from -pi to pi
 +<code matlab>
 +>> [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
 +</​code>​
 +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. ​ **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. ​
 +
 +<code matlab>
 +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
 +</​code>​
 +A few non-comprehensive tests:
 +<code matlab>
 +>> 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
 +</​code>​
gibson/teaching/fall-2014/math445/hw4solns.1413920438.txt.gz · Last modified: 2014/10/21 12:40 by gibson