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
采纳的回答
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 个评论
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.
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
Thank you very much, you saved my day.
@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!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 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)
