MATLAB: Help with fzero function

fzeroMATLAB

I have an equation of the form:
3*(1-f1/alphax)*A1+(f1/3*alphax)*(A2+2*A3/A4)=0 with
A1 = (sigma_e - sigma_m)/(2*sigma_e - sigma_m);
A2 = (sigma_e - sigma33_com)/(sigma_e + 0.14*(d/L)*(sigma33_com- sigma_e));
A3 = (sigma_e - sigma11_com);
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com - sigma_e);
I want to plot a curve of sigma_e for selected values of f1. sigma_m, d,L are user supplied variables while sigma11_com and sigma33_com are obtained by calling some function.
In order to obtain the unknown sigma_e for every f1, I have tried to use the fzero function but for all initial guesses of sigma_e I try, I get the output as NaN, implying the function may not have a root.
I am not sure this is the right function or the right method to solve the sort of equation I have above; if anyone could confirm or correct my approach, I would most appreciate.
Assuming this is the right method; I am trying to solve the equation using the following statement after assigning values the variables:
x3 = fzero(@(sigma_e) trial0(sigma_e,L,d,sigma_m,f1),0.015)
where trial0 is the function given below. Is this correct? I am new to MATLAB and any help will be most appreciated.
function sigma_e1 = trial0(sigma_e,L,d,sigma_m,f1)
global sigma_m
global L
global d
global sigma_e
global f1
A1 = (sigma_e - sigma_m)/(2*sigma_e - sigma_m);
A2 = (sigma_e - sigma33_com)/(sigma_e + 0.14*(d/L)*(sigma33_com-sigma_e));
A3 = (sigma_e - sigma11_com);
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com - sigma_e);
sigma_e1 = 3*(1-f1/alphax)*A1+(f1/3*alphax)*(A2+2*A3/A4);
end
I am using the following command lines:
>> sig3=sigma33_com(0.0025,1.5e-6,1.85,1850,2.5e-7)
sig3 =
936.23
>> sig1=sigma11_com(2.5e-3,1.5e-6,1.85,2.5e-7,7.5e-7,1850)
sig1 =
6.5845
>> x3=fzero(@(sigma_e) trial0(2.5e-3,1.5e-6,1e-9,8e-4,sig3,sig1,sigma_e),0.02)
and the functions are:
function sigma_e1 = trial0(L,d,sigma_m,f1,sigma33_com,sigma11_com,sigma_e)
A1 = (sigma_e - sigma_m)/(2*sigma_e - sigma_m);
A2 = (sigma_e - sigma33_com)/(sigma_e + 0.14*(d/L)*(sigma33_com-sigma_e));
A3 = (sigma_e - sigma11_com);
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com - sigma_e);
sigma_e1 = 3*(1-f1/alphax)*A1+(f1/3*alphax)*(A2+2*A3/A4);
end
function sigma11 = sigma11_com(L,d,sigma_s,t,a,sigma_c)
B1 = d^2*sigma_c + 2*(sigma_c + sigma_s)*(t^2 + 2*a*t);
B2 = d^2*sigma_s + 2*(sigma_c + sigma_s)*(t^2 + 2*a*t);
sigma11 = sigma_s/(L+2*t)*(L*B1/B2+2*t);
end
function sigma33 = sigma33_com(L,d,sigma_s,sigma_c,t)
B3 = (L+2*t)*sigma_s*(sigma_c*d^2 + sigma_s*(4*d*t+4*t^2));
B4 = 2*t*sigma_c*d^2+2*t*sigma_s*(4*d*t+4*t^2)+sigma_s*L*(d+2*t)^2;
sigma33 = B3/B4;
end
and alphax is obtained from the function:
function alpha1 = alphax(L,d,t)
alpha1 = d^2*L/((d+2*t)^2*(L+2*t));
end

Best Answer

I think the issue is that you are using alphax but not passing parameters in trial0 here:
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com - sigma_e);
sigma_e1 = 3*(1-f1/alphax)*A1+(f1/3*alphax)*(A2+2*A3/A4);
end
It should look something like:
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com - sigma_e);
sigma_e1 = 3*(1-f1/alphax(L,d,whatever_t_is))*A1+(f1/3*alphax(L,d,whatever_t_is))*(A2+2*A3/A4);
end
This is causing your anonymous function to fail.
Related Question