MATLAB Answers

1

help with fzero function

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

Walter says, "You should not have a 'global' statement that names any variable that is named in the 'function' header. You should probably remove the 'global' statements in your trial0 function, as all of those values are being passed in as parameters."
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."
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"

로그인 to comment.

태그

제품

답변 수: 5

Todd Flanagan 님의 답변 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

로그인 to comment.


Walter Roberson 님의 답변 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.)

  댓글 수: 2

The code is now working good, thank you very much. I am getting an output NaN, but I guess that has to something to do with my equation as options set to 'Display','iter' lists f(a) as same value throughout the iteration..implying there is something fundamentally wrong with my equation..gotta sort that out and see how it goes. I am most thankful for the help I've gotten to get this far, thank you!
There's actually nothing wrong with my equation, I was assigning a value for the same variable I am looking for..giving the code a problem it can never solve or in other words, giving the code no problem at all!. Once I've corrected this..its working great. Thank you

로그인 to comment.


Mike W. 님의 답변 22 Jan 2011

Thank you very much. I have corrected the error and it has stopped giving me the error message. However, I have a different error message now
'Subscript indices must either be real positive integers or logicals'
The curious thing here is that it does not give the line on the program where this error occurs, making it very hard for me to check it out. My understanding is that this will occur if I assign elements to a matrix that are not positive integers or logical....but can't figure it out in my code. Any suggestions please? Thank you.

  댓글 수: 1

I think we need to see the current version of the code to solve that.

로그인 to comment.


Mike W. 님의 답변 22 Jan 2011

The command line is now;
>>x3=fzero(@(sigma_e)trial0(L,d,sigma_m,f1,sigma33_com,sigma11_com,alphax,sigma_e),0.02)
Initially I was using the "global' statement so that I can assign the variables shared in different functions without having to assign in each function. WHen I removed the global statement, I started having 'undefined variable' error, which only disappeared when I assigned variables in each function as below. It looks bit odd to me, and am thinking there must be a better way or syntax that I am yet to learn that would take care of this oddity...I am still a MATLAB novice and learning the hard way..
The functions trial0, sigma33_com, sigma11_com and alphax are as follows;
function sigma_e1 = trial0(L,d,sigma_m,f1,sigma33_com,sigma11_com,alphax,sigma_e)
sigma_m = 1e-9;
L = 2.5e-3;
t = 2.5e-7;
a = 7.5e-7;
d = 15e-7;
sigma_s = 1.85;
sigma_c = 1850;
f1 = 8e-4;
sigma_e = 0.025;
A1 = (sigma_e - sigma_m)/(2*sigma_e - sigma_m);
A2 = (sigma_e - sigma33_com(L,d,sigma_s,sigma_c,t))...
/(sigma_e + 0.14*(d/L)*(sigma33_com(L,d,sigma_s,sigma_c,t)-sigma_e));
A3 = (sigma_e - sigma11_com(L,d,sigma_s,t,a,sigma_c));
A4 = sigma_e + ((1-0.14*(d/L))/2)*(sigma11_com(L,d,sigma_s,t,a,sigma_c)...
- sigma_e);
sigma_e1 = 3*(1-f1/alphax(L,d,t))*A1+(f1/3*alphax(L,d,t))*(A2+2*A3/A4);
end
function alpha1 = alphax(L,d,t)
L = 2.5e-3;
t = 2.5e-7;
d = 15e-7;
alpha1 = d^2*L/((d+2*t)^2*(L+2*t));
end
function sigma33 = sigma33_com(L,d,sigma_s,sigma_c,t)
L = 2.5e-3;
t = 2.5e-7;
d = 15e-7;
sigma_s = 1.85;
sigma_c = 1850;
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
function sigma11 = sigma11_com(L,d,sigma_s,t,a,sigma_c)
L = 2.5e-3;
t = 2.5e-7;
a = 7.5e-7;
d = 15e-7;
sigma_s = 1.85;
sigma_c = 1850;
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
Thank you for your time and much valued help.

  댓글 수: 0

로그인 to comment.


Mike W. 님의 답변 25 Jan 2011

I am trying to use the fzero function in a loop so that I can have a matrix with values that I can then plot but I am having trouble getting it right. The main issue is with the value that is changing in the equation f1(:,pr), with an error message
Undefined function or variable 'f1'.
yet I have already defined f1 as a vector. The code I am using is as below. The functions sigma11_com, sigma3_com and alphax are same as given in the previous thread..please see above.
function sigma_e1 = trial01(L,d,sigma_m,f1,sigma33_com,sigma11_com,alphax,sigma_e)
format short g
sigma_m = 1e-9;
L = 2.5e-3;
t = 2.5e-7;
a = 7.5e-7;
d = 15e-7;
sigma_s = 1.85;
sigma_c = 1850;
p = input('Enter the number of rows ');
q = input('Enter the number of columns ');
m = input ('Enter the start value of f1 ');
x2 = zeros(p,q); % create an matrix x2 with rows = p (any no) and columns, q =2.
f1 = zeros(1,p);
x2(1,1) = m;
for pr = 2:p
for qc = 1:q
if qc == 1
x2(pr,qc) = x2(pr-1,qc)+2e-4;
f1(:,pr) = x2(pr,qc); % assigning f1 values to vector
sigma_e1 = fzero('@(sigma_e)3*(1-f1(:,pr)./alphax(L,d,t))*(sigma_e - sigma_m)/(2*sigma_e + sigma_m)+(f1(:,pr)./3*alphax(L,d,t))*((sigma_e - sigma33_com(L,d,sigma_s,sigma_c,t))/(sigma_e + 0.14*(d/L)*(sigma33_com(L,d,sigma_s,sigma_c,t) -sigma_e))+2*(sigma_e - sigma11_com(L,d,sigma_s,t,a,sigma_c))/(sigma_e +((1-0.14*(d/L))/2)*(sigma11_com(L,d,sigma_s,t,a,sigma_c)-sigma_e)))',0.02);
elseif qc ==2
x2(pr,qc) = sigma_e1; % assign solution to second column.
end
end
end
x2
plot(x2)
end
I am at a loss how to proceed, any suggestions are most welcome. Thank you.

  댓글 수: 0

로그인 to comment.



Translated by