help with fzero function
4 views (last 30 days)
Show older comments
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
3 Comments
Todd Flanagan
on 21 Jan 2011
Mike W says, "Thank you. That has helped somebit but I now have a different problem I cannot get rid of. When I pass the input values through the following statement,
x3=fzero(@(sigma_e) trial0(2.5e-3,1.5e-6,1e-9,8e-4,sig3,sig1,sigma_e),0.02);
I get a remark
??? Undefined function or variable 'sigma_e'.
sig3 and sig1 have values assigned from a function but sigma_e is the variable I want to solve for.
I have no idea how to define 'sigma_e' so that MATLAB knows this is the value I want it to solve..how do how structure the assignment statements to take care of this?
Thank you! Mike W."
Todd Flanagan
on 21 Jan 2011
Wlater replies, "That anonymous function looks okay. However, I see that you have altered the parameter order and number of parameters for trial0. Could you show us the current code for that? Possibly the error is occurring there, at the time of invocation of trial0"
Accepted Answer
Todd Flanagan
on 21 Jan 2011
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.
0 Comments
More Answers (4)
Walter Roberson
on 23 Jan 2011
If you are going to pass sigma33_com, sigma1_com, or alphax in to your function, you need to pass their function handle. Otherwise at the point you list them, it is going to try to evaluate them with no inputs and take the first output that results and pass that in to trial0.
x3 = fzero( @(sigma_e) trial0(L, d, sigma_m, f1, @sigma33_com, @sigma11_com, @alphax, sigma_e), 0.02)
There is, however, no good reason to pass the functions in to trial0 at all as long as the they are "visible" as functions to trial0 (e.g., trial0 is in the same file as they are, or the functions are in individual .m files on the matlab path.)
Mike W.
on 22 Jan 2011
1 Comment
Walter Roberson
on 22 Jan 2011
I think we need to see the current version of the code to solve that.
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!