Я пытаюсь закодировать коллизию в 2d, используя уравнение статья в Википедии .
, но каждый раз получаю неправильный результат.
module var
integer::t,i,ic
integer,parameter::ni=1000,nc=2
doubleprecision,parameter::lx=30.d0,ly=30.d0,pi=dacos(-1.d0)
doubleprecision,dimension(1:nc)::x,y,x0,y0,vx,vy,vx0,vy0,ax,ay,r,v,m,&
&teta
doubleprecision,parameter::tf=10.d0,h=tf/ni,e=1.d0,rmax=1.d0,vmax=10.d0,&
&mmax=1000.d0
doubleprecision::dx,dy,d,d2,rr,na,p1,p2,p3,p4,phi
end module
subroutine colli2
use var
do i=1,nc
if(i/=ic)then
dx=x(i)-x(ic)
dy=y(i)-y(ic)
d=dsqrt(dx**2.d0+dy**2.d0)
d2=d**2.d0
rr=r(ic)+r(i)
if(d<=rr)then
x(ic)=x0(i)-rr*dx/d
y(ic)=y0(i)-rr*dy/d
dx=x(ic)-x(i)
dy=y(ic)-y(i)
d=dsqrt(dx**2.d0+dy**2.d0)
d2=d**2.d0
p1=2.d0*m(i)/(m(ic)+m(i))
p2=(vx0(ic)-vx0(i))*dx
p3=(vy0(ic)-vy0(i))*dy
p4=dx/d2
vx(ic)=vx0(ic)-p1*(p2+p3)*p4
print*,vx(1),vx(2)
p4=dy/d2
vy(ic)=vy0(ic)-p1*(p2+p3)*p4
endif
endif
enddo
end
это подпрограмма столкновения и модуль, который я использую для переменных. для начальных параметров я использовал равные массы. это анимация. фиолетовая сфера должна была остановиться