MATLAB Implementing Bisection Method in Matlab: Troubleshooting Error Message

AI Thread Summary
The discussion centers on troubleshooting an error in a Matlab implementation of the Bisection Method, specifically the "Undefined function 'f' for input arguments of type 'double'" message. The issue arises because the function 'f' must be defined in a separate file or as an anonymous function within the script. Suggestions include converting the script into a function file or using an anonymous function defined at the top of the script. Additionally, participants clarify that to find the root, the value of 'c' should be displayed, while 'f(c)' will indicate how close the solution is to zero. Adjustments to iteration limits and initial values are also recommended for better convergence.
renolovexoxo
Messages
23
Reaction score
0
Here is the code I have, but I keep getting the error message: Undefined function 'f' for input arguments of type 'double'.

I don't know what I have that is causing this. Does anybody see what's wrong with my code?

MaxIt = 1000;
epsilon = 10^-5;
a=1;
b=2;
c = (b+a)/2;
NumIt = 0;
while NumIt< MaxIt && abs(f(c))>epsilon
if f(a)*f(c) < 0
b = c;
else
a = c;
end
NumIt = NumIt + 1;
c = (b+a)/2;
end
end
function y = f(x)
y = exp(x)-2^-x+2*cos(x)-6;
end
Undefined function 'f' for input arguments of type 'double'.
 
Physics news on Phys.org
As written, you would need to store your function f(x) in a separate Matlab file named f.m. You can't have local functions in a Matlab script file. You can have local functions in a Matlab function file, so one way to avoid having a separate file for that tiny function is to turn your script into a Matlab function.

This is such a short and simple function that may not even want to do that. Another option is to use an anonymous function instead. Define f(x) via f = @(x) exp(x)-2^-x+2*cos(x)-6; You'll need to put this near the top of your script rather than at the bottom.
 
Okay, that worked great! Thank you.

Last question, just because I have a hard time in Matlab.
When I'm looking at the solution, do I want to display c or f(c) to get the root? It would be c, correct?
 
c, of course. f(c) will be close to zero -- in this case. Try this, however:
  • Change MaxIt to 1024 or so (adjust downward if you get divide by zero).
  • Change the initial value of a from +1 to -1.
  • Change your function to f = @(x) 1/x;
It's worthwhile to print either f(c) or NumIt (or both) to see if the algorithm truly did converge on a zero.
 
Last edited:

Similar threads

Replies
4
Views
1K
Replies
2
Views
3K
Replies
8
Views
2K
Replies
2
Views
3K
Replies
8
Views
3K
Replies
2
Views
1K
Back
Top