问题描述:由于数值求解微分方程的过程中出现不符合客观事实的解,故尝试用if语句剔除不合常理的情况,具体情况为求解一个容器内液面高度的变化问题(有降雨,有排水,动态变化)
因为用数值求解微分方程,先编辑函数文件如下
function dh=jiangyu (t,h)
%降雨量的表达式
if t<=400
a=6*12*(0.122*10^(-3)-abs(0.00061*t*10^(-3)-0.122*10^(-3)))*cos(pi/9)
else
a=0
end
%液面高度微分方程中的其他部分:
b=0.7*pi*(0.05)^2*sqrt(2*9.81*h)
c=2*12*sqrt(0.15*h-h^2)
%使结果符合客观事实,增加下面的判定
z=isreal((a-b)/c)
%如果液面高度正常为大于零的数,便按所设微分方程求解
if z=1
dh=(a-b)/c
%如果液面高度小于零,且此时不再下雨,则液面不再变化
elseif z=0 and a=0
dh=0
%如果液面高度小于零,但仍然下雨,则液面将会上升,速度为下式
else
h=0.0001 and dh=(a-b)/c
end
end
再编辑脚本文件如下:
t0=0;tf=200
h0=0.001
[t,h]=ode45(@jiangyu,[t0,tf],h0);
plot(t,h,'b')
grid on
但是if语句一直报错,不知该如何修改,可能不应该用if,但是小弟初学,不太会用,还请各位多多指教
回答:function dh=jiangyu (t,h) %降雨量的表达式 if t<=400 a=6*12*(0.122*10^(-3)-abs(0.00061*t*10^(-3)-0.122*10^(-3)))*cos(pi/9); else a=0; end %液面高度微分方程中的其他部分: b=0.7*pi*(0.05)^2*sqrt(2*9.81*h); c=2*12*sqrt(0.15*h-h^2); %使结果符合客观事实,增加下面的判定 z=isreal((a-b)/c); %如果液面高度正常为大于零的数,便按所设微分方程求解 if z==1 dh=(a-b)/c; %如果液面高度小于零,且此时不再下雨,则液面不再变化 elseif (z==0 & a==0) dh=0; %如果液面高度小于零,但仍然下雨,则液面将会上升,速度为下式 else h=0.0001; dh=(a-b)/c; end end
你的判断等于要改成 == 没有and这个用法的,用& 表并列直接回车就行了 你的c可能是虚数,注意~ |
|