如何调试这个Matlab代码来模拟滑翔机下降?

时间:2017-03-19 06:14:39

标签: matlab function loops plot ode45

我有这个Matlab项目,但出于某种原因我不能停止思考它,因为我无法让它工作。

目的:

这是一个MATLAB脚本,可以计算从10000英尺处下降的滑翔机的压力,温度和密度的变化。当它下降时,我们想要使用那些计算出的新值,然后插入一个函数,该函数有4个方程,需要使用ode45以及P T和Rho的新值在每个点进行区分。

以下是主要代码:

% HouseKeeping:

clc
clear all
close all

% Constants:
S = 232;                                         % ft^2
Cd0 = 0.02;
K = 0.07;
W = 11000;                                       % lbf
Cl_max = sqrt(Cd0/K);
Cd_max = 2*K*Cl_max^2;
Rho_10000 = .001756;                             % slugs/ ft^3

%Initial conditions:
t = 0;                                           % Sec
x = 0;                                           % ft
h = 10000;                                       % ft
v = sqrt((2*W)/(Rho_10000*S*Cl_max));            %ft/s
gamma = -Cd_max/Cl_max; 

% Find Endurance:
V_RD= sqrt((2*W)/(S* Rho_10000* sqrt(3*Cd0/K)));
RD= V_RD/((sqrt(3*Cd0/K))/(2*Cd0))  ;            % ft/s
Endurcance= h/RD;                                % 958.3515 sec

% Sea Level values:
TSL = 518.69;                                    % Rankine
PSL = 2116.199414;                               % lbs/ft^2
RhoSL = 0.0023769;                          % slugs/ft^3

while h > 0

    tspan = [t t+1];
    i=1;
    X = [x;h;v;gamma;Rho_10000];
    Time(i)= t;

    % Calling ODE45:
    [F] = ode45(@ D,tspan, X)

    % Hight Varying Parameters:
    T = TSL - 0.00356616*h;
    P = (1.137193514E-11)*(T)^5.2560613;
    Rho = (RhoSL * TSL / PASL)*(P / T);
    a = 49.0214 * (T)^.5;

    H_Del(i) = (-Cd_max/Cl_max)*(plotted_x(i))+10000;
    V_Del(i) = sqrt((2*W)/(Rho*S*Cl_max));
    Gamma_Del(i) = -Cd_max/Cl_max;
    i= i+1;

    X = [ x ; H_Del(i); V_Del(i); Gamma_Del(i); Rho];

end



% Plots:

%1
figure (1)
plot(F(:,1),'-r',F(:,3),'-b')
title('Velocity vs Distance');
xlabel('x (ft)');
ylabel('v (ft/s)');


%2 
Figure (2)
plot(F(:,1),'-r',F(:,2),'-b')
title('Altitude vs Distance ');
xlabel('x (ft)');
ylabel('h (ft)');


%3
figure (3)
plot(F(:,1),'-r',F(:,4),'-b')
title('Gamma vs Distance');
xlabel('x (ft)');
ylabel('Gamma (rad)');

%4
figure (4)
plot(t,'-r',F(:,3),'-b')
title('Velocity vs Time');
xlabel(' t (s)');
ylabel('v  (ft/s)');

%5
figure (5)
plot(t,'-r',F(:,1),'-b')
title(' Distance vs Time ');
xlabel('t (s)');
ylabel('x (ft)');


%6
figure (6)
plot(t,'-r',F(:,4),'-b')
title('Gamma vs Time ');
xlabel('t (s)');
ylabel('Gamma (rad)');

%7 
figure (7)
plot(t,'-r',F(:,3),'-b')
title('Velocity vs Time');
xlabel('t (s)');
ylabel('V (ft/s)');

这是功能

function [F] = D(X)

% Constants:
S = 232;                                         % ft^2
Cd0 = 0.02;
K = 0.07;
W = 11000;                                       % lbf
Cl_max = sqrt(Cd0/K);
Cd_max = 2*K*Cl_max^2;
Rho_10000 = .001756;                             % slugs/ ft^3

% Initial conditions:
t = 0;                                           % Sec
x = 0;                                           % ft
h = 10000;                                       % ft
v = sqrt((2*W)/(Rho_10000*S*Cl_max));            % ft/s
gamma = -Cd_max/Cl_max; 
g= 32.2;                                         % ft/s^2

% Equations:
X_Pr = X(3)*cos(X(4));
H_Pr = X(3)*sin(X(4));
V_Pr = (-32.2./W)*(0.5*X(5)*Cd_max*S*X(3)^2 + W*sin(X(4)));
G_Pr = (32.2./(W*X(3)))*(0.5*X(5)*Cl_max*S*X(3)^2 - W*cos(X(4)));

F = [X_Pr;H_Pr;V_Pr;G_Pr];

我对Matlab不太满意,但我尽我所能!我去找我的教授寻求帮助,但他们说他们太忙了。我甚至跟踪了我认识的每个大四学生,他们都说他们不知道该怎么做。我的下一个项目将很快分配,我认为如果我不能这样做,那么我将无法完成下一个项目。

1 个答案:

答案 0 :(得分:1)

您的代码会产生以下错误:

  

使用main> D

时出错      

输入参数太多。

这意味着ode45尝试使用太多输入参数调用您提供的函数D。您应该在ode45文档中检查所需的odefun格式:dydt = odefun(t,y)

因此,您应该将D的函数声明更改为

function [F] = D(t, X)

这应解决您的第一个问题,但会弹出以下错误:

  

D返回长度为4的向量,但是初始条件的长度   向量是5. D返回的向量和初始条件   vector必须具有相同数量的元素。

同样,您应该查看ode45文档。您的函数应返回所有输入变量的导数XF = dX/dt。您还应该返回第五个元素Rho_10000的派生。

接下来,我收到了一些关于未定义变量的错误,例如PASL。可能是因为您没有发布完整的代码。

除了错误之外,你应该再次检查你的代码。你写了一个无限循环while h > 0。您永远不会在循环中更改h,也不会在循环中使用ode45的输出。此外,您始终会在循环开头覆盖iX值,这可能不是您想要的。

这不是你问题的完整答案,但我希望你能够继续发布更小,更明确的问题,而不是一个很难完全回答的大问题。