Creating vector in ODE Function to plot graphs
現在この質問をフォロー中です
- フォローしているコンテンツ フィードに更新が表示されます。
- コミュニケーション基本設定に応じて電子メールを受け取ることができます。
エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
古いコメントを表示
Hi, i want to plot the acceleration over time but i dont know how i can create a vector for the acceleration dvdt and the time t. There are just single outputs for them when i run the code.
tRange = [0 120];
v0 = 6000;
[tSol,vSol] = ode45(@fallingbody,tRange,v0);
plot(tSol,vSol)
function dvdt = fallingbody(t,v)
D = 3.3e-5;
g = 3.72;
dvdt = g - D*v^2
%plot(t,dvdt)
end
採用された回答
Star Strider
2022 年 7 月 10 日
Probably the easiest way to return the derivative is to use a loop to calculate it from the original function using ‘tSol’ and the solved values for the velocity, ‘vSol’ —
tRange = [0 120];
v0 = 6000;
[tSol,vSol] = ode45(@fallingbody,tRange,v0);
for k = 1:numel(tSol)
dvdt(k,:) = fallingbody(tSol(k),vSol(k));
end
figure
plot(tSol,vSol, tSol,dvdt)
grid
legend('Velocity','Acceleration', 'Location','best')

function dvdt = fallingbody(t,v)
D = 3.3e-5;
g = 3.72;
dvdt = g - D*v^2;
end
.
7 件のコメント
Leon Waschkowski
2022 年 7 月 10 日
Thank you for your answer. Is there a way to create a vector in the function not only for the derivative but also for example for 'D'? Im trying to transfer this solution to a rocket trajectory simulation where i want to plot the Thrust over time.
Star Strider
2022 年 7 月 10 日
My pleasure!
This is the only way that I am aware of that it is possible to calculate the derivative using the original function. An alternative would be to use the gradient function on the result, for example:
dvdt = gradient(vSol) ./ gradient(tSol);
Since ‘D’ is a constant, just define it again in the calling workspace.
For a constant like 'D' it works. In my example the thrust is time dependent (if loop) and when i try to create a vector it just creates a vector with the last value of the thrust. In this example i get a array with all zeros because at the end at t =120 i have a thrust of 0 and the phase t<=10 is not taken into account. I hope i described my problem understandably.
global thrust
tRange = [0 120];
v0 = 6000;
[tSol,vSol] = ode45(@fallingbody,tRange,v0);
for k = 1:numel(tSol)
T(k,:) = thrust;
end
figure
plot(tSol,T)
function dvdt = fallingbody(t,v)
global thrust
if t <= 10
thrust = 5;
else
thrust = 0;
end
g = 3.72;
dvdt = g - thrust*v^2;
end
tRange = [0 120];
v0 = 6000;
[tSol,vSol] = ode45(@fallingbody,tRange,v0);
for k = 1:numel(tSol)
T(k,:) = Thrust(tSol(k));
end
figure
plot(tSol,T)

function dvdt = fallingbody(t,v)
thrust = Thrust(t);
g = 3.72;
dvdt = g - thrust*v^2;
end
function thrust = Thrust(t)
if t <= 10
thrust = 5;
else
thrust = 0;
end
end
Or:
tRange = [0 120];
v0 = 6000;
[tSol,vSol] = ode45(@fallingbody,tRange,v0);
for k = 1:numel(tSol)
[~,T(k,:)] = fallingbody(tSol(k),vSol(k,:));
end
figure
plot(tSol,T)

function [dvdt,thrust] = fallingbody(t,v)
if t <= 10
thrust = 5;
else
thrust = 0;
end
g = 3.72;
dvdt = g - thrust*v^2;
end
Leon Waschkowski
2022 年 7 月 10 日
Thank you very much, you saved my day.
Star Strider
2022 年 7 月 10 日
@Torsten — Thank you!
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Assembly についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
