24小时热门版块排行榜    

查看: 814  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 哈格不受伤 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料工程(专)一志愿985 初试335求调剂 +3 hiloiy 2026-03-17 4/200 2026-03-21 03:04 by JourneyLucky
[考研] 二本跨考郑大材料306英一数二 +3 z1z2z3879 2026-03-17 3/150 2026-03-21 02:29 by JourneyLucky
[考研] 085700资源与环境308求调剂 +12 墨墨漠 2026-03-18 13/650 2026-03-21 01:42 by JourneyLucky
[考研] 22408 344分 求调剂 一志愿 华电计算机技术 +4 solanXXX 2026-03-20 4/200 2026-03-20 23:49 by alg094825
[考研] 085600材料与化工 +8 安全上岸! 2026-03-16 8/400 2026-03-20 22:13 by luoyongfeng
[考研] 290求调剂 +7 ^O^乜 2026-03-19 7/350 2026-03-20 21:43 by JourneyLucky
[考研] 一志愿华中农业071010,总分320求调剂 +3 困困困困坤坤 2026-03-20 3/150 2026-03-20 20:38 by 学员8dgXkO
[考研] 材料学求调剂 +4 Stella_Yao 2026-03-20 4/200 2026-03-20 20:28 by ms629
[考研] 工科材料085601 279求调剂 +7 困于星晨 2026-03-17 9/450 2026-03-20 17:38 by 无懈可击111
[考研] 广西大学家禽遗传育种课题组2026年硕士招生(接收计算机专业调剂) +3 123阿标 2026-03-17 3/150 2026-03-20 15:58 by 飞行琦
[考研] 招收调剂硕士 +4 lidianxing 2026-03-19 12/600 2026-03-20 12:25 by lidianxing
[考研] 求调剂 +3 暗涌afhb 2026-03-16 3/150 2026-03-20 00:28 by 河南大学校友
[考研] 0703化学调剂 +4 18889395102 2026-03-18 4/200 2026-03-19 16:13 by 30660438
[考研] 328求调剂,英语六级551,有科研经历 +4 生物工程调剂 2026-03-16 12/600 2026-03-19 11:10 by 生物工程调剂
[考研] 材料专硕306英一数二 +10 z1z2z3879 2026-03-16 13/650 2026-03-18 14:20 by 007_lilei
[考研] 301求调剂 +4 A_JiXing 2026-03-16 4/200 2026-03-17 17:32 by ruiyingmiao
[考研] 有没有道铁/土木的想调剂南林,给自己招师弟中~ +3 TqlXswl 2026-03-16 7/350 2026-03-17 15:23 by TqlXswl
[考研] 一志愿,福州大学材料专硕339分求调剂 +3 木子momo青争 2026-03-15 3/150 2026-03-17 07:52 by laoshidan
[考研] 333求调剂 +3 文思客 2026-03-16 7/350 2026-03-16 18:21 by 文思客
[考研] 304求调剂 +5 素年祭语 2026-03-15 5/250 2026-03-16 17:00 by 我的船我的海
信息提示
请填处理意见