2015-02-14 2 views
0

Я пишу сценарий для класса аэродинамики, и я получаю следующее сообщение об ошибке:Неопределенная переменная «если» заявление

Undefined function or variable 'dCt_dx'. 
Error in Project2_Iteration (line 81) 
Ct = trapz(x,dCt_dx) 

Я не уверен, что причина. Это как-то связано с моим утверждением if. Мой сценарий ниже:

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) 
+0

Вы можете установить контрольные точки в своем коде, нажав тире рядом с номерами строк (должен появиться красный круг). После того, как вы запустите свой код, он остановится в точке останова, и вы можете шаг за шагом, нажав 'F10'. Вы можете проверить значение переменных по мере их изменения. Если вы все еще не можете понять проблему, вернитесь и сообщите нам об этом. – eigenchris

+0

Кажется, у меня ничего не получается. Красная точка просто исчезает, когда я запускаю сценарий, и получаю ту же ошибку (даже когда перерыв выше, где происходит ошибка) –

+0

Я хотел бы добавить, что кроме того, что вы не получили сбой в 'dr = R/K' в начале (что, вероятно, связано с тем, что глобальные переменные получают инициализацию до 0). Я думаю, что вы действительно злоупотребляете глобалами здесь. Во-первых, эти переменные не обязательно должны быть глобальными (я бы сказал, что глобальные переменные обычно не нужны в Matlab, но иногда это может упростить GUI). Во-вторых, как вы их определяете: если вы хотите использовать глобальные переменные. По крайней мере, поместите их в структуру. То, как вы их используете, теперь не дает вам контроля над кодом. Кроме того, глобалы в matlab не совпадают с глобальными значениями в c, поэтому вы должны их прочитать. – patrik

ответ

0

Когда я пошагово ваш сценарий, я вижу, что все for i = 1:k цикла пропускается, так как k=0. Вы устанавливаете k = length(c), но c никогда не инициализировалось значением, поэтому оно имеет нулевую длину.

Из-за этого dCt_dx никогда не получает значения - и, что более важно, большая часть вашего скрипта никогда не запускается.

Если вы собираетесь использовать MATLAB в будущем, я действительно предлагаю научиться этому. Это намного облегчает поиск ошибок. Попробуйте взглянуть на this video.