MATLAB: Trying to find root of equation with fzero command in Matlab.

for loopfzerofzero commandroot command

I want to solve a problem in which I am given a function (seen below) where W is 4.9 and I must find v. I have to use the fzero method but I am having trouble with how to find the roots. How can I do this? (Function file and script file ARE separate and below)
function W = dforce(v)
global ro d mu A
Re = (ro*v*d)/mu;
Cd = (24/Re)+(6/(1+sqrt(Re)))+0.4;
W = Cd*0.5*ro*v^2*A;
end
_________________________________________________________________________________________________________
clear all, close all
global ro d mu A
m = 0.5;
g = 9.8;
N = m*g;
R = 287;
P = 101300;
d = 15;
A = (pi*d^2)/4;
T = linspace(-60,60,121); NT = length(T); mu = zeros(size(T)); ro = mu;
for i = 1:NT
b1 = 2.156954157e-14;
b2 = -5.332634033e-11;
b3 = 7.477905983e-8;
b4 = 2.527878788e-7;
mu(i) = b1*T(i)^3+b2*T(i)^2+b3*T(i)+b4;
ro(i) = P/(R*T(i));
dF = @(v)dforce(v)- N;
V = fzero(dF,0);
end

Best Answer

First of all, there is ABSOLUTELY no need to use global variables here. They are a crutch that will make your code poor, impossible to debug, hard to read and follow, etc. Avoid them, instead learning a better programming style at the same time.
Here, I've written dforce to take those variables as inputs. I've postpended the names of several variables with a _i to suggest that they are the i'th element of the external vectors ro and mu.
function W = dforce(v,ro_i,d,mu_i,A)
Re = (ro_i*v*d)/mu_i;
Cd = (24/Re)+(6/(1+sqrt(Re)))+0.4;
W = Cd*0.5*ro_i*v^2*A;
end
See that when the function handle dF is created, it is passed the values of those parameters. I've also preallocated V.
m = 0.5;
g = 9.8;
N = m*g;
R = 287;
P = 101300;
d = 15;
A = (pi*d^2)/4;
T = linspace(-60,60,121);
NT = length(T);
mu = zeros(size(T));
ro = mu;
V = zeros(size(T));
% move the declaration of b1,b2,b3,b4 outside the loop, as they are constants.
b1 = 2.156954157e-14;
b2 = -5.332634033e-11;
b3 = 7.477905983e-8;
b4 = 2.527878788e-7;
Now, the VERY first thing I would do is to test your function. Dopes it make sense? Is there a root to be found? Don't throw a loop at something and expect it to work. Don't write a mess of code and then expect it all to work without any testing.
ALWAYS check things. Check EVERY line if necessary to make sure it makes sense.
i = 1;
mu(i) = b1*T(i)^3+b2*T(i)^2+b3*T(i)+b4;
ro(i) = P/(R*T(i));
dF = @(v)dforce(v,ro(i),d,mu(i),A)- N;
A very good way to check things is with a plot. Does it make sense? If not, then why not? This is how you should use MATLAB. Make sure that you understand everything, that you have made no mistakes. Then when you put it all together at the end, you can be confident that it will indeed work.
ezplot(dF,[-1,1])
Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements.
> In ezplot>ezplot1 at 484
In ezplot at 144
grid on
So, in fact, there is no root at all, at least not for the first value of T.
The point is, careful coding means that you work SLOWLY, one step at a time. Once you get more proficient at coding, you can do bigger chunks without needing to check quite as much.
Related Question