liwenhui 发表于 2016-12-6 15:39

在EViews中实现数值求解常微分方程(ODE)

本帖最后由 liwenhui 于 2016-12-6 15:41 编辑

EViews除了能解决计量经济学的估计问题以外,还提供一个编程环境用以解决复杂的问题。经过调试,我在EViews中实现了用龙格库塔方法求解常微分方程的数值解,供大家交流。
演示中,我使用了如下常微分方程作为测试:


这个方程的解析通解是:


使用“龙格库塔方法”,编制的EViews程序如下:'用龙格库塔法求解常微分方程dydx=-y*cos(x)+exp(-sin(x)),y(0)=0在区间的数值解
'已知这个微分方程的解析解 y=exp(-sin(x))*x

'生成一个workfile作为基本的数据容器
wfcreate (wf=temp) u 1000

'定义常量
scalar pi=3.14159
scalar a=0        '定义自变量下限
scalar b=10*pi     '定义自变量上限
scalar  M=500       '定义步数
scalar h=(b-a)/M   '计算每步之间的间隔

'定义一个矩阵来储存计算数据,其中第一列储存自变量数据,第二列储存因变量数据,第三列储存解析解的值用以作为比较
matrix(M+1,3) F

'矩阵的第一行储存初值问题的初始条件
F(1,1)=0
F(1,2)=0
F(1,3)=@exp(-sin(F(1,1)))*F(1,1)

'定义龙格库塔法的权重参数
scalar k1
scalar k2
scalar k3
scalar k4

'定义权重的过程量
scalar w1
scalar w2
scalar w3
scalar w4

'程序主体
for !k=1 to M step 1
  F(!k+1,1)=F(!k,1)+h
  '调用常微分方程计算权重
  call obj(w1,F(!k,1),F(!k,2))
    k1=w1*h
  call obj(w2,F(!k,1)+h/2,F(!k,2)+k1/2)
    k2=w2*h
  call obj(w3,F(!k,1)+h/2,F(!k,2)+k2/2)
    k3=w3*h
  call obj(w4,F(!k,1)+h,F(!k,2)+k3)
    k4=w4*h
  '计算函数估计值
  F(!k+1,2)=F(!k,2)+(k1+2*k2+2*k3+k4)/6
  '计算函数解析值
  F(!k+1,3)=@exp(-sin(F(!k+1,1)))*F(!k+1,1)
next

'显示最终结果
freeze F.xyline
freeze F

'定义常微分方程
subroutine obj(scalar dydx,scalar x,scalar y)
  dydx=-y*@cos(x)+@exp(-@sin(x))
endsub
运行后求得结果如下:



其中C2列是数值解,C3列是解析解,比较之下,这二者之间无明显差异。




页: [1]
查看完整版本: 在EViews中实现数值求解常微分方程(ODE)