ARMA(p,q)模型数据的产生

一、功能

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

posted @ 2019-10-15 21:17  Liam-Ji  阅读(1279)  评论(0编辑  收藏  举报