计算差分方程的收敛点_时间序列分析第一章 差分方程(Simulation)

本文通过代码模拟探讨了一阶和二阶差分方程的递归求解、动态乘子及长期效应,分析了不同特征值下系统的稳定性,并展示了动态乘子随时间间隔的变化,揭示了差分方程的收敛特点。
摘要由CSDN通过智能技术生成

上一篇文章已经将差分方程的相关理论推导说明,本节将用代码将某些结论可视化。

一、一阶差分方程

1、递归法求解差分方程

给定y在t=-1期的值,以及w在t=0,1,2,...时期的值,则通过递归可以求出各时期的y值,代码如下

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
​
A = [0.5,1,2]  #设定Φ分别小于、等于、大于1
t = 1000  #给定总的时期为1000
​
for i,a in enumerate(A):
    y = [0]  #给定y在t=-1期的值
    print(f'动态模拟Φ={a}:')
    print('y-1=',y[-1])
    for j in range(0,t+1):
        w = np.random.randn()  #这里w是一个随机变量
        y_ = a*y[-1] + w      #由上一期计算当期
        y.append(y_)        #将当期加载y列表的最后
        print(f'y{j}=',y[-1])   #将动态模拟过程打印出来
    #这个条件判断是为了输出好看一点
    if i == 1:
        num = f'51{i+2}'
        #plt.subplot(int(num))
    elif i == 2:
        num = f'51{i+3}'
    else:
        num = f'51{i+1}'
    plt.subplot(int(num))
    plt.plot(range(-1,t+1),y,'-')   #将y的整个变化过程可视化
    plt.title(f'y(t) = {a}*y(t-1)+w(t)')

动态模拟过程结果如下

1ad0d93f56d14acbd6f237fec35ae823.png

变化趋势可视化:

85035d03dee0c5dd4f90356d37a96560.png

从图形中可以看到,Φ<1时,y围绕均值0波动,波动的幅度(方差)也基本没有改变,所以可以判断该时间序列是平稳的;Φ=1时,数据表现出明显的随机游走特征,有明显的符号集群现象,即前一期为‘+’,则后一期有很大概率也为‘+’;前一期为‘-’,则后一期很大概率也为‘-’,这是一个明显的单位根过程; Φ>1时,时间序列明显地发散。

2、动态乘子

在上一篇文章中,我们已经得出一阶差分方程的动态乘子为:

e14a92164375f779f73c6747a24034c9.png

其大小只与时间间隔有关而与时期t无关。下面来看看对不同情况的Φ值,其动态乘子如何随时间间隔 j 变化。

%matplotlib inline
​
import numpy as np
import matplotlib.pyplot as plt
​
Φ = 0.9  #分别改变其值为-0.9,2,-2
n = 40
Φj = []
for j in range(1,n):
    Φj.append(Φ**j)
plt.bar(range(1,n),Φj)
plt.title(f'Φ={Φ}')

输出结果:

a9b2dd72fc042a99f407cbae9a3ff7df.png

0f58ecd74b4fc745013af97dd3ca8a0e.png

66229cb4c507a0502f1d163ab4cece2c.png

a7f253e13b235123b27f47311db5a067.png

从图形可以看出,当|Φ|<1时,w对y的影响系数随时间间隔 j 的增大而逐渐减小,当 j 足够大时,动态乘子趋于零,0<Φ<1时按指数衰减,-1<Φ<0时振荡衰减;当|Φ|>1时,动态乘子随 j 的增大区域无穷。(注意为了图形效果明显我将n设为10)

3、长期效应

考虑w的某一冲击对y的累积效应:

fe5564e475452ff5f7580af81aee322f.png
%matplotlib inline
​
import numpy as np
import matplotlib.pyplot as plt
​
Φ = 0.9
n = 30
Φs = [0]
for j in range(0,n):
    Φs.append(Φs[-1]+Φ**j)
plt.bar(range(-1,n),Φs)
plt.title(f'Φ={Φ}')
plt.title(f'Φ={Φ}')

475894477884061e8ed7e0d375732565.png

从图形可以看出,随着 j 的不断增大,累积效应最终会收敛于一个定值,理论告诉我们,这个定值为1/(1-Φ)=10。让我们取一个较大的n=100看看是否接近于10,从图形上可以看出基本为10。

