二体运动轨道的matlab实现

柔情痞子 提交于 2020-03-17 15:33:29

话不多说,上代码。欢迎指出不足之处。

%8阶龙格库塔解二体运动的轨道by Spring

P0 = [1.5e11;0;0];
V0= [0,30300,1]; %初始位置和速度
E0=V(1)2+V(2)2+V(3)2-2*u/(x2+y2+z2)^(1/2); %初始能量
u=1.327124e20; %GM
h=5000; %步长
T=60000000; %演化时间

P1 = []; %储存数据的矩阵
V1 = [];

P=P0;
V=V0; %赋予初值

for t=0:h:T %演化时间
[P,V] = RKF78(u,h ,P,V);
%检验能量守恒
P1= [P1 P];
V1= [V1 V];
end

figure() %演化图像
plot3(P1(1,:),P1(2,:),P1(3,:));
xlabel(‘x(km)’);
ylabel(‘y(km)’);
zlabel(‘z(km)’);
title(‘行星位置’);

RKF子程序
function [P,V] = RKF78(u,h,P,V) % 输入输出
c=[41/840,0,0,0,0,34/105,9/35,9/35,9/280,9/280,41/840];
c1=[0,0,0,0,0,34/105,9/35,9/35,9/280,9/280,0,41/840,41/840] ; %c的数组 %时间
x=P(1);
y=P(2);
z=P(3);
vx=V(1);
vy=V(2);
vz=V(3); %赋予初值

%%%求k值
a=[0 2/27 1/9 1/6 5/12 1/2 5/6 1/6 2/3 1/3 1 0 1] ;
b=[0 0 0 0 0 0 0 0 0 0 0 0;2/27 0 0 0 0 0 0 0 0 0 0 0; 1/36 1/12 0 0 0 0 0 0 0 0 0 0;1/24 0 1/8 0 0 0 0 0 0 0 0 0;5/12 0 -25/16 25/16 0 0 0 0 0 0 0 0 ;1/20 0 0 1/4 1/5 0 0 0 0 0 0 0;-25/108 0 0 125/108 -65/27 125/54 0 0 0 0 0 0 ;31/300 0 0 0 61/225 -2/9 13/900 0 0 0 0 0 ;2 0 0 -53/6 704/45 -107/9 67/90 0 0 0 0 0 ;-91/108 0 0 23/108 -976/135 311/54 -19/60 17/6 -1/12 0 0 0 ;2383/4100 0 0 -341/164 4496/1025 -301/82 2133/4100 45/82 45/164 18/41 0 0;3/205 0 0 0 0 -6/41 -3/205 -3/41 3/41 6/41 0 0;-1777/4100 0 0 -341/164 4496/1025 -289/82 2193/4100 51/82 33/164 12/41 0 1 ];
K=[]; %建立K的矩阵存储K 6*12的矩阵,行xyz,vx.vy.vz,列为各个参数的k值

K(1,1)=Fx(vx); %x
K(2,1)=Fy(vy); %y
K(3,1)=Fz(vz); %z
K(4,1)=Fvx(u,x,y,z) ; %vx
K(5,1)=Fvy(u,x,y,z) ; %vy
K(6,1)=Fvz(u,x,y,z) ; %vz

for m=2:1:13
Sum=[0 0 0 0 0 0];
for n=1:1:m-1
Sum(1)=Sum(1)+h*b(m,n)K(4,n);
Sum(2)=Sum(2)+h
b(m,n)K(5,n);
Sum(3)=Sum(3)+h
b(m,n)K(6,n);
Sum(4)=Sum(4)+h
b(m,n)K(1,n); %x的增量
Sum(5)=Sum(5)+h
b(m,n)K(2,n);
Sum(6)=Sum(6)+h
b(m,n)*K(3,n);
end
K(1,m)=Fx(vx+Sum(1));
K(2,m)=Fy(vy+Sum(2));
K(3,m)=Fz(vz+Sum(3));
K(4,m)=Fvx(u,x+sum(4),y+Sum(5),z+Sum(6)) ;
K(5,m)=Fvy(u,x+sum(4),y+Sum(5),z+Sum(6)) ;
K(6,m)=Fvz(u,x+sum(4),y+Sum(5),z+Sum(6)) ;
end

for m=1:1:11 %7阶
x=x+h*c(m)K(1,m);
y=y+h
c(m)K(2,m);
z=z+h
c(m)K(3,m);
vx=vx+h
c(m)K(4,m);
vy=vy+h
c(m)K(5,m);
vz=vz+h
c(m)*K(6,m);
end

for m=1:1:13 %8阶
P(1)=P(1)+h*c1(m)K(1,m);
P(2)=P(2)+h
c1(m)K(2,m);
P(3)=P(3)+h
c1(m)K(3,m);
V(1) =V(1)+h
c1(m)K(4,m);
V(2)=V(2)+h
c1(m)K(5,m);
V(3)=V(3)+h
c1(m)*K(6,m);
end

end

%微分方程
function k=Fx(vx) %dx/dt
k=vx;
end
function k=Fy(vy) %dy/dt
k=vy;
end

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!