24小时热门版块排行榜    

查看: 2128  |  回复: 8
本帖产生 1 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

tpp001

金虫 (著名写手)


[交流] 【求助】用fortran怎么描述下面这样的情况,我是新手,请大家帮忙

已经知道直线向量a上面的2个点(x1,y1,z1), (x2,y2,z2)和直线向量b上面的2个点(x3,y3,z3), (x4,y4,z4),求直线a,b的夹角。(0~180degree)
夹角公式是cos=[(x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3)]/[squr(x2-x1)+squr(y2-y1)+squr(z2-z1)]*[squr(x4-x3)+squr(y4-y3)+squr(z4-z3)].
其实我最大困难是在fortran中怎么定义这个新的函数-直线向量(恩,这个向量类似一个2组数组)。本人是 对fortran用的不熟。
   请大家帮忙写写这段程序,重点就是这个向量的定义,最好能注明清楚~~谢谢。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tpp001

金虫 (著名写手)


引用回帖:
Originally posted by maomao1210 at 2010-12-19 11:02:45:



把上述几句话把原来的输出给覆盖了就可以了。


至于第一个问题,实参与虚参是如何传递的,建议你找本FORTRAN书看一下,里面都应该会有的。 ...

您好,首先谢谢您上面的程序,最近我才用这个程序来处理我的数据。出现了一些问题,我不太清楚是我的数据的问题还是在数学模型中出现了问题。当然程序肯定是没有问题的。
我把我的数据(输入文件和程序)传上来。请您帮我分析一下是什么问题。
我的输入文件中有27条直线,因为每条直线有2个点,所以我的输入文件中有54个点。当我设定只是计算开头的2条直线的夹角时,程序可以正常运行。可是当我计算开头的4条直线中任意2条直线的夹角时,程序出现错误。。。会是什么问题呢,我搞不懂?我在下面还把我的出错信息给贴出来



[ Last edited by tpp001 on 2011-1-6 at 20:20 ]
7楼2011-01-06 20:17:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 9 个回答

maomao1210

金虫 (正式写手)


★ ★ ★
tpp001(金币+5):很感谢您的帮忙。不过我这里的数据有点复杂,我根据您的这个程序转换不过来,不知道能不能在麻烦您一下,可以吗?输入文件详细的情况在下面回复中,谢谢 2010-12-18 15:38:27
余泽成(金币+3):辛苦了! 2010-12-19 19:27:55
引用回帖:
Originally posted by tpp001 at 2010-12-18 13:17:45:
已经知道直线向量a上面的2个点(x1,y1,z1), (x2,y2,z2)和直线向量b上面的2个点(x3,y3,z3), (x4,y4,z4),求直线a,b的夹角。(0~180degree)
夹角公式是cos=[(x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1) ...

写了一个简单的小程序,可以满足你使用的要求:





输入文件的含义如下:

下面是三个输入文件以及测试结果


测试输入对应的两个矢量如下图所示:




测试输入对应的两个矢量如下图所示:





测试输入对应的两个矢量如下图所示:



[ Last edited by maomao1210 on 2010-12-18 at 14:59 ]
2楼2010-12-18 14:56:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tpp001

金虫 (著名写手)


引用回帖:
Originally posted by maomao1210 at 2010-12-18 14:56:39:
写了一个简单的小程序,可以满足你使用的要求:





输入文件的含义如下:
[ ...

真的不好意思,我的看懂了您上面的代码,可是我还是不会用来写我这个复杂点的情况,可能我有点笨了,不知道能不能麻烦您看看我这个情况,谢谢。。。。

总共有29条直线向量,每条直线向量上都知道2个点的坐标,A(a1,a2,a3),B(b1,b2,b3),【所以输入文件中有58个点的坐标】而我要得出他们任意2条直线向量的夹角。。。
输入文件的格式是这样的
a1 a2 a3
b1 b2 b3 #这是第一条直线向量上面的2个点坐标
c1 c2 c3
d1 d2 d3 #这是第2条直线向量上面的2个点坐标
......
.....
(n-1)1 (n-1)2 (n-1)3
n1 n2 n3 #这是第n条直线向量上面的2个点的坐标
一共58行数据
3楼2010-12-18 15:51:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

maomao1210

金虫 (正式写手)


★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
zyj8119(金币+10, 程序强帖+1):希望maomao1210继续努力。。。 2010-12-18 16:52:40
引用回帖:
Originally posted by tpp001 at 2010-12-18 15:51:00:


真的不好意思,我的看懂了您上面的代码,可是我还是不会用来写我这个复杂点的情况,可能我有点笨了,不知道能不能麻烦您看看我这个情况,谢谢。。。。

总共有29条直线向量,每条直线向量上都知道2个点的坐 ...

按照你的要求,写的如下程序,可以符合你的要求:




下面是我用四条线的简单测试结果:


那个黑色的方阵 是计算结果,两两LINE之间的,构成了一个对称矩阵。


C
C   ====================================================
C              www.muchong.com
C   ====================================================
C      

      Implicit None

      Integer Idicp,Jdicp,Kdicp,Ldicp
      Integer Num_Max,Num_Line
        Real*8 X1,Y1,Z1,X2,Y2,Z2
        Parameter(Num_Max=1000)
        Real*8  A(3,Num_Max)
      Real*8 Theta(Num_MAx,Num_MAx),Output
        Open(10,File='input',Status='Old')
        Open(20,File='Output',Status='Unknown')
C
C      Read necessary data
C      

        Read (10,*) Num_Line

        Do Idicp =1, Num_Line
      
        Read(10,*) X1,Y1,Z1
        Read(10,*) X2,Y2,Z2

      A(1,Idicp)= X2-X1
        A(2,Idicp)= Y2-Y1
        A(3,Idicp)= Z2-Z1

        EndDo

C
C      Find the theta between every possible combin two lines
C

      Do Idicp=1, Num_Line
          Do Jdicp=1,Idicp
          Theta(Idicp,Jdicp)= 0.0D0
         
                Call Sub(A(1,Idicp),A(1,Jdicp),Output)
         
                Theta(Idicp,Jdicp)= Output  
          Theta(Jdicp,Idicp)= Theta(Idicp,Jdicp)
          EndDo
        Enddo

C
C     Output the matrice
C

      Do Idicp=1, Num_Line
         Write(*,'(30f12.3)') (Theta(Idicp,Jdicp),Jdicp=1,Num_Line)
         Write(20,'(30f12.3)') (Theta(Idicp,Jdicp),Jdicp=1,Num_Line)        
        Enddo
        End


      Subroutine Sub(A,B,Output)
      Implicit None
        Real*8 A(3),B(3)
        Real*8 Dicp,AA,BB,AB,Output
      
        AB=A(1)*B(1)+A(2)*B(2)+A(3)*B(3)
        AA=A(1)*A(1)+A(2)*A(2)+A(3)*A(3)
        BB=B(1)*B(1)+B(2)*B(2)+B(3)*B(3)
      
        Dicp = AB / ( Dsqrt(AA) *  Dsqrt(BB) )
      Output= Acos(Dicp)*180.0d0/3.1415926D0
       
        Return

        End




Enjoy It !!!!

[ Last edited by maomao1210 on 2010-12-18 at 16:37 ]
4楼2010-12-18 16:34:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见