24小时热门版块排行榜    

查看: 1062  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 哈格不受伤 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +6 Tide man 2026-08-14 7/350 2026-08-14 18:36 by 正能量1斤
[基金申请] filecode +6 cratir 2026-08-14 10/500 2026-08-14 18:29 by 笑叹辞穷
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +6 majunge000 2026-08-11 8/400 2026-08-14 14:44 by 医学老男孩
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[基金申请] 好奇怪的filecode +6 布布和一二 2026-08-08 7/350 2026-08-14 13:38 by Equinoxhua
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +10 Tide man 2026-08-10 11/550 2026-08-14 10:30 by 沁言学术
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] FileCode能看出啥? +10 要乐观耀哥 2026-08-10 32/1600 2026-08-14 09:37 by 要乐观耀哥
[硕博家园] 一作与独作在应聘高校教师时区别大吗 +3 mbygzh 2026-08-08 4/200 2026-08-13 19:31 by 龙-樱
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
[基金申请] 2026国自然放榜时间 +9 布布和一二 2026-08-08 9/450 2026-08-10 11:22 by xxxx2020
[基金申请] 这样的filecode谁见过 +11 布布和一二 2026-08-08 22/1100 2026-08-10 11:10 by wmfsnow
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
[基金申请] 关于filecode,很负责任的告诉大家 +6 爱看书的可乐 2026-08-08 7/350 2026-08-08 22:13 by a_niu
信息提示
请填处理意见