cbf82a8b73a0403a18e7e739e059956c.png

二、P阶差分方程(二阶)

1、递归求解(动态模拟)

对于二阶差分方程,我们首先选取一些使得F的特征值的模分别大于、等于、小于1的特殊的Φ1和Φ2进行动态模拟,看看这些时间序列的图像趋势怎样。

使F的特征值为实数且模均小于1:Φ1=0.6,Φ2=0.2

使F的特征值为实数其中一个模大于1:Φ1=0.6,Φ2=3

使F的特征值为实数模均大于1:Φ1=0.6,Φ2=8

%matplotlib inline
​
import numpy as np
import matplotlib.pyplot as plt
​
Φ1 = 0.6   #分别将其值改为上面三种情况
Φ2 = 0.2
n = 500
y = [0,0]
for i in range(0,n):
    w = np.random.randn()
    y.append(Φ1*y[-1]+Φ2*y[-2]+w)
    print(f'y{i}=',y[-1])
plt.plot(range(0,n),y[2:],'-')
plt.title(f'y(t)={Φ1}*y(t-1)+{Φ2}*y(t-2)+w(t)')

输出结果

8b2af559103c72424bc9d231716ffcda.png

ed216b319cf2e97217d2a87c7839dcc4.png

637644193678d952369a9ec584142195.png

从图形可以看到,当Φ1,Φ2使得两个特征值均为绝对值小于1的实数时,二阶差分系统是稳定的,当Φ1,Φ2使得两个特征值之一为绝对值大于1的实数时,二阶差分方程不稳定(趋于无穷),并且λ越大,发散速度越快。

使F的特征值为共轭复数且模小于1:Φ1=0.2,Φ2=-0.2

使F的特征值为实数模均大于1:Φ1=0.5,Φ2=-1.5

4c7792dbf28dd67320508c10632bf34b.png

c7e74f123e0e8e6c078769ba418dfebb.png

可以看到当特征值的模小于1时,系统稳定,当特征值的模大于1时,系统是振荡发散的。

接下来我们直接用计算机模拟出稳定的Φ1及Φ2的取值区域。

%matplotlib inline
​
import numpy as np
import matplotlib.pyplot as plt
​
Φ1_s = np.linspace(-5,5,100)
Φ2_s = np.linspace(-5,5,100)
n = 100
#这里运用numpy的一些处理方式可能会使运行速度比三重循环快得多,但对numpy不熟
for Φ1 in Φ1_s:
    for Φ2 in Φ2_s:
        y = [0,0]
        s = 0
        for i in range(0,n):
            w = np.random.randn()
            y.append(Φ1*y[-1]+Φ2*y[-2]+w)
            if abs(y[-1])>100:    #在我们设定的初始值下,稳定系统的绝对值超过100的概率几乎为0
                s = 1
                break
        if s==0:
            plt.scatter(Φ1,Φ2)

输出结果

09ede135634945e708db756c91ab351a.png

可以看到使二阶差分系统稳定的点分布的三角形和理论推导是非常吻合的,可以预想,如果代码中Φ1和Φ2取值足够密集(程序运行时间也足够长),那么这个三角形会被稳定点填满。

2、动态乘子

接下来我们看看不同Φ1和Φ2的动态乘子如何随 j 的增大而变化。

使F的特征值为实数且模均小于1:Φ1=0.6,Φ2=0.2

使F的特征值为实数其中一个模大于1:Φ1=0.6,Φ2=3

使F的特征值为实数模均大于1:Φ1=0.6,Φ2=8

%matplotlib inline
​
import numpy as np
import matplotlib.pyplot as plt
​
Φ1 = 0.6
Φ2 = 0.2
λ1 = (Φ1 + np.sqrt(Φ1**2+4*Φ2))/2
λ2 = (Φ1 - np.sqrt(Φ1**2+4*Φ2))/2
c1 = λ1/(λ1-λ2)
c2 = λ2/(λ2-λ1)
​
x =  range(0,30)
y = []
for j in x:
    y.append(c1*λ1**j+c2*λ2**j)
