Matlab 中的 ODE:如何绘制结果和分段函数

计算科学 matlab
2021-12-11 17:57:23

我已经用分段函数求解了二阶微分方程R¨=f(t,R,R˙)

P(t)={P0 if 0<t40×106(P0+Pmin)2+(P0Pmin)2cos(2πft) if 40×106<t60×106Pmin if 60×106<t100×106(P0+Pmin)2+(P0Pmin)2cos(2πft) if 100×106<t120×106P0 if t>120×106
在此处输入图像描述

我想用两个轴(我猜是命令)目前我只能绘制的图。yplotyytRtP(t)tR plot(t,R(:,1))

function overshoot()
R0 = 15e-6;
tspan = [0 160e-6];
[t,R] = ode45(@(t,R) DE(t,R,R0), tspan, [R0,0]);
t = t * 1e6;
R = R * 1e6;
plot(t,R(:,1))
end
%
function Rdot = DE(t,R,R0)
S = 0.073;
rho = 998;
mi = 1.005e-3; % kg / (m * s)
P0 = 101325;
Pvap = 2329.6;
Pmin = 1800;
f = 1e6 / 40;
%
Rdot = zeros(2,1);
Rdot(1) = R(2);
Rdot(2) = -1.5 * R(2) * R(2) / R(1) + 1 / (R(1) * rho) *...
    (Pvap - P(t,f,P0,Pmin) + (P0 - Pvap + 2 * S / R0) *...
    (R0 / R(1))^3 - 2 * S / R(1) - 4 * mi * R(2) / R(1));
end
%
function fval = P(t,f,P0,Pmin)
if (t <= 40e-6)
    fval = 101325;
elseif (t > 40e-6) && (t <= 60e-6)
    fval = (P0 + Pmin) / 2 + (P0 - Pmin) / 2 * cos(2 * pi * f * t);
elseif (t > 60e-6) && (t <= 100e-6)
    fval = 1800;
elseif (t > 100e-6) && (t <= 120e-6)
    fval = (P0 + Pmin) / 2 + (P0 - Pmin) / 2 * cos(2 * pi * f * t);
else
    fval = 101325;
end
end
1个回答

这可以通过使参数P0 Pmin f全局化来实现。

function overshoot()
global P0 Pmin f
R0 = 15e-6;

tspan = [0 160e-6]
[t,R] = ode45(@(t,R) DE(t,R,R0), tspan, [R0,0]);
%t = t * 1e6;
%R = R * 1e6;
figure(1)
plot(t,R(:,1),'r--')
hold on
plot(t,P(t,f,P0,Pmin),'o');
end  

function Rdot = DE(t,R,R0)
global P0 Pmin f
S = 0.073;
rho = 998;
mi = 1.005e-3; % kg / (m * s)
P0 = 101325;
Pvap = 2329.6;
Pmin = 1800;
f = 1e6 / 40;
%
Rdot = zeros(2,1);
Rdot(1) = R(2);
Rdot(2) = -1.5 * R(2) * R(2) / R(1) + 1 / (R(1) * rho) *...
    (Pvap - P(t,f,P0,Pmin) + (P0 - Pvap + 2 * S / R0) *...
    (R0 / R(1))^3 - 2 * S / R(1) - 4 * mi * R(2) / R(1));
end

function fval = P(t,f,P0,Pmin)
for i=1:length(t)
if (t(i) <= 40e-6)
    fval(i) = 101325;
elseif (t(i) > 40e-6) && (t(i) <= 60e-6)
    fval(i) = (P0 + Pmin) / 2 + (P0 - Pmin) / 2 * cos(2 * pi * f * t(i));
elseif (t(i) > 60e-6) && (t(i) <= 100e-6)
    fval(i) = 1800;
elseif (t(i) > 100e-6) && (t(i) <= 120e-6)
    fval(i) = (P0 + Pmin) / 2 + (P0 - Pmin) / 2 * cos(2 * pi * f * t(i));
else
    fval(i) = 101325;
end
end    
end

现在有两个轴的输出图,即但是该图没有任何意义,因为的最大值约为 yR(t)P(t)R(t)8×105P(t)10×104

无论如何,所需的组合情节看起来像这样 在此处输入图像描述

我希望这有帮助。