有限差分法

基本概念

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

  • 几种差分方法及其误差:
    (来源:https://wenku.baidu.com/view/aa580fd619e8b8f67d1cb919.html)
    1
    2
    3
    4
    weixin_43793265 提醒上图左边应该是 f(x+h) + f(x-h)

MATLAB实现

以一个对时间进行微分的微分方程组为例(数模国赛2014A):
方程组
其中
m ˙ = F ν \dot{m}=\frac{F}{\nu} m˙=νF
各参数取值(都使用国际单位制,故单位不再给出):
G = 6.672 × 1 0 − 11 ; M = 7.3477 × 1 0 22 ; F = 7500 ; ν = 2940 ; m 0 = 2.4 × 1 0 3 ; G=6.672\times 10^{-11};\\ M=7.3477\times 10^{22};\\ F=7500;\\ \nu =2940;\\ m_0=2.4\times 10^3; G=6.672×1011;M=7.3477×1022;F=7500;ν=2940;m0=2.4×103;
已知条件:
v x 0 = 1692.46 ; v y 0 = 0 ; r 0 = 1749.37 × 1 0 3 ; v_{x0}=1692.46;\\ v_{y0}=0;\\ r_0=1749.37\times 10^3; vx0=1692.46;vy0=0;r0=1749.37×103;
使用前向差分可把方程化为:
{ 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 \left \{\begin{matrix} v_{xn+1}=(a_n cos\beta_n-\dfrac{v_{xn}v_{yn}}{r_n})h+v_{xn}\\ v_{yn+1}=(-\dfrac{GM}{r_n^2}+\dfrac{v_{xn}^2}{r_n}+a_nsin\beta_n)h+v_{yn}\\ r_{n+1}=hy_{yn}+r_n\\ a_n=\dfrac{F}{m_0-\frac{F}{\nu}nh}\\ tan\beta_n=\dfrac{v_{yn}}{v_{xn}} \end{matrix}\right. vxn+1=(ancosβnrnvxnvyn)h+vxnvyn+1=(rn2GM+rnvxn2+ansinβn)h+vynrn+1=hyyn+rnan=m0νFnhFtanβn=vxnvyn
用以下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
  • 65
    点赞
  • 338
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
有限差分法(Finite Difference Method)是解决偏微分方程数值解的一种方法。在利用有限差分法求解偏微分方程时,我们将求解的区域离散为有限个点,并在每个离散点处采用近似的方式计算微分。它的优点在于简单易实现且适用于各种类型的偏微分方程。 MATLAB是一种强大的数值计算和科学计算软件,它提供了丰富的数值计算工具和函数库,能够方便地实现有限差分法来求解偏微分方程。 在MATLAB中,我们可以首先定义要求解的偏微分方程,并将求解区域进行离散化处理。然后,根据有限差分法的近似方法,利用差分格式和离散化的微分算子来表示偏微分方程。根据求解方程的类型不同,我们可以选择显式差分格式或隐式差分格式。 在求解过程中,我们可以利用MATLAB提供的求解器,如ode45等,来进行迭代求解。通过迭代求解过程,我们可以得到近似的偏微分方程的数值解。 需要注意的是,有限差分法求解偏微分方程时,要选择合适的空间和时间离散化步长,以及合适的边界条件。此外,对于特定类型的偏微分方程,还可以进一步优化计算方法,如使用多重网格方法等。 总之,有限差分法是一种在MATLAB中非常常用和有效的数值解偏微分方程的方法,通过MATLAB的数值计算能力和函数库,我们可以快速实现这一求解方法,并得到所需的数值解。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值