How to make a function that returns the difference between the passed function's max and min value given a range of the independent variable?

I was given the task to develop a function M-file that returns the difference between the passed function's maximum and minimum value given a range of the independent variable. In addition, I have to make the function generate a plot of the function for range. I was given three instances to test my M-file.
a.) f(t) = 8e^(-0.25t)sin(t - 2) , from t=0 to 6pi
b.) f(x) = e^(4x)sin(1/x) , from x =0.01 to 0.02
c.) The built in humps function from x = 0 to 2
I found the exact problem on Chegg, but it provides absolutely no explanation of the code and I would really like to be able to understand this problem. I hope someone can help!

4 Comments

Sounds/looks too much like homework..."show your work first and then ask specific questions where get stuck" is the general way such problems are handled on the forum.
Question: Does the function design stipulate how accurate the solution in the independent variable must be?
No it is not homework. It was a task given to us by my instructor if we wanted more practice. And no, I provided all information that was given to me.
So far my friend and I have gotten this;
function ht = func(f,a,b,int,varagin)
x = linspace(a,b,int);
y = f(x,varagin{:});
ht = max(y) - min(y);
fplot(f,[a,b],varagin{:})
Here f would = my function, a would be lower limit, b is my upper and int would be my number of intervals. But, I keep getting an error with:
x = linspace(a,b,int);
I am not sure what my error would be
We're not either since I didn't run it and you forgot to post the error. It looks a lot more complicated than my solution below though.

Sign in to comment.

 Accepted Answer

Hint: You need to use * for when you multiply, and use exp() for e^, and you can use linspace() to get a bunch of values for t between some starting and stopping values.
t=linspace(0,6*pi, 1000); % Get 1000 values of t
f = 8 * exp(-0.25*t).*sin(t - 2);
plot(t, f);
grid on;
I'm assuming you know how to use min() and max() and how to subtract the values they return.

2 Comments

But my goal is to write a function that returns the min and max values. I know how to plot the equation.
I though you knew how to use min and max also. To use the min and max functions, you do it like this:
minValue = min(f);
maxValue = max(f);
message = sprintf('The min value = %f\nThe max value = %f', minValue, maxValue);
uiwait(helpdlg(message));
To do an entire function you'd have this:
function [minValue, maxValue] = FindMinAndMax(t1, t2)
t=linspace(t1, t2, 1000); % Get 1000 values of t
f = 8 * exp(-0.25*t).*sin(t - 2);
plot(t, f);
grid on;
minValue = min(f);
maxValue = max(f);
message = sprintf('The min value = %f\nThe max value = %f', minValue, maxValue);
uiwait(helpdlg(message));
To call it, you'd do
[minValue, maxValue] = FindMinAndMax(0, 6*pi)
Does that explain it enough? Repeat for all the other functions.

Sign in to comment.

More Answers (2)

Hint: fminbnd and fplot could be useful commands here.

3 Comments

fminbnd had trouble w/ the first one; didn't try the others...
Probably because fminbnd is finding local minima. To avoid this, you would do a sample search, similar to what ImageAnalyst proposes with linspace, to get a tighter interval around the global solution.
"...because fminbnd is finding local minima..."
Yes, precisely. fminsearch, otoh, does fine on this one (again, didn't try the rest).
ADDENDUM OTOH, given that one can give a full range as input to fminbnd, one would hope it were more robust than it appears to be; this isn't a very difficult function and to get stuck way over to the right just seems wrong behavior. END ADDENDUM
I simply mentioned it so the OP wouldn't (hopefully) just "plug 'n play" and find other than happiness on proud submittal.

Sign in to comment.

There is only one possible strategy for the question as phrased: you need to test every representable number between the two bounds. If you test 343.93244934231250908851507119834423065185546875 but not 343.93244934231250908851507119834423065185546875 + 5.684341886080801486968994140625e-14 then you might miss the global minima or global maxima, because the function might be (for example)
f = @(x) x - realmax .* (x == 343.932449342312565931933932006359100341796875);
You need to test ever single representable number -- unless, that is, there are some particular guarantees on the form of the function, such as it being a polynomial.

Categories

Find more on Environment and Settings in Help Center and File Exchange

Asked:

on 9 Feb 2016

Edited:

dpb
on 11 Feb 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!