Error in evaluating a function - matlab
EDIT: The code that I have pasted is too long. Basicaly I dont know how to work with the second code, If I know how calculate alpha from the second code I think my problem will be solved. I have tried a lot of input arguments for the second code but it does not work!
I have written following code to solve a convex optimization problem using Gradient descend method:
function [optimumX,optimumF,counter,gNorm,dx] = grad_descent()
x0 = [3 3]';%'//
terminationThreshold = 1e-6;
maxIterations = 100;
dxMin = 1e-6;
gNorm = inf; x = x0; counter = 0; dx = inf;
% ************************************
f = #(x1,x2) 4.*x1.^2 + 2.*x1.*x2 +8.*x2.^2 + 10.*x1 + x2;
%alpha = 0.01;
% ************************************
figure(1); clf; ezcontour(f,[-5 5 -5 5]); axis equal; hold on
f2 = #(x) f(x(1),x(2));
% gradient descent algorithm:
while and(gNorm >= terminationThreshold, and(counter <= maxIterations, dx >= dxMin))
g = grad(x);
gNorm = norm(g);
alpha = linesearch_strongwolfe(f,-g, x0, 1);
xNew = x - alpha * g;
% check step
if ~isfinite(xNew)
display(['Number of iterations: ' num2str(counter)])
error('x is inf or NaN')
end
% **************************************
plot([x(1) xNew(1)],[x(2) xNew(2)],'ko-')
refresh
% **************************************
counter = counter + 1;
dx = norm(xNew-x);
x = xNew;
end
optimumX = x;
optimumF = f2(optimumX);
counter = counter - 1;
% define the gradient of the objective
function g = grad(x)
g = [(8*x(1) + 2*x(2) +10)
(2*x(1) + 16*x(2) + 1)];
end
end
As you can see, I have commented out the alpha = 0.01; part. I want to calculate alpha via an other code. Here is the code (This code is not mine)
function alphas = linesearch_strongwolfe(f,d,x0,alpham)
alpha0 = 0;
alphap = alpha0;
c1 = 1e-4;
c2 = 0.5;
alphax = alpham*rand(1);
[fx0,gx0] = feval(f,x0,d);
fxp = fx0;
gxp = gx0;
i=1;
while (1 ~= 2)
xx = x0 + alphax*d;
[fxx,gxx] = feval(f,xx,d);
if (fxx > fx0 + c1*alphax*gx0) | ((i > 1) & (fxx >= fxp)),
alphas = zoom(f,x0,d,alphap,alphax);
return;
end
if abs(gxx) <= -c2*gx0,
alphas = alphax;
return;
end
if gxx >= 0,
alphas = zoom(f,x0,d,alphax,alphap);
return;
end
alphap = alphax;
fxp = fxx;
gxp = gxx;
alphax = alphax + (alpham-alphax)*rand(1);
i = i+1;
end
function alphas = zoom(f,x0,d,alphal,alphah)
c1 = 1e-4;
c2 = 0.5;
[fx0,gx0] = feval(f,x0,d);
while (1~=2),
alphax = 1/2*(alphal+alphah);
xx = x0 + alphax*d;
[fxx,gxx] = feval(f,xx,d);
xl = x0 + alphal*d;
fxl = feval(f,xl,d);
if ((fxx > fx0 + c1*alphax*gx0) | (fxx >= fxl)),
alphah = alphax;
else
if abs(gxx) <= -c2*gx0,
alphas = alphax;
return;
end
if gxx*(alphah-alphal) >= 0,
alphah = alphal;
end
alphal = alphax;
end
end
But I get this error:
Error in linesearch_strongwolfe (line 11) [fx0,gx0] = feval(f,x0,d);
As you can see I have written the f function and its gradient manually.
linesearch_strongwolfe(f,d,x0,alpham) takes a function f, Gradient of f, a vector x0 and a constant alpham. is there anything wrong with my declaration of f? This code works just fine if I put back alpha = 0.01;
As I see it:
x0 = [3; 3]; %2-element column vector
g = grad(x0); %2-element column vector
f = #(x1,x2) 4.*x1.^2 + 2.*x1.*x2 +8.*x2.^2 + 10.*x1 + x2;
linesearch_strongwolfe(f,-g, x0, 1); %passing variables
inside the function:
[fx0,gx0] = feval(f,x0,-g); %variable names substituted with input vars
This will in effect call
[fx0,gx0] = f(x0,-g);
but f(x0,-g) is a single 2-element column vector with these inputs. Assingning the output to two variables will not work.
You either have to define f as a proper named function (just like grad) to output 2 variables (one for each component), or edit the code of linesearch_strongwolfe to return a single variable, then slice that into 2 separate variables yourself afterwards.
If you experience a very rare kind of laziness and don't want to define a named function, you can still use an anonymous function at the cost of duplicating code for the two components (at least I couldn't come up with a cleaner solution):
f = #(x1,x2) deal(4.*x1(1)^2 + 2.*x1(1)*x2(1) +8.*x2(1)^2 + 10.*x1(1) + x2(1),...
4.*x1(2)^2 + 2.*x1(2)*x2(2) +8.*x2(2)^2 + 10.*x1(2) + x2(2));
[fx0,gx0] = f(x0,-g); %now works fine
as long as you always have 2 output variables. Note that this is more like a proof of concept, since this is ugly, inefficient, and very susceptible to typos.
Related
Steepest Descent using Armijo rule
I want to determine the Steepest descent of the Rosenbruck function using Armijo steplength where x = [-1.2, 1]' (the initial column vector). The problem is, that the code has been running for a long time. I think there will be an infinite loop created here. But I could not understand where the problem was. Could anyone help me? n=input('enter the number of variables n '); % Armijo stepsize rule parameters x = [-1.2 1]'; s = 10; m = 0; sigma = .1; beta = .5; obj=func(x); g=grad(x); k_max = 10^5; k=0; % k = # iterations nf=1; % nf = # function eval. x_new = zeros([],1) ; % empty vector which can be filled if length is not known ; [X,Y]=meshgrid(-2:0.5:2); fx = 100*(X.^2 - Y).^2 + (X-1).^2; contour(X, Y, fx, 20) while (norm(g)>10^(-3)) && (k<k_max) d = -g./abs(g); % steepest descent direction s = 1; newobj = func(x + beta.^m*s*d); m = m+1; if obj > newobj - (sigma*beta.^m*s*g'*d) t = beta^m *s; x = x + t*d; m_new = m; newobj = func(x + t*d); nf = nf+1; else m = m+1; end obj=newobj; g=grad(x); k = k + 1; x_new = [x_new, x]; end % Output x and k x_new, k, nf fprintf('Optimal Solution x = [%f, %f]\n', x(1), x(2)) plot(x_new) function y = func(x) y = 100*(x(1)^2 - x(2))^2 + (x(1)-1)^2; end function y = grad(x) y(1) = 100*(2*(x(1)^2-x(2))*2*x(1)) + 2*(x(1)-1); end
Sequential Quadratic Programming Matlab Implementation
I have a problem with my MATLAB code that solves a nonlinear quadratic problem with SQP algorithm (Sequential quadratic programming) but in the "QP-SUB PROBLEM" section of the code that i have formulated analytically a "num2str"error appears and honestly, i don't know how to fix that and also have to tell you that this method uses KT conditions for a better solution . In every section of the code i write a comment for better understanding and function with constraints can be found in the code below : % Maximize f(x1,x2) = x1^4 -2x1^2x2 +x1^2 +x1x2^2 -2x1 +4 % % h1(x1,x2) = x1^2 + x2^2 -2 = 0 % g1(x1,x2) = 0.25x1^2 +0.75x2^2 -1 <=0 % 0 <= x1 <= 4; 0 <= x2 <= 4 % %-------------------------------------------------------- % The KT conditions for the QP subproblem % are applied analytically % There are two cases for a single inequality constraint % Case (a) : beta = 0 g < 0 % Case (b) : beta ~= 0, g = 0 % The best solution is used % -------------------------------------------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% management functions clear % clear all variable/information in the workspace - use CAUTION clear global % again use caution - clears global information clc % position the cursor at the top of the screen close % closes the figure window format compact % avoid skipping a line when writing to the command window warning off %#ok<WNOFF> % don't report any warnings like divide by zero etc. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% DATA --------------------- %%% starting design xb(1) = 3; xb(2) = 2; it = 10; % number of iterations %%% plot range for delx1 : -3 , +3 dx1L = -3; dx1U = +3; dx2L = -3; dx2U = +3; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Define functions syms x1 x2 f g h syms gradf1 gradf2 gradh1 gradh2 gradg1 gradg2 f = x1^4 - 2*x1*x1*x2 + x1*x1 + x1*x2*x2 - 2*x1 + 4; h = x1*x1 + x2*x2 - 2; g = 0.25*x1*x1 +0.75*x2*x2 -1; %%% the gradient functions gradf1 = diff(f,x1); gradf2 = diff(f,x2); % the hessian hess = [diff(gradf1,x1), diff(gradf1,x2); diff(gradf2,x1), diff(gradf2,x2)]; % gradient of the constraints gradh1 = diff(h,x1); gradh2 = diff(h,x2); gradg1 = diff(g,x1); gradg2 = diff(g,x2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% graphical/symbolic solution for SLP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fprintf('***********************') fprintf('\nSQP - Example 7.1') fprintf('\n*********************\n') for i = 1:it %figure; f1 = subs(f,{x1,x2},{xb(1),xb(2)}); g1 = subs(g,{x1,x2},{xb(1),xb(2)}); h1 = subs(h,{x1,x2},{xb(1),xb(2)}); %%% Print Information fprintf('\n******************************') fprintf('\nIteration : '),disp(i) fprintf('******************************\n') fprintf('Linearized about [x1, x2] : '),disp([xb(1) xb(2)]) fprintf('Objective function value f(x1,x2) : '),disp(f1); fprintf('Equality constraint value value h(x1,x2) : '),disp(h1); fprintf('Inequality constraint value value g(x1,x2) : '),disp(g1); %fprintf('\nsolution for [delx1 delx2] : '),disp(sol') % hold on % calculate the value of the gradients % f1 = subs(f,{x1,x2},{xb(1),xb(2)}); % g1 = subs(g,{x1,x2},{xb(1),xb(2)}); % h1 = subs(h,{x1,x2},{xb(1),xb(2)}); fprintf('\n-----------------------') fprintf('\nQP - SUB PROBLEM') fprintf('\n---------------------\n') gf1 = double(subs(gradf1,{x1,x2},{xb(1),xb(2)})); gf2 = double(subs(gradf2,{x1,x2},{xb(1),xb(2)})); hess1 = double(subs(hess,{x1,x2},{xb(1),xb(2)})); gh1 = double(subs(gradh1,{x1,x2},{xb(1),xb(2)})); gh2 = double(subs(gradh2,{x1,x2},{xb(1),xb(2)})); gg1 = double(subs(gradg1,{x1,x2},{xb(1),xb(2)})); gg2 = double(subs(gradg2,{x1,x2},{xb(1),xb(2)})); % the QP subproblem syms dx1 dx2 % change in design fquad = f1 + [gf1 gf2]*[dx1; dx2] + 0.5*[dx1 dx2]*hess1*[dx1 ;dx2]; hlin = h1 + [gh1 gh2]*[dx1; dx2]; glin = g1 + [gg1 gg2]*[dx1; dx2]; Fquadstr = strcat(num2str(f1),' + ',num2str(gf1), ... '*','dx1',' + ',num2str(gf2),' * ','dx2', ... ' + 0.5*',num2str(hess1(1,1)),' * dx1^2', ... ' +',num2str(hess1(1,2)),' * dx1*dx2', ... ' + 0.5*',num2str(hess1(2,2)),' * dx2^2'); hlinstr = strcat(num2str(h1),' + ',num2str(gh1), ... '*','dx1',' + ',num2str(gh2),' * ','dx2'); glinstr = strcat(num2str(g1),' + ',num2str(gg1), ... '*','dx1',' + ',num2str(gg2),' * ','dx2'); fprintf('Quadratic Objective function f(x1,x2): \n'),disp(Fquadstr); fprintf('Linearized equality h(x1,x2): '),disp(hlinstr); fprintf('Linearized inequality g(x1,x2): '),disp(glinstr); fprintf('\n') % define Lagrangian for the QP problem syms lamda beta F = fquad + lamda*hlin + beta*glin; fprintf('Case a: beta = 0\n'); Fnobeta = fquad + lamda*hlin; %%% initialize best solution dx1best = 0; dx2best = 0; Fbbest = 0; %%%%%%%%%%%%%%%%%%%%%%% %%% solve case (a) %%% %%%%%%%%%%%%%%%%%%%%%%% xcasea = solve(diff(Fnobeta,dx1),diff(Fnobeta,dx2),hlin); sola = [double(xcasea.dx1) double(xcasea.dx2) double(xcasea.lamda)]; dx1a = double(xcasea.dx1); dx2a = double(xcasea.dx2); lamdaa = double(xcasea.lamda); hlina = double(subs(hlin,{dx1,dx2},{dx1a,dx2a})); glina = double(subs(glin,{dx1,dx2},{dx1a,dx2a})); Fa = double(subs(Fnobeta,{dx1,dx2,lamda},{dx1a,dx2a,lamdaa})); %%% results for case (a) x1a = dx1a + xb(1); x2a = dx2a + xb(2); fv = double(subs(f,{x1,x2},{x1a,x2a})); hv = double(subs(h,{x1,x2},{x1a,x2a})); gv = double(subs(g,{x1,x2},{x1a,x2a})); fprintf('Change in design vector: '),disp([dx1a dx2a]); fprintf('The linearized quality constraint: '),disp(hlina); fprintf('The linearized inequality constraint: '),disp(glina); fprintf('New design vector: '),disp([x1a x2a]); fprintf('The objective function: '),disp(fv); fprintf('The equality constraint: '),disp(hv); fprintf('The inequality constraint: '),disp(gv); if (glina <= 0) xb(1) = xb(1) + dx1a; xb(2) = xb(2) + dx2a; fbest = Fa; dx1best = dx1a; dx2best = dx2a; end %%%%%%%%%%%%%%%%%%%%%%% %%% solve case (b) %%% %%%%%%%%%%%%%%%%%%%%%%% fprintf('\n Case b: g = 0\n'); xcaseb = solve(diff(F,dx1),diff(F,dx2),hlin,glin); solb = [double(xcaseb.dx1) double(xcaseb.dx2) double(xcaseb.lamda) double(xcaseb.beta)]; dx1b = double(xcaseb.dx1); dx2b = double(xcaseb.dx2); betab = double(xcaseb.beta); lamdab = double(xcaseb.lamda); hlinb = double(subs(hlin,{dx1,dx2},{dx1b,dx2b})); glinb = double(subs(glin,{dx1,dx2},{dx1b,dx2b})); Fb = double(subs(F,{dx1,dx2,lamda,beta},{dx1b,dx2b,lamdab,betab})); x1b = dx1b + xb(1); x2b = dx2b + xb(2); fv = double(subs(f,{x1,x2},{x1b,x2b})); hv = double(subs(h,{x1,x2},{x1b,x2b})); gv = double(subs(g,{x1,x2},{x1b,x2b})); fprintf('Change in design vector: '),disp([dx1b dx2b]); fprintf('The linearized quality constraint: '),disp(hlinb); fprintf('The linearized inequality constraint: '),disp(glinb); fprintf('New design vector: '),disp([x1b x2b]); fprintf('The objective function: '),disp(fv); fprintf('The equality constraint: '),disp(hv); fprintf('The inequality constraint: '),disp(gv); fprintf('Multiplier beta: '),disp(betab); fprintf('Multiplier lamda: '),disp(lamdab); if (betab > 0) & (Fb <= fbest) xb(1) = x1b; xb(2) = x2b; dx1best = dx1b; dx2best = dx2b; end %%% stopping criteria if ([dx1best dx2best]*[dx1best dx2best]') <= 1.0e-08 fprintf('\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&') fprintf('\nStopped: Design Not Changing') fprintf('\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n\n') break; elseif i == it fprintf('\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&') fprintf('\nStpped: Number of iterations at maximum') fprintf('\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n\n') break; end end
f1, g1, h1 are still syms variable type. Change them to numeric type using the function double() before applying the function num2str() You have already applied double() to the variables gf1, gf2, gh1, gh2,gg1, gg2 and hess1 right above, no need to touch them Here is the section you should replace Fquadstr = strcat(num2str(f1),' + ',num2str(gf1), ... '*','dx1',' + ',num2str(gf2),' * ','dx2', ... ' + 0.5*',num2str(hess1(1,1)),' * dx1^2', ... ' +',num2str(hess1(1,2)),' * dx1*dx2', ... ' + 0.5*',num2str(hess1(2,2)),' * dx2^2'); hlinstr = strcat(num2str(h1),' + ',num2str(gh1), ... '*','dx1',' + ',num2str(gh2),' * ','dx2'); glinstr = strcat(num2str(g1),' + ',num2str(gg1), ... '*','dx1',' + ',num2str(gg2),' * ','dx2'); by this % apply double() to f1 Fquadstr = strcat(num2str(double(f1)),' + ',num2str(gf1), ... '*','dx1',' + ',num2str(gf2),' * ','dx2', ... ' + 0.5*',num2str(hess1(1,1)),' * dx1^2', ... ' +',num2str(hess1(1,2)),' * dx1*dx2', ... ' + 0.5*',num2str(hess1(2,2)),' * dx2^2'); % apply double() to h1 hlinstr = strcat(num2str(double(h1)),' + ',num2str(gh1), ... '*','dx1',' + ',num2str(gh2),' * ','dx2'); % apply double() to g1 glinstr = strcat(num2str(double(g1)),' + ',num2str(gg1), ... '*','dx1',' + ',num2str(gg2),' * ','dx2');
Why is the MATLAB output of this numerical method precision not getting more accurate?
Posting here vs math.stackexchange because I think my issue is syntax: I'm trying to analyze the 2nd order ODE: y'' + 2y' + 2y = e^(-x) * sin(x) using MATLAB code for the midpoint method. I first converted the ODE to a system of 1st order equations and then tried to apply it below, but as the discretizations [m] are increased, the output is stopping at .2718. For example, m=11 yields: ans = 0.2724 and m=101: ans = 0.2718 and m=10001 ans = 0.2718 Here's the code: function [y,t] = ODEsolver_midpointND(F,y0,a,b,m) if nargin < 5, m = 11; end if nargin < 4, a = 0; b = 1; end if nargin < 3, a = 0; b = 1; end if nargin < 2, error('invalid number of inputs'); end t = linspace(a,b,m)'; h = t(2)-t(1); n = length(y0); y = zeros(m,n); y(1,:) = y0; for i=2:m Fty = feval(F,t(i-1),y(i-1,:)); th = t(i-1)+h/2; y(i,:) = y(i-1,:) + ... h*feval(F,th,y(i-1,:)+(h/2)*Fty ); end Separate file: function F = Fexample1(t,y) F1 = y(2); F2 = exp(-t).*sin(t)-2.*y(2)-2.*y(1); F = [F1,F2]; Third file: [Y,t] = ODEsolver_midpointND('Fexample1',[0 0],0,1,11); Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)- t.*cos(t))]; norm(Y-Ye,inf)
Your ODE solver looks to me like it should work - however there's a typo in the analytic solution you're comparing to. It should be Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)+ t.*cos(t))]; i.e. with a + sign before the t.*cos(t) term in the derivative.
Finding correct index value for matrix in Matlab using meshgrid
I'm trying to build make a code where an equation is not calculated for some certain values. I have a meshgrid with several values for x and y and I want to include a for loop that will calculate some values for most of the points in the meshgrid but I'm trying to include in that loop a condition that if the points have a specified index, the value will not be calculated. In my second group of for/if loops, I want to say that for all values of i and k (row and column), the value for z and phi are calculated with the exception of the specified i and k values (in the if loop). What I'm doing at the moment is not working... The error I'm getting is: The expression to the left of the equals sign is not a valid target for an assignment. Here is my code at the moment. I'd really appreciate any advice on this! Thanks in advance U_i = 20; a = 4; c = -a*5; b = a*10; d = -20; e = 20; n = a*10; [x,y] = meshgrid([c:(b-c)/n:b],[d:(e-d)/n:e]'); for i = 1:length(x) for k = 1:length(x) % Zeroing values where cylinder is if sqrt(x(i,k).^2 + y(i,k).^2) < a x(i,k) = 0; y(i,k) = 0; end end end r = sqrt(x.^2 + y.^2); theta = atan2(y,x); z = zeros(length(x)); phi = zeros(length(x)); for i = 1:length(x) for k = 1:length(x) if (i > 16 && i < 24 && k > 16 && k <= length(x)) z = 0; phi = 0; else z = U_i.*r.*(1-a^2./r.^2).*sin(theta); % Stream function phi = U_i*r.*(1+a^2./r.^2).*cos(theta); % Velocity potential end end end
The original code in the question can be rewritten as seen below. Pay attention in the line with ind(17:24,:) since your edit now excludes 24 and you original question included 24. U_i = 20; a = 4; c = -a*5; b = a*10; d = -20; e = 20; n = a*10; [x,y] = meshgrid([c:(b-c)/n:b],[d:(e-d)/n:e]'); ind = find(sqrt(x.^2 + y.^2) < a); x(ind) = 0; y(ind) = 0; r = sqrt(x.^2 + y.^2); theta = atan2(y,x); ind = true(size(x)); ind(17:24,17:length(x)) = false; z = zeros(size(x)); phi = zeros(size(x)); z(ind) = U_i.*r(ind).*(1-a^2./r(ind).^2).*sin(theta(ind)); % Stream function phi(ind) = U_i.*r(ind).*(1+a^2./r(ind).^2).*cos(theta(ind)); % Velocity potential
Undefined variable in 'if' statement
I'm writing a script for an aerodynamics class and I'm getting the following error: Undefined function or variable 'dCt_dx'. Error in Project2_Iteration (line 81) Ct = trapz(x,dCt_dx) I'm not sure what the cause is. It's something to do with my if statement. My script is below: clear all clc global dr a n Vinf Vr w rho k x c cl dr B R beta t %Environmental Parameters n = 2400; %rpm Vinf = 154; %KTAS rho = 0.07647 * (.7429/.9450); %from mattingly for 8kft a = 1084; %speed of sound, ft/s, 8000 ft n = n/60; %convert to rps w = 2*pi*n; Vinf = (Vinf*6076.12)/3600; %convert from KTAS to ft/s k = length(c); dr = R/k; %length of each blade element for i = 1:k r(i) = i*dr - (.5*dr); %radius at center of blade element dA = 2*pi*r*dr; %Planform area of blade element x(i) = r(i)/R; if x(i) > .15 && x(i-1) < .15 i_15 = i; end if x(i) > .75 && x(i-1) < .75 i_75h = i; i_75l = i-1; end Vr(i) = w*r(i) + Vinf; %Aerodynamic Parameters M = Vr(i)/a; if M > 0.9 M = 0.9; end m0 = 0.9*(2*pi/(1-M^2)^0.5); %lift-curve slope (2pi/rad) %1: Calculate phi phi = atan(Vinf/(2*pi*n*r(i))); %2: Choose Vo Vo = .00175*Vinf; %3: Calculate Theta theta = atan((Vinf + Vo)/(2*pi*n*r(i)))-phi; %4: if option == 1 %calculate cl(i) from c(i) sigma = (B*c(i))/(pi*R); if sigma > 0 cl(i) = (8*x(i)*theta*cos(phi)*tan(phi+theta))/sigma; else cl(i) = 0; end else %option == 2 %calculate c(i) from cl(i) if cl(i) ~= 0 sigma = (8*x(i)*theta*cos(phi)*tan(phi+theta))/cl(i); else sigma = 0; end c(i) = (sigma*pi*R)/B; if c(i) < 0 c(i) = 0; end end %5: Calculate cd cd(i) = 0.0090 + 0.0055*(cl(i)-0.1)^2; %6: calculate alpha alpha = cl(i)/m0; %7: calculate beta beta(i) = phi + alpha + theta; %8: calculate dCt/dx and dCq/dx phi0 = phi+theta; lambda_t = (1/(cos(phi)^2))*(cl(i)*cos(phi0) - cd(i)*sin(phi0)); lambda_q = (1/(cos(phi)^2))*(cl(i)*sin(phi0) + cd(i)*cos(phi0)); if x(i) >= 0.15 dCt_dx(i) = ((pi^3)*(x(i)^2)*sigma*lambda_t)/8; %Roskam eq. 7.47, pg. 280 dCq_dx(i) = ((pi^3)*(x(i)^3)*sigma*lambda_q)/16; %Roskam eq. 7.48, pg 280 else dCt_dx(i) = 0; dCq_dx(i) = 0; end %calculate Mdd t(i) = (0.04/(x(i)^1.2))*c(i); Mdd(i) = 0.94 - (t(i)/c(i)) - cl(i)/10; end %9: calculate Ct, Cq, Cd Ct = trapz(x,dCt_dx) Cq = trapz(x,dCq_dx) D = 2*R; Q=(rho*(n^2)*(D^5)*Cq) T=(rho*(n^2)*(D^4)*Ct)
When I step through your script, I see that the the entire for i = 1:k loop is skipped because k=0. You set k = length(c), but c was never initialized to a value, so it has length zero. Because of this, dCt_dx is never given a value--and more importantly the majority of your script is never run. If you're going to be using MATLAB in the future, I really suggest learning how to do this. It makes it a lot easier to find bugs. Try looking at this video.