一、功能

产生自回归滑动平均模型\(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文件参见正态分布的随机数

02-13 21:41