环评程序.docx
- 文档编号:6570111
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:31
- 大小:68.71KB
环评程序.docx
《环评程序.docx》由会员分享,可在线阅读,更多相关《环评程序.docx(31页珍藏版)》请在冰豆网上搜索。
环评程序
北京化工大学
环境评价程序设计
河流断面、多箱模型
小组成员:
陈泽洲200712023
许双辰200712011
王成宁200712003
2010/1/20
程序一河流断面(以5断面为例)
程序界面:
程序代码(Form1):
Dima_1,b_1,c_1,d_1,A,B,C,D,fAsSingle
'------------------------------------------------------------------------------
'矩阵的乘法函数
PublicFunctionMatMultiply(x()AsSingle,y()AsSingle)AsSingle()
DimnAsInteger
DimmAsInteger
DimpAsInteger
DimkAsInteger
Dimz()AsSingle
n=UBound(x,1)
m=UBound(x,2)
p=UBound(y,2)
ReDimz(1Ton,1Top)
ReDimz(n,p)
Ifm<>UBound(y,1)Then
MsgBox("这两个矩阵不能相乘!
"+Str$(m)+Str$(UBound(y,1)))
Else:
Fori=1Ton
Forj=1Tom
Fork=1Top
z(i,k)=z(i,k)+x(i,j)*y(j,k)
Nextk
Nextj
Nexti
EndIf
MatMultiply=z
EndFunction
'------------------------------------------------------------------------------
PrivateSubCommand1_Click()
'赋值
OS=Val(Text39.Text)
Q1=Val(Text1.Text)
Q2=Val(Text2.Text)
Q3=Val(Text3.Text)
Q4=Val(Text4.Text)
Q5=Val(Text5.Text)
L1=Val(Text6.Text)
L2=Val(Text7.Text)
L3=Val(Text8.Text)
L4=Val(Text9.Text)
L5=Val(Text10.Text)
O1=Val(Text11.Text)
O2=Val(Text12.Text)
O3=Val(Text13.Text)
O4=Val(Text14.Text)
O5=Val(Text15.Text)
Q0=Val(Text16.Text)
L0=Val(Text17.Text)
O0=Val(Text18.Text)
K10=Val(Text19.Text)
K20=Val(Text20.Text)
t0=Val(Text21.Text)
K11=Val(Text25.Text)
K21=Val(Text26.Text)
t1=Val(Text30.Text)
K12=Val(Text24.Text)
K22=Val(Text27.Text)
t2=Val(Text31.Text)
K13=Val(Text23.Text)
K23=Val(Text28.Text)
t3=Val(Text32.Text)
K14=Val(Text22.Text)
K24=Val(Text29.Text)
t4=Val(Text33.Text)
Q31=Val(Text34.Text)
Q32=Val(Text35.Text)
Q33=Val(Text36.Text)
Q34=Val(Text37.Text)
Q35=Val(Text38.Text)
Q21=Q0-Q31+Q1
Q12=Q21
Q22=Q12-Q32+Q2
Q13=Q22
Q23=Q13-Q33+Q3
Q14=Q23
Q24=Q14-Q34+Q4
Q15=Q24
Q25=Q15-Q35+Q5
'------------------------------------------------------------------------------
'a_b_c_d_的计算
a_0=Exp(-K10*t0)
a_1=Exp(-K11*t1)
a_2=Exp(-K12*t2)
a_3=Exp(-K13*t3)
a_4=Exp(-K14*t4)
c_0=Exp(-K20*t0)
c_1=Exp(-K21*t1)
c_2=Exp(-K22*t2)
c_3=Exp(-K23*t3)
c_4=Exp(-K24*t4)
b_0=K10*(a_0-c_0)/(K20-K10)
b_1=K11*(a_1-c_1)/(K21-K11)
b_2=K12*(a_2-c_2)/(K22-K12)
b_3=K13*(a_3-c_3)/(K23-K13)
b_4=K14*(a_4-c_4)/(K24-K14)
d_0=OS*(1-c_0)
d_1=OS*(1-c_1)
d_2=OS*(1-c_2)
d_3=OS*(1-c_3)
d_4=OS*(1-c_4)
'------------------------------------------------------------------------------
'矩阵中元素abcdf的计算
a0=a_0*(Q0-Q31)/Q21
a1=a_1*(Q12-Q32)/Q22
a2=a_2*(Q13-Q33)/Q23
a3=a_3*(Q14-Q34)/Q24
a4=a_4*(Q15-Q35)/Q25
b1=Q1/Q21
b2=Q2/Q22
b3=Q3/Q23
b4=Q4/Q24
b5=Q5/Q25
c0=(Q0-Q31)/Q21*c_0
c1=(Q12-Q32)/Q22*c_1
c2=(Q13-Q33)/Q23*c_2
c3=(Q14-Q34)/Q24*c_3
c4=(Q15-Q35)/Q25*c_4
d0=(Q0-Q31)/Q21*b_0
d1=(Q12-Q32)/Q22*b_1
d2=(Q13-Q33)/Q23*b_2
d3=(Q14-Q34)/Q24*b_3
d4=(Q15-Q35)/Q25*b_4
f0=(Q0-Q31)/Q21*d_0
f1=(Q12-Q32)/Q22*d_1
f2=(Q13-Q33)/Q23*d_2
f3=(Q14-Q34)/Q24*d_3
f4=(Q15-Q35)/Q25*d_4
'------------------------------------------------------------------------------'矩阵ABCDfghf+h(fh)OL的计算
DimA(5,5)AsSingle
Fori=1To5
Forj=1To5
A(i,j)=0
Nextj
Nexti
If1>0Then
A(2,1)=-a1
A(3,2)=-a2
A(4,3)=-a3
A(5,4)=-a4
A(1,1)=1
A(2,2)=1
A(3,3)=1
A(4,4)=1
A(5,5)=1
EndIf
DimB(5,5)AsSingle
Fori=1To5
Forj=1To5
B(i,k)=0
Nextj
Nexti
If1>0Then
B(1,1)=b1
B(2,2)=b2
B(3,3)=b3
B(4,4)=b4
B(5,5)=b5
EndIf
DimC(5,5)AsSingle
Fori=1To5
Forj=1To5
C(i,j)=0
Nextj
Nexti
If1>0Then
C(2,1)=-c1
C(3,2)=-c2
C(4,3)=-c3
C(5,4)=-c4
C(1,1)=1
C(2,2)=1
C(3,3)=1
C(4,4)=1
C(5,5)=1
EndIf
DimD(5,5)AsSingle
Fori=1To5
Forj=1To5
D(i,k)=0
Nextj
Nexti
If1>0Then
D(2,1)=d1
D(3,2)=d2
D(4,3)=d3
D(5,4)=d4
EndIf
Dimg(5,1)AsSingle
Fori=1To5
g(i,1)=0
Nexti
g(1,1)=a0*L0
Dimf(5,1)AsSingle
If1>0Then
f(1,1)=f0
f(2,1)=f1
f(3,1)=f2
f(4,1)=f3
f(5,1)=f4
EndIf
Dimh(5,1)AsSingle
Fori=1To5
h(i,1)=0
Nexti
h(1,1)=c0*O0-d0*L0
Dimfh(5,1)AsSingle
Fori=1To5
fh(i,1)=f(i,1)+h(i,1)
Nexti
DimO(5,1)AsSingle
If1>0Then
O(1,1)=O1
O(2,1)=O2
O(3,1)=O3
O(4,1)=O4
O(5,1)=O5
EndIf
DimL(5,1)AsSingle
If1>0Then
L(1,1)=L1
L(2,1)=L2
L(3,1)=L3
L(4,1)=L4
L(5,1)=L5
EndIf
'------------------------------------------------------------------------------
'求向量A、C的逆矩阵AA、CC
Form2.Text2.Text=1
i=1
j=1
Fork=1To5^2
Ifj>5Then
j=1
i=i+1
EndIf
Form2.Text1(k-1).Text=A(i,j)
j=j+1
Nextk
Form2.Text2.Text=2
DimAA(5,5)AsSingle
i=1
j=1
Fork=1To5^2
Ifj>5Then
j=1
i=i+1
EndIf
AA(i,j)=Form2.Text1(k-1).Text
j=j+1
Nextk
Form2.Text2.Text=3
i=1
j=1
Fork=1To5^2
Ifj>5Then
j=1
i=i+1
EndIf
Form2.Text1(k-1).Text=C(i,j)
j=j+1
Nextk
Form2.Text2.Text=4
DimCC(5,5)AsSingle
i=1
j=1
Fork=1To5^2
Ifj>5Then
j=1
i=i+1
EndIf
CC(i,j)=Form2.Text1(k-1).Text
j=j+1
Nextk
'------------------------------------------------------------------------------
'求U、V_、m、nV(向量的乘法)
DimU()AsSingle
ReDimV_(5,5)AsSingle
Dimm()AsSingle
U=MatMultiply(AA(),B())
V_=MatMultiply(MatMultiply(MatMultiply(CC(),D()),AA()),B())
m=MatMultiply(AA(),g())
DimV(5,5)AsSingle
Fori=1To5
Forj=1To5
V(i,j)=-1*V_(i,j)
Nextj
Nexti
'--------------------------------------------------------------
'求n
ReDimn1(5,1)AsSingle
ReDimn2(5,1)AsSingle
ReDimn3(5,1)AsSingle
Dimn(5,1)AsSingle
n1=MatMultiply(MatMultiply(CC(),B()),O())
n2=MatMultiply(CC(),fh)
n3=MatMultiply(MatMultiply(MatMultiply(CC(),D()),AA()),g())
Fori=1To5
n(i,1)=n1(i,1)+n2(i,1)-n3(i,1)
Nexti
'------------------------------------------------------------------------------
'输出结果U、V、m、n
Form1.Picture1.Print"计算结果为"
Form1.Picture1.Print
Form1.Picture1.Print"U="
Fori=1To5
Forj=1To5
Form1.Picture1.PrintRound(U(i,j),5),tab5,
Nextj
Picture1.Print
Nexti
Form1.Picture1.Print
Form1.Picture1.Print"V="
Fori=1To5
Forj=1To5
Form1.Picture1.PrintRound(V(i,j),5),tab5,
Nextj
Picture1.Print
Nexti
Form1.Picture2.Print
Form1.Picture2.Print"m="
Fori=1To5
Form1.Picture2.PrintRound(m(i,1),5),tab5,
Picture2.Print
Nexti
Form1.Picture2.Print
Form1.Picture2.Print"n="
Fori=1To5
Form1.Picture2.PrintRound(n(i,1),5),tab5,
Picture2.Print
Nexti
'------------------------------------------------------------------------------
'计算L2、O2
DimUL()AsSingle
DimL2_(5,1)AsSingle
UL=MatMultiply(U(),L())
Fori=1To5
L2_(i,1)=UL(i,1)+m(i,1)
Nexti
DimVL()AsSingle
DimO2_(5,1)AsSingle
VL=MatMultiply(V(),L())
Fori=1To5
O2_(i,1)=VL(i,1)+n(i,1)
Nexti
'------------------------------------------------------------------------------
'输出L2、O2
Form1.Picture2.Print
Form1.Picture2.Print"L2="
Fori=1To5
Form1.Picture2.PrintRound(L2_(i,1),5),tab5,
Picture2.Print
Nexti
Form1.Picture2.Print
Form1.Picture2.Print"O2="
Fori=1To5
Form1.Picture2.PrintRound(O2_(i,1),5),tab5,
Picture2.Print
Nexti
EndSub
程序代码(Form2):
DimA()AsDouble
DimB()AsDouble
DimnAsInteger
PrivateSubForm_Load()
n=5
ReDimA(n*n)AsDouble
ReDimB(n*n)AsDouble
CallCs1(A,B,n,0)
EndSub
'------------------------------------------------------------------------------
PrivateSubQn(YszAsVariant,XszAsVariant,ByValnAsInteger)'求逆函数
DimTmpszAsVariant
ReDimPreserveYsz(n*n)AsDouble'对数组的重声明
ReDimPreserveXsz(n*n)AsDouble
ReDimTmpsz(2*n*n)AsDouble
DimiAsInteger
DimjAsInteger
DimkAsInteger
Fori=0Ton-1'将原数组转入临时数组
Forj=0Ton-1
Tmpsz(2*i*n+j)=Ysz(i*n+j)
Nextj
Nexti
Fori=0Ton-1'在后面加一个增补矩阵
Forj=0Ton-1
Tmpsz(2*i*n+n+j)=0
Tmpsz(2*i*n+n+i)=1
Nextj
Nexti
Fori=0Ton-1
DimIkAsDouble
DimIcountAsInteger
Icount=0
Ik=Tmpsz(2*i*n+i)'解决其中首数字为0的情况
IfIk=0Then
Icount=1
Fork=iTon-1
IfTmpsz(2*k*n+i)<>0Then
Icount=Icount+1
DimiTmpAsDouble
Ik=Tmpsz(2*k*n+i)
Forj=iTo2*n-1
iTmp=Tmpsz(2*k*n+j)
Tmpsz(2*k*n+j)=Tmpsz(2*i*n+j)
Tmpsz(2*i*n+j)=iTmp
Nextj
ExitFor
EndIf
Nextk
EndIf
IfIcount=1Then'无逆矩阵情况
ExitSub
EndIf
Fork=iTo2*n-1
Tmpsz(2*i*n+k)=Tmpsz(2*i*n+k)/Ik'首数字变为1
Nextk
Forj=0Ton-1'将这一列变为0
DimIwAsDouble
Iw=Tmpsz(2*j*n+i)
Fork=iTo2*n-1
Ifj<>iThen
Tmpsz(2*j*n+k)=Tmpsz(2*j*n+k)-Iw*Tmpsz(2*i*n+k)
EndIf
Nextk
Nextj
Nexti
Fori=0Ton-1'将临时数组里的数传给新数组
Forj=0Ton-1
Xsz(i*n+j)=Tmpsz(2*i*n+n+j)
Nextj
Nexti
EndSub
'------------------------------------------------------------------------------
PrivateSubCs1(lsAsVariant,lxAsVariant,nAsInteger,FsAsInteger)
D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)