Error using fzero (line 246) FZERO cannot continue because user-supplied function_handle ==> @(X)BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data,sigma_r) failed with th
4 views (last 30 days)
Show older comments
mostafa kareem
on 3 Jun 2021
Commented: mostafa kareem
on 4 Jun 2021
function f = BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data,sigma_r)
W = sqrt(v^2*(1-X(1))^2 + omega^2*r^2 * (1 + X(2)^2)); % local velocity
phi = asind(v*(1 -X(1))/W); % flow velocity
alpha = phi - Beta - twst; % local angle of attack
% two index of having desired value between them
vec1 = find(alpha_data<=alpha);
vec2 = find(alpha_data>=alpha);
index = [vec1(end) vec2(1)];
cl = (cl_data(index(2))-cl_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cl_data(index(1)); % local lift coff
cd = (cd_data(index(2))-cd_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cd_data(index(1)); % local drag coff
Cx = cl*cos(phi) + cd*sin(phi);
Cy = cl*sin(phi) - cd*cos(phi);
RHS1 = sigma_r/(4*sin(phi^2)) *(Cx - sigma_r/(4*sin(phi)^2) *Cy^2);
RHS2 = sigma_r * Cy /(4*sin(phi)*cos(phi));
delta_CT = X(1) - RHS1*(1-X(1));
dleta_Q = X(1) + RHS2*(1 + X(2));
f = [delta_CT;dleta_Q];
end
------------------------------------------------------------------------------------------------------------------------------
Ig = [1/3; 0.1];
BEMTr = @(X) BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data...
,sigma_r);
x = fzero(BEMTr,Ig)
0 Comments
Accepted Answer
Walter Roberson
on 3 Jun 2021
The variables such as v and omega must be defined before you can run your function.
Ig = [1/3; 0.1];
BEMTr = @(X) BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data...
,sigma_r);
x = fzero(BEMTr,Ig)
function f = BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data,sigma_r)
W = sqrt(v^2*(1-X(1))^2 + omega^2*r^2 * (1 + X(2)^2)); % local velocity
phi = asind(v*(1 -X(1))/W); % flow velocity
alpha = phi - Beta - twst; % local angle of attack
% two index of having desired value between them
vec1 = find(alpha_data<=alpha);
vec2 = find(alpha_data>=alpha);
index = [vec1(end) vec2(1)];
cl = (cl_data(index(2))-cl_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cl_data(index(1)); % local lift coff
cd = (cd_data(index(2))-cd_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cd_data(index(1)); % local drag coff
Cx = cl*cos(phi) + cd*sin(phi);
Cy = cl*sin(phi) - cd*cos(phi);
RHS1 = sigma_r/(4*sin(phi^2)) *(Cx - sigma_r/(4*sin(phi)^2) *Cy^2);
RHS2 = sigma_r * Cy /(4*sin(phi)*cos(phi));
delta_CT = X(1) - RHS1*(1-X(1));
dleta_Q = X(1) + RHS2*(1 + X(2));
f = [delta_CT;dleta_Q];
end
2 Comments
Walter Roberson
on 3 Jun 2021
Your code tries to pass in a vector of initial conditions. fzero() is restricted to functions of a single variable.
Your code tries to return a pair of values. fzero() is restricted to scalar results.
Depending on the exact values, your code might have tried to use too many iterations.
Your code fails to test for the possibility that alpha is not found within alpha_data. This is a significant problem. You should detect this and either adjust for it or else error()
Efficiency note:
If your alpha_data values are not sorted, then it does not make sense to talk about an alpha being "between" two values. If your alpha_data values are sorted, then vec2 is always going to either equal vec1 or else be immediately adjacent to it.
Ig = [1/3; 0.1];
v = rand(); omega = rand(); r = rand()*10; Beta = randn();
twst = rand(); alpha_data = linspace(-20,20,50);
cl_data = sort(randn(size(alpha_data)));
cd_data = sort(randn(size(alpha_data)));
sigma_r = rand();
BEMTr = @(X) BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data...
,sigma_r);
options = optimoptions('fsolve', 'MaxFunctionEvaluations', 1e5, 'MaxIterations', 1e5);
x = fsolve(BEMTr, Ig, options)
function f = BEMTR(X,v,omega,r,Beta,twst,alpha_data,cl_data,cd_data,sigma_r)
W = sqrt(v^2*(1-X(1))^2 + omega^2*r^2 * (1 + X(2)^2)); % local velocity
phi = asind(v*(1 -X(1))/W); % flow velocity
alpha = phi - Beta - twst; % local angle of attack
% two index of having desired value between them
vec1 = find(alpha_data<=alpha);
vec2 = find(alpha_data>=alpha);
index = [vec1(end) vec2(1)];
cl = (cl_data(index(2))-cl_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cl_data(index(1)); % local lift coff
cd = (cd_data(index(2))-cd_data(index(1)))/...
(alpha_data(index(2))-alpha_data(index(1))) * ...
(alpha -alpha_data(index(1))) + cd_data(index(1)); % local drag coff
Cx = cl*cos(phi) + cd*sin(phi);
Cy = cl*sin(phi) - cd*cos(phi);
RHS1 = sigma_r/(4*sin(phi^2)) *(Cx - sigma_r/(4*sin(phi)^2) *Cy^2);
RHS2 = sigma_r * Cy /(4*sin(phi)*cos(phi));
delta_CT = X(1) - RHS1*(1-X(1));
dleta_Q = X(1) + RHS2*(1 + X(2));
f = [delta_CT;dleta_Q];
end
More Answers (0)
See Also
Categories
Find more on Optimization in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!