主题:向大家请教一个问题,关于向量运算和循环语句的
Larry_Fan
[专家分:0] 发布于 2012-04-27 15:51:00
向大家请教一个问题,比如如上的一个管网(只看已编号部分),我已经算出每个管段的流量存放在一个向量中,比如Q(8,1)=(q1,q2,q3,q4,q5,q6,q7,q8),现在我想算三条线路(1-2-5-8;3-4-5-8;6-7-8)各自的总流量,请问用fortran怎么实现呢?(我的主要目的是对于更复杂的管网也能去计算,所以不要是简单的加起来什么的,最好是用循环相加计算得到。)
我的思路是:
按图得到一个二维矩阵:Peak(8,2)
1 2
2 5
3 4
4 5
5 8
6 7
7 8
8 9
我已经想到办法得到一个线路向量(过程略)Path(8,1)使得这个向量只有path(1,1),path(3,1),path(6,1)的值为1,这样我就可以找到三条线路的起始编号。用if(path(i,1).EQ.1)来判断并记录此时的i值(即1,3,6);然后对应到Peak矩阵中去找线路,比如i=1;那Peak(1,2)=2;peak(2,2)=5;peak(5,2)=8,这样第一条线路的编号就得到了,然后把以上peak(,)的值作为Q(,)向量中的编号,去使这些编号对应的Q值相加即可。
现在向大家请教两个问题:
1.如果按我的方法,fortran代码应该怎么写?
2.各位有没有更好的方法(附代码)?
谢谢大家!
回复列表 (共9个回复)
沙发
alsoran [专家分:760] 发布于 2012-04-27 21:25:00
既然目前的Fortran也支持指针运算,这个运用数据结构的树的概念最好不过
板凳
alsoran [专家分:760] 发布于 2012-04-27 21:50:00
lz这个二维矩阵在多体动力学中叫内联刚体号矩阵,可以用此建立一个通路矩阵更好,解决方法如下:
1) 建立一个通路矩阵 T ,可以由内联刚体号矩阵(也就是lz的peak阵)得到
i行j列是1或者0表示物体i和物体j是否沿根部连通
T=
1 1 0 0 1 0 0 1
0 1 0 0 1 0 0 1
0 0 1 1 1 0 0 1
0 0 0 1 1 0 0 1
0 0 0 0 1 0 0 1
0 0 0 0 0 1 1 1
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1
2)然后输入物体号对应的流量数列阵
X=
1
2
3
4
5
6
7
8
3) 最终结果是T×X即可
T×X=
16
15
20
17
13
21
15
8
当然结果是从物体号到9号物体的总流量,到第8物体的流量的话都减去结果的最后一行即可
3 楼
Larry_Fan [专家分:0] 发布于 2012-04-27 22:06:00
谢谢你的回答,其实是我写错了,我想算的是每条线路的压力损失之和,每一段的压力损失我得到了,存入了一个向量里面的。请问怎么算呢,我要得到的是三条线路的压损总和,所以其实结果应该是三个值。
[em2]
4 楼
alsoran [专家分:760] 发布于 2012-04-27 22:15:00
我没理解错的话,结果就是取我最后结果的1、3、6行减去最后一行
5 楼
Larry_Fan [专家分:0] 发布于 2012-04-27 23:10:00
嗯,结果倒是对的,但是我比较菜,不知道那个矩阵怎么得来,还有怎么让结果只显示1,3,6对应的结果呢?
能不能麻烦你把代码发给我看看,非常感谢你!
6 楼
alsoran [专家分:760] 发布于 2012-04-28 00:06:00
我没有写具体代码
lz可以根据你的peak矩阵,得知1和2相连,2和5相连,5和8相连,这样就得到了T矩阵的第一行,然后依次类推可以得到全矩阵。
显示1、3、6结果:
令a=[1,3,6],result(a)即可,lz稍微看一下语言吧,Fortran最基本数组操作
7 楼
Larry_Fan [专家分:0] 发布于 2012-04-28 09:32:00
谢谢啦,非常感谢![em2]
8 楼
Larry_Fan [专家分:0] 发布于 2012-04-29 00:40:00
你好,我还是比较菜,那个矩阵弄了一晚上也没有弄出来,我的代码如下:
Do i=1,Num-1
Do Ks=i,Num-1
j=PeakM(Ks,1)
Route(i,j)=1
j=PeakM(ks,2)
Route(i,j)=1
End do
End do
i=Num
j=PeakM(i,1)
IncidentM(i,j)=1
以上,PeakM就是原问题中Peak,Num是原本定义的参数,代表矩阵行数,本例Num=8,Route就是我想求的矩阵,也即您写的那个矩阵。
想请教下我这个代码问题在哪里,还有怎么改呢?
再次谢谢啦!
9 楼
alsoran [专家分:760] 发布于 2012-04-29 11:23:00
系统重装了,没有编译器,把思路给你说一下:
1) 实际上peak阵只要一行就行: L=[2,5,4,5,8,7,8,9]
2) 先令T=8×8单位阵
3) do i=1,8
T(:,L(i))=T(:,L(i))+T(:,i)
enddo
这是以前我的matlab代码中的一段,你试试吧
我来回复