有限差分法

基本概念

总的思想就是把微分方程变成差分方程(离散化),用精度换取计算的可进行性。

MATLAB实现

以一个对时间进行微分的微分方程组为例(数模国赛2014A):
方程组
其中

m ˙ = F ν

各参数取值(都使用国际单位制,故单位不再给出):
G = 6.672 × 10 11 ; M = 7.3477 × 10 22 ; F = 7500 ; ν = 2940 ; m 0 = 2.4 × 10 3 ;

已知条件:
v x 0 = 1692.46 ; v y 0 = 0 ; r 0 = 1749.37 × 10 3 ;

使用前向差分可把方程化为:
{ v x n + 1 = ( a n c o s β n v x n v y n r n ) h + v x n v y n + 1 = ( G M r n 2 + v x n 2 r n + a n s i n β n ) h + v y n r n + 1 = h y y n + r n a n = F m 0 F ν n h t a n β n = v y n v x n

用以下matlab程序计算

%% main.m

clear;
h=0.1;      %步长
N=100000;   %最大迭代次数
%初始化
vy=zeros(1,N);
vx=zeros(1,N);
r=zeros(1,N);
%初始值
vy(1)=0;
vx(1)=1692.46;
r(1)=1749.37*10^3;
%开始递推
for n=1:N-1
    [vy(n+1),vx(n+1),r(n+1)]=DiTuiFun(vy(n),vx(n),r(n),h,n);
    if((r(n+1)-1737013)<=12000 || vx(n+1)<=0)
        end_num=n+1;
        break;
    end
end
r_reslut=r(1:end_num);
vx_reslut=vx(1:end_num);
vy_reslut=vy(1:end_num);
figure(1);
plot(1:1:end_num,r_reslut);
figure(2);
plot(1:1:end_num,vx_reslut);
figure(3);
plot(1:1:end_num,vy_reslut);

%% DiTuiFun.m
function [vynn,vxnn,rnn]=DiTuiFun(vyn,vxn,rn,h,n)
%参数
G=6.672*10^-11;
M=7.3477*10^22;
F=7500;
miu=2940;
m0=2.4*10^3;
%计算
v=sqrt(vyn^2+vxn^2);
sin_beta=vyn/v;
cos_beta=-vxn/v;
an=F/(m0-F*n*h/miu);
rnn=h*vyn+rn;
vxnn=(an*cos_beta-vxn*vyn/rn)*h+vxn;
vynn=(-G*M/rn^2+vxn^2/rn+an*sin_beta)*h+vyn;
end

猜你喜欢

转载自blog.csdn.net/qq_41679006/article/details/80975436