plt.bar(x,y)

结果

9f26907c0e8f2fde44d0472770809b1c.png

bd1b193c00207ab241c601b624ed811d.png

bc79a4b8d3f06ebaee8dbffbcc7abb3e.png

可以看到,两个特征值模均小于1时,动态乘子以指数速度衰减为0,而模大于1时,发散。

使F的特征值为共轭复数且模小于1:Φ1=0.5,Φ2=-0.8

使F的特征值为共轭复数且模大于1:Φ1=0.5,Φ2=-1.5

使F的特征值为共轭复数且模等于1:Φ1=0.5,Φ2=-1

%matplotlib inline
​
import numpy as np
import cmath
import matplotlib.pyplot as plt
​
Φ1 = 0.2
Φ2 = -0.2
λ1 = (Φ1 + cmath.sqrt(Φ1**2+4*Φ2))/2
λ2 = (Φ1 - cmath.sqrt(Φ1**2+4*Φ2))/2
c1 = λ1/(λ1-λ2)
c2 = λ2/(λ2-λ1)
​
x =  range(0,20)
y = []
for j in x:
    y.append(c1*λ1**j+c2*λ2**j)
plt.bar(x,y)
plt.title(f'Φ1={Φ1},Φ2={Φ2}')

3560c5b8462393285358c7b2e8c3bcd6.png

dd926a44c2912ac6010eb5eea9e91b2c.png

a5300d5c4f27819e6539b8f20c819cd6.png

模小于和大于1时,可以看到动态乘子分别为振荡衰减、发散,模为1时,动态乘子周期性的变化

3、长期效应

514976b3b8b3195bef747efe99039de3.png

下面看看系统稳定时,w的冲击对y的累积效应。取Φ1=0.5,Φ2=-0.8

%matplotlib inline
​
import numpy as np
import cmath
import matplotlib.pyplot as plt
​
Φ1 = 0.5
Φ2 = -0.8
λ1 = (Φ1 + cmath.sqrt(Φ1**2+4*Φ2))/2
λ2 = (Φ1 - cmath.sqrt(Φ1**2+4*Φ2))/2
c1 = λ1/(λ1-λ2)
c2 = λ2/(λ2-λ1)
n = 50
​
x =  range(0,n)
y_s = [0]
y = []
for j in x:
    y.append(c1*λ1**j+c2*λ2**j)
    y_s.append(y_s[-1]+y[-1])
plt.bar(range(-1,n),y_s)
plt.title(f'Φ1={Φ1},Φ2={Φ2}')

结果

dfe11c4c8a0cf429f99f3e1b86968b8e.png

收敛值的理论结果为1/(1-Φ1-Φ2)=0.77,计算模拟结果也收敛于0.7左右。

【有限差分初学者必备】如何根据问题的特将定解区域作网格剖分;如何把原微分方程离散化为差分方程组以及如何解此代数方程组。此外为了保证计算过程的可行和计算结果的正确,还需从理论上分析差分方程组的性态,包括解的唯一性、存在性和差分格式的相容性、收敛性和稳定性。对于一个微分方程建立的各种差分格式,为了有实用意义,一个基本要求是它们能够任意逼近微分方程,这就是相容性要求。另外,一个差分格式是否有用,最终要看差分方程的精确解能否任意逼近微分方程的解,这就是收敛性的概念。此外,还有一个重要的概念必须考虑,即差分格式的稳定性。因为差分格式的计算过程是逐层推进的,在计算第n+1层的近似值时要用到第n层的近似值 ,直到与初始值有关。前面各层若有舍入误差,必然影响到后面各层的值,如果误差的影响越来越大,以致差分格式的精确解的面貌完全被掩盖,这种格式是不稳定的,相反如果误差的传播是可以控制的,就认为格式是稳定的。只有在这种情形,差分格式在实际计算中的近似解才可能任意逼近差分方程的精确解。关于差分格式的构造一般有以下3种方法。最常用的方法是数值微分法,比如用差商代替微商等。另一方法叫积分插值法,因为在实际问题中得出的微分方程常常反映物理上的某种守恒原理,一般可以通过积分形式来表示。此外还可以用待定系数法构造一些精度较高的差分格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值