24小时热门版块排行榜    

查看: 701  |  回复: 4

astringent

铜虫 (著名写手)

[交流] 【求助】为什么两种写法得到的值不一样? 已有3人参与

有两个点A(x1,y1,z1),B(x2,y2,z2),现在以由点A和B确定的直线为基准轴,我想求的是当以物体由点C(x3,y3,z3)运动到点 D(x4,y4,z4)时,沿AB基准轴方向的位移以及沿垂直于AB基准轴方向的位移。我用两种方法写了程序,一种是用数组,另一种是直接写,可是在试算的时候,两种方法得到的结果有很大差别,请问问什么会有差别呢?哪一种是正确的?
program test
implicit none
real :: x1=1.0,y1=1.0,z1=2.0
real :: x2=1.0,y2=1.0,z2=3.0
real :: x3=1.0,y3=2.0,z3=3.0
real :: x4=2.0,y4=1.0,z4=5.0
real dx1,dx2,dy1,dy2,dz1,dz2
real :: px1,px2,py1,py2,pz1,pz2
real r1,r2,r3,r
real theta,pp

dx1=x2-x1
dy1=y2-y1
dz1=z2-z1
dx2=x4-x3
dy2=y4-y3
dz2=z4-z3
r1=dx1**2+dy1**2+dz1**2
r2=dx2**2+dy2**2+dz2**2
r3=dx1*dx2+dy1*dy2+dz1*dz2
r=r3/(sqrt(r1)*sqrt(r2))

theta=acos(r)
  px1=dx2*cos(theta)
  py1=dy2*cos(theta)
  pz1=dz2*cos(theta)
   px2=dx2*sin(theta)
  py2=dy2*sin(theta)
  pz2=dz2*sin(theta)
write (*,"(f7.5)" dx1
write(*,*) 'dy1',dy1
write(*,*) 'dz1',dz1
write (*,*) 'dx2',dx2
write(*,*) 'dy2',dy2
write(*,*) 'dz2',dz2
write (*,"(f7.5)" px1
write(*,"(f7.5)" py1
write(*,"(f7.5)" pz1
write (*,*) 'px2',px2
write(*,*) 'py2',py2
write(*,*) 'pz2',pz2
end
!采用数组
program test
implicit none
real :: a(3)=(/1.0,1.0,2.0/) !A点坐标
real :: b(3)=(/1.0,1.0,3.0/) !B点坐标
real :: c(3)=(/1.0,2.0,3.0/) !C点坐标
real :: d(3)=(/2.0,1.0,5.0/) !D点坐标
real :: ab(3) !矢量AB
real :: cd(3) 矢量CD
real :: p1(3),p2(3) !投影

ab=b-a
cd=d-c
p1=dot_product(ab,cd)/sqrt(dot_product(ab,ab))
p2=cd-p1
write (*,*) 'ab',ab
write (*,*) 'cd',cd
write(*,*) 'p1',p1
write (*,*) 'p2',p2

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

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
Originally posted by astringent at 2011-01-23 20:18:21:
有两个点A(x1,y1,z1),B(x2,y2,z2),现在以由点A和B确定的直线为基准轴,我想求的是当以物体由点C(x3,y3,z3)运动到点 D(x4,y4,z4)时,沿AB基准轴方向的位移以及沿垂直于AB基准轴方向的位移。我用两种方法写 ...

你得弄清楚 dot_product 是干啥的,它的结果是啥,呵呵……
CODE:
print *, dot_product(ab,cd)
print *, dot_product(ab,ab)
print *, dot_product(cd,cd)
print *, dot_product(ab,cd)/(sqrt(dot_product(ab,ab))*sqrt(dot_product(cd,cd)))

你的第二个程序,与第一个程序相比,只做了一半的工作还不到,呵呵……
2楼2011-01-23 22:14:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

astringent

铜虫 (著名写手)

引用回帖:
Originally posted by snoopyzhao at 2011-01-23 22:14:25:


你得弄清楚 dot_product 是干啥的,它的结果是啥,呵呵……

[code]
print *, dot_product(ab,cd)
print *, dot_product(ab,ab)
print *, dot_product(cd,cd)
print *, dot_product(ab,cd)/(sqrt(dot_p ...

我的两个程序都错了,我改了一下用数组的写法,这个程序应该是正确的吧??
program test
implicit none
real :: a(3)=(/1.0,1.0,2.0/) !A点坐标
real :: b(3)=(/1.0,1.0,3.0/) !B点坐标
real :: c(3)=(/1.0,2.0,3.0/) !C点坐标
real :: d(3)=(/2.0,1.0,5.0/) !D点坐标
real :: ab(3) !矢量AB
real :: cd(3) 矢量CD
real :: p1(3),p2(3) !投影

ab=b-a
cd=d-c
p1=dot_product(ab,cd)*ab/dot_product(ab,ab)
p2=cd-p1
write (*,*) 'ab',ab
write (*,*) 'cd',cd
write(*,*) 'p1',p1
write (*,*) 'p2',p2
end
3楼2011-01-23 22:33:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
余泽成(金币+3): 谢谢参与应助! 2011-02-20 15:57:54
你没有明白我的意思,dot_product 出来的是一个标量,不再是一个向量,那么你的 p1 就不是一个数组了啊……

如果我的直觉没有错的话(当然,我对你的问题不了解),你的第一个程序应该是正确的……
4楼2011-01-24 11:44:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangbiniocas

金虫 (小有名气)

引用回帖:
Originally posted by astringent at 2011-01-23 22:33:57:

我的两个程序都错了,我改了一下用数组的写法,这个程序应该是正确的吧??
program test
implicit none
real :: a(3)=(/1.0,1.0,2.0/) !A点坐标
real :: b(3)=(/1.0,1.0,3.0/) !B点坐标
real :: c(3)=( ...

我也这么觉得
坚持
5楼2011-02-01 08:53:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 astringent 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见