一、功能
产生自回归滑动平均模型\(ARMA(p,q)\)的数据。
二、方法简介
自回归滑动平均模型\(ARMA(p,q)\)为
\[
x(n)+\sum_{i=1}^{p}a_{i}x(n-i)=\sum_{i=0}^{q}b_{i}w(n-i)
\]
其中\(a_i(i=1,2,...,p)\)是自回归系数,\(b_i(i=1,2,...,q)\)是滑动平均系数,\(w(n)\)是白噪声。
给定白噪声\(w(n)\)的均值和方差,便可以由上式产生\(ARMA(p,q)\)的数据。
三、使用说明
是用C语言实现产生二项分布随机数的方法如下:
/************************************ a ---一维数组,长度为(p+1),ARAM(p,q)模型的自回归系数。 b ---一维数组,长度为(q+1),ARAM(p,q)模型的滑动平均系数。 p ---RAM(p,q)模型的自回归阶数。 q ---RAM(p,q)模型的滑动平均阶数。 mean ---白噪声正态分布均值mu。 sigma ---白噪声正态分布均方差sigma。 seed ---随机数种子 x ---一维数组,长度n,存放ARAM(p,q)模型的数据。 n ---放ARAM(p,q)模型的长度。 ************************************/ #include "stdlib.h" #include "gauss.c" void arma(double *a, double *b, int p, int q, double mean, double sigma, long int *seed, double *x, int n) { int i; int k; double s; double *w; w = malloc(n * sizeof(double)); for(k = 0; k < n; k++) w[k] = gauss(mean, sigma, seed); x[0] = b[0] * w[0]; for(k = 1; k <= p; k++){ s = 0.0; for(i = 1; i <= k; i++) s += a[i] * x[k - 1]; s = b[0] * w[k] - s; if(q == 0){ x[k] = s; continue; } m = (k > q) ? q : k; for(i = 1; i <= m; i++) s += b[i] * w[k - i]; x[k] = s; } for(k = (p + 1); k < n; k++){ s = 0.0; for(i = 1; i <= p; i++) s += a[i] * x[k - i]; s = b[0] * w[k] - s; if(q == 0){ x[k] = s; continue; } for(i = 1; i <= q; i++) s +=b[i] * w[k - i]; x[k] = s; } free(w); }
gauss.c文件参见正态分布的随机数