24小时热门版块排行榜    

CyRhmU.jpeg
查看: 734  |  回复: 6

哈格不受伤

金虫 (小有名气)

[求助] 求大神帮忙看一下程序,为什么一直无法执行选择之后的循环已有2人参与

编了一个程序如下,希望p<pjc时使用一个循环,p>=pjc时使用另一个循环。在编程过程中发现不管是使用if选择语句还是while循环语句都是只能执行p<pjc时的循环,当p>pjc时程序就停止了,请各位大神帮忙看一下是什么原因,谢谢大家。
clear all
p0=101.3;kp=7.9;T0=300;md0=1.3;u0=0.5;kz=4;
Tbv=2221;Tbp=1867;
V=5000;kl=1.4;kr=1.25;
pb=p0*kp;
pjc=p0+5;
t(1)=0;tj=0.001;
Vr(1)=0;
Vrj(1)=0;
p(1)=p0;
u(1)=u0;
krj(1)=0;
rr(1)=0;
mdw(1)=md0;
Tw(1)=T0;
i=1;
%开始循环计算
while p(i)<=pb & p(i)>=p0
while p<=pjc & i<319
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));
p(i)=p(i-1)+krj(i)*(pb-p0);
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));
Vw(i)=V-Vr(i);
rr(i)=((3*Vr(i))/(4*pi))^(1/3);
u(i)=((rr(i)-rr(i-1))/tj);
mdw(i)=md0*((p(i)/p0)^(1/kl));
Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));
Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));
end
while p>pjc
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));
p(i)=p(i-1)+krj(i)*(pb-p0);
pb(i)=p(i)
%pb(i)=p(i-1)+krj(i)*(pb-p0);
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));
Vw(i)=V-Vr(i);
rr(i)=((3*Vr(i))/(4*pi))^(1/3);
u(i)=((rr(i)-rr(i-1))/tj);
mdw(i)=md0*((p(i)/p0)^(1/kl));
%Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));
%Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
%mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));
Vbw(i)=(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));
Vbr(i)=V-Vbw(i);
mdbw(i)=mdw(i-1)*(Vw(i-1)-Vrj(i))/Vbw(i);
mdbr(i)=(mdr(i-1)*Vr(i-1)+mdw(i-1)*Vrj(i))/Vbr(i);
Sl=150;Sr=150;
Vxr(i)=((Sr*tj)/mdbr(i))*((2*p(i-1)*mdr(i-1)*(((p0/p(i-1))^(2/kr))-((p0/p(i-1))^((kr+1)/kr))))^(1/2));
Vxl(i)=((Sl*tj)/mdbw(i))*((2*p(i-1)*mdw(i-1)*(((p0/p(i-1))^(2/kl))-((p0/p(i-1))^((kl+1)/kl))))^(1/2));
pr(i)=pb(i)*(((Vbw(i)-(Vxl(i)))/Vbw(i))^(kl));
pl(i)=pb(i)*(((Vbr(i)-(Vxr(i)))/Vbr(i))^(kr));
p(i)=((Vbw(i)*((pr(i))^(1/kl))+((pl(i)/((pr(i)+pl(i))/2))^((kl-kr)/(kl*kr)))*Vbr(i)*((pl(i))^(1/kl)))/V)^kl;
end
end
plot(t,p)
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
显然,while p>pjc是无法执行的, p是一个1*318的数组,里面并不是所有的值都大于pjc的,所以该while循环无法执行。
2楼2016-12-16 18:13:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

哈格不受伤

金虫 (小有名气)

引用回帖:
2楼: Originally posted by pdl9527 at 2016-12-16 18:13:48
显然,while p>pjc是无法执行的, p是一个1*318的数组,里面并不是所有的值都大于pjc的,所以该while循环无法执行。

