# help with fzero function

6 ビュー (過去 30 日間)
Mike W. 2011 年 1 月 21 日
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 件のコメント表示非表示 2 件の古いコメント
Todd Flanagan 2011 年 1 月 21 日
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"

サインインしてコメントする。

### 採用された回答

Todd Flanagan 2011 年 1 月 21 日
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.

サインインしてコメントする。

### その他の回答 (4 件)

Walter Roberson 2011 年 1 月 23 日
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 件のコメント表示非表示 1 件の古いコメント
Mike W. 2011 年 1 月 23 日
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

サインインしてコメントする。

Mike W. 2011 年 1 月 22 日
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 件のコメント表示非表示 なし
Walter Roberson 2011 年 1 月 22 日
I think we need to see the current version of the code to solve that.

サインインしてコメントする。

Mike W. 2011 年 1 月 22 日
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 件のコメント表示非表示 -1 件の古いコメント

サインインしてコメントする。

Mike W. 2011 年 1 月 25 日
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.

サインインしてコメントする。

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by