2017-03-19 11 views
0

私はこのMatlabプロジェクトを持っていますが、何らかの理由で私はそれを動作させることができなかったので、私はそれについて考えるのをやめることができません。このMATLABコードをデバッグして、グライダー降下をモデル化するにはどうすればよいですか?

目的:

これは万フィートから削除されているグライダーの圧力、温度と密度の変化を計算うMATLABスクリプトです。それが下がるにつれて、計算された新しい値を使用し、ode45とP TとRhoの新しい値だけでなく、すべての点で微分する必要のある4つの方程式を持つ関数を差し込みます。ここで

メインのコードです:ここでは

% 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

「私はそれを動作させることができませんでしたか?」 - 問題を説明してください!構文エラー、エラーを実行しますか?予想外の結果?コードだけでなく、私たちがあなたのために仕事をすることを期待してください。 – hpaulj

+0

先生、ありがとうございました。私が以前に言いましたように、私はこれまで毎日この約1ヶ月間作業していましたが、私は不足していると私は明らかにこの作業を行う方法を知らない、私は本当に試しました!あなたは私の無能さを責めることができますが、それは真実ではないので、私が人々のためにそれを捨てているとは言えません。あなたの質問に答えるために、それはすべてです。私はプログラマーではなく、MATLABの過去の経験はありません。突然、それを正しく理解するために複雑で期待される何かのために突然それを使用しなければなりません。 – Gadless

答えて

1

あなたのコードは、次のエラーを生成します。

Error using main>D

Too many input arguments.

これは、関数ode45は、あまりにも多くの入力引数を使用して提供される機能Dを呼び出そうとしていることを意味します。 dydt = odefun(t,y)

だから、あなたはあなたの最初の問題を解決する必要があり

function [F] = D(t, X) 

これにDのあなたの関数の宣言を変更する必要がありますが、次のエラーがポップアップ表示されます:あなたはode45ドキュメントに必要なodefun形式を確認する必要があり

D returns a vector of length 4, but the length of initial conditions vector is 5. The vector returned by D and the initial conditions vector must have the same number of elements.

また、ode45のドキュメントを確認する必要があります。あなたの関数は、入力変数XF = dX/dtのすべての導関数を返さなければなりません。また、第5要素Rho_10000の派生物を返さなければなりません。

次に、PASLのような未定義の変数に関するエラーが発生しました。おそらくあなたは完全なコードを投稿していないからです。

エラーのほかに、実際にコードを再度確認する必要があります。あなたは無限のwhileループwhile h > 0を書いています。ループ内でhを変更したり、ループ内でode45の出力を使用したりすることはありません。さらに、ループの始めにはiXの値が常に上書きされますが、これはおそらくあなたが望むものではありません。

これはあなたの質問に対する完全な答えではありませんが、完全に答えにくい1つの大きな問題の代わりに、より小さく、明確に定義された問題を続行して投稿できることを願っています。

+0

ありがとうございました。これはとても役に立ちました!私のスクリプトを見て時間をとってくれてありがとう、それは私にそれほど意味があります。私はあなたから学んだすべてを使ってやり直します。ありがとうございました! – Gadless

関連する問題