谢谢回复,我现在知道当p>pjc时是第318步,将选择条件改为while i<=318时进行选择计算(具体程序如下),但是现实结果出现In an assignment  A(I) = B, the number of elements in B and  I must be the same.
Error in ==> jingque1 at 41
p(i)=p(i-1)+krj(i)*(pb-p0);%压力
实在想不出来这一步究竟错在哪里啊。
clear all
p0=101.3;kp=7.9;T0=300;md0=1.3;u0=0.5;kz=4;%初始条件(压力、压缩系数、温度、密度、燃烧速度、湍流因子)
Tbv=2221;Tbp=1867;%燃烧产物温度
V=5000;kl=1.4;kr=1.25;%屋室体积、冷气体与热气体比热容比
pb=p0*kp;%爆后压力
pjc=p0+5;
t(1)=0;tj=0.001;%初始时间与时间间隔
Vr(1)=0;%初始燃烧产物体积
Vrj(1)=0;%单位时间内燃烧的气体体积
p(1)=p0;%初始压力
u(1)=u0;%初始速度
krj(1)=0;%初始燃尽率
rr(1)=0;%燃烧产物半径
mdw(1)=md0;%未燃气体密度
Tw(1)=T0;%未燃气体温度
i=1;
%开始循环计算
while p(i)<=pb & p(i)>=p0
while  i<318
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25%正常传播速度--------------需要改进
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);%单位时间内燃烧的体积
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));%燃尽率
p(i)=p(i-1)+krj(i)*(pb-p0);%压力
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%燃烧产物体积
Vw(i)=V-Vr(i);%未燃产物体积
rr(i)=((3*Vr(i))/(4*pi))^(1/3);%燃烧产物半径
u(i)=((rr(i)-rr(i-1))/tj);%可见传播速度
mdw(i)=md0*((p(i)/p0)^(1/kl));%未燃气体密度
Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));%未燃气体温度
Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));%燃烧产物密度
end
while i>=318
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25%正常传播速度--------------需要改进
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);%单位时间内燃烧的体积
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));%燃尽率
p(i)=p(i-1)+krj(i)*(pb-p0);%压力
pb(i)=p(i)
%pb(i)=p(i-1)+krj(i)*(pb-p0);%压力
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%燃烧产物体积
Vw(i)=V-Vr(i);%未燃产物体积
rr(i)=((3*Vr(i))/(4*pi))^(1/3);%燃烧产物半径
u(i)=((rr(i)-rr(i-1))/tj);%可见传播速度
mdw(i)=md0*((p(i)/p0)^(1/kl));%未燃气体密度
%Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));%未燃气体温度
%Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
%mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));%燃烧产物密度
Vbw(i)=(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%爆室内未燃气体体积
Vbr(i)=V-Vbw(i);%爆室内已燃气体体积
mdbw(i)=mdw(i-1)*(Vw(i-1)-Vrj(i))/Vbw(i);%爆室内未反应气体密度
mdbr(i)=(mdr(i-1)*Vr(i-1)+mdw(i-1)*Vrj(i))/Vbr(i);%爆室内燃烧产物密度
Sl=150;Sr=150;
Vxr(i)=((Sr*tj)/mdbr(i))*((2*p(i-1)*mdr(i-1)*(((p0/p(i-1))^(2/kr))-((p0/p(i-1))^((kr+1)/kr))))^(1/2));%泄露的燃烧产物体积
Vxl(i)=((Sl*tj)/mdbw(i))*((2*p(i-1)*mdw(i-1)*(((p0/p(i-1))^(2/kl))-((p0/p(i-1))^((kl+1)/kl))))^(1/2));%泄露的未燃气体体积
pr(i)=pb(i)*(((Vbw(i)-(Vxl(i)))/Vbw(i))^(kl));%热气体过程压力
pl(i)=pb(i)*(((Vbr(i)-(Vxr(i)))/Vbr(i))^(kr));%冷气体过程压力
p(i)=((Vbw(i)*((pr(i))^(1/kl))+((pl(i)/((pr(i)+pl(i))/2))^((kl-kr)/(kl*kr)))*Vbr(i)*((pl(i))^(1/kl)))/V)^kl;
end
end
plot(t,p)
请问这是为什么?
3楼2016-12-16 19:48:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

哈格不受伤

金虫 (小有名气)

引用回帖:
2楼: Originally posted by pdl9527 at 2016-12-16 18:13:48
显然,while p>pjc是无法执行的, p是一个1*318的数组,里面并不是所有的值都大于pjc的,所以该while循环无法执行。

如果改成if语句,则可以计算但是还是只能算p<pjc之前的过程,请问是为什么,想了好久都不明白。
p0=101.3;kp=7.9;T0=300;md0=1.3;u0=0.5;kz=4;%初始条件(压力、压缩系数、温度、密度、燃烧速度、湍流因子)
Tbv=2221;Tbp=1867;%燃烧产物温度
V=5000;kl=1.4;kr=1.25;%屋室体积、冷气体与热气体比热容比
pb=p0*kp;%爆后压力
pjc=p0+5;
t(1)=0;tj=0.001;%初始时间与时间间隔
Vr(1)=0;%初始燃烧产物体积
Vrj(1)=0;%单位时间内燃烧的气体体积
p(1)=p0;%初始压力
u(1)=u0;%初始速度
krj(1)=0;%初始燃尽率
rr(1)=0;%燃烧产物半径
mdw(1)=md0;%未燃气体密度
Tw(1)=T0;%未燃气体温度
i=1;
%开始循环计算
while p(i)<=pb & p(i)>=p0
if  i<318
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25%正常传播速度--------------需要改进
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);%单位时间内燃烧的体积
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));%燃尽率
p(i)=p(i-1)+krj(i)*(pb-p0);%压力
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%燃烧产物体积
Vw(i)=V-Vr(i);%未燃产物体积
rr(i)=((3*Vr(i))/(4*pi))^(1/3);%燃烧产物半径
u(i)=((rr(i)-rr(i-1))/tj);%可见传播速度
mdw(i)=md0*((p(i)/p0)^(1/kl));%未燃气体密度
Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));%未燃气体温度
Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));%燃烧产物密度
else
i=i+1;
t(i)=t(i-1)+tj;
uz(i)=u0*(p(i-1)/p0)^0.25%正常传播速度--------------需要改进
Vrj(i)=(4*pi/3)*(((3*Vr(i-1)/(4*pi))^(1/3)+(kz*uz(i)*tj))^3)-Vr(i-1);%单位时间内燃烧的体积
krj(i)=(Vrj(i)/V)*((p(i-1)/p0)^(1/kl));%燃尽率
p(i)=p(i-1)+krj(i)*(pb-p0);%压力
pb(i)=p(i)
%pb(i)=p(i-1)+krj(i)*(pb-p0);%压力
Vr(i)=V-(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%燃烧产物体积
Vw(i)=V-Vr(i);%未燃产物体积
rr(i)=((3*Vr(i))/(4*pi))^(1/3);%燃烧产物半径
u(i)=((rr(i)-rr(i-1))/tj);%可见传播速度
mdw(i)=md0*((p(i)/p0)^(1/kl));%未燃气体密度
%Tw(i)=T0*((p(i)/p0)^((kl-1)/kl));%未燃气体温度
%Tr(i)=Tbp+(Tbv-Tbp)*((p(i)-p0)/(pb-p0));
%mdr(i)=(p(i)*Tbv*md0)/(pb*Tr(i));%燃烧产物密度
Vbw(i)=(V-Vr(i-1)-Vrj(i))*((p(i-1)/p(i))^(1/kl));%爆室内未燃气体体积
Vbr(i)=V-Vbw(i);%爆室内已燃气体体积
mdbw(i)=mdw(i-1)*(Vw(i-1)-Vrj(i))/Vbw(i);%爆室内未反应气体密度
mdbr(i)=(mdr(i-1)*Vr(i-1)+mdw(i-1)*Vrj(i))/Vbr(i);%爆室内燃烧产物密度
Sl=150;Sr=150;
Vxr(i)=((Sr*tj)/mdbr(i))*((2*p(i-1)*mdr(i-1)*(((p0/p(i-1))^(2/kr))-((p0/p(i-1))^((kr+1)/kr))))^(1/2));%泄露的燃烧产物体积
Vxl(i)=((Sl*tj)/mdbw(i))*((2*p(i-1)*mdw(i-1)*(((p0/p(i-1))^(2/kl))-((p0/p(i-1))^((kl+1)/kl))))^(1/2));%泄露的未燃气体体积
pr(i)=pb(i)*(((Vbw(i)-(Vxl(i)))/Vbw(i))^(kl));%热气体过程压力
pl(i)=pb(i)*(((Vbr(i)-(Vxr(i)))/Vbr(i))^(kr));%冷气体过程压力
p(i)=((Vbw(i)*((pr(i))^(1/kl))+((pl(i)/((pr(i)+pl(i))/2))^((kl-kr)/(kl*kr)))*Vbr(i)*((pl(i))^(1/kl)))/V)^kl;
end
end
plot(t,p)
4楼2016-12-16 20:03:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

引用回帖:
3楼: Originally posted by 哈格不受伤 at 2016-12-16 19:48:56
谢谢回复,我现在知道当p>pjc时是第318步,将选择条件改为while i<=318时进行选择计算(具体程序如下),但是现实结果出现In an assignment  A(I) = B, the number of elements in B and  I must be the sam ...

while i>=318执行一次后,pb变为一个1*319行的数组,由于直接从i+1=319开始,所以前1:318列为0。

显然在pb(i)=p(i-1)+krj(i)*(pb-p0)中由于维数不同无法计算和赋值。

感觉你把程序写的太复杂了,每写一句程序要明白是为了干什么,会产生什么结果。
5楼2016-12-16 21:21:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

【答案】应助回帖

引用回帖:
4楼: Originally posted by 哈格不受伤 at 2016-12-16 20:03:25
如果改成if语句,则可以计算但是还是只能算p<pjc之前的过程,请问是为什么,想了好久都不明白。
p0=101.3;kp=7.9;T0=300;md0=1.3;u0=0.5;kz=4;%初始条件(压力、压缩系数、温度、密度、燃烧速度、湍流因子)
Tb ...

一样的道理,else后面其实执行过一次的,执行完后pb的维数发生变化,导致while p(i)<=pb & p(i)>=p0不能继续进行。
6楼2016-12-16 21:29:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mygt_hit

专家顾问 (职业作家)

【答案】应助回帖

感谢参与,应助指数 +1
以1楼代码为准,循环判别条件不明确。
第一个while p(i)<=pb & p(i)>=p0:pb在循环体内改为数组,单个数p(i)无法和数组pb比较大小,判别条件建议改为 while p(i)<=pb(i) & p(i)>=p0
第二个while p<=pjc & i<319 :p是数组,数组和标量pjc无法比较大小,建议改为while p<=pjc & i<319
第三个while p>pjc :p是数组,同样无法比较大小,建议改为while p(i)>pjc
知其然,知其所以然。
7楼2016-12-17 13:01:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 哈格不受伤 的主题更新
信息提示
请填处理意见