回 帖 发 新 帖 刷新版面

主题:向大家请教一个问题,关于向量运算和循环语句的


向大家请教一个问题,比如如上的一个管网(只看已编号部分),我已经算出每个管段的流量存放在一个向量中,比如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个回复)

沙发

既然目前的Fortran也支持指针运算,这个运用数据结构的树的概念最好不过

板凳


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 楼


谢谢你的回答,其实是我写错了,我想算的是每条线路的压力损失之和,每一段的压力损失我得到了,存入了一个向量里面的。请问怎么算呢,我要得到的是三条线路的压损总和,所以其实结果应该是三个值。
[em2]

4 楼

我没理解错的话,结果就是取我最后结果的1、3、6行减去最后一行

5 楼


嗯,结果倒是对的,但是我比较菜,不知道那个矩阵怎么得来,还有怎么让结果只显示1,3,6对应的结果呢?
能不能麻烦你把代码发给我看看,非常感谢你!

6 楼

我没有写具体代码
lz可以根据你的peak矩阵,得知1和2相连,2和5相连,5和8相连,这样就得到了T矩阵的第一行,然后依次类推可以得到全矩阵。
显示1、3、6结果:
令a=[1,3,6],result(a)即可,lz稍微看一下语言吧,Fortran最基本数组操作

7 楼


谢谢啦,非常感谢![em2]

8 楼


你好,我还是比较菜,那个矩阵弄了一晚上也没有弄出来,我的代码如下:
    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 楼

系统重装了,没有编译器,把思路给你说一下:
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代码中的一段,你试试吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册