⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power_law_cov.c

📁 最大似然估计算法
💻 C
字号:
#include "timeseries.h"void power_law_cov(double *time, int n, double Delta_t, double sigma, double spectral_index, double *C) {	/*****************************************************************/	/*    power_law_cov                                              */	/*                                                               */	/*    Compute the covariance matrix for any power-law process    */	/*    using fractional differencing (see fractional_diff.c)      */	/*                                                               */	/*    time           time vector of data points (years)          */	/*    sigma          standard deviation of noise (meters)        */	/*    spectral_index                                             */	/*                                                               */	/* Hadley Johnson, hjohnson@ucsd.edu, 28-May-1998 matlab version */	/* Simon  Williams, sdwil@pol.ac.uk, 08-Nov-2000 c-version       */	/*                                                               */	/* added Delta_t to calculate first offset instead of assuming   */	/* 1 / 365.24219 so it is better for data other than daily       */	/* for example monthly data in sea-level records. Could use the  */	/* median delta instead but that requires sorting the data which */	/* I didnt want to do. Also could have specified/calculated      */	/* Delta_t in the calling subroutines but that means changing    */	/* a lot of routines. May do this later when I have more time    */	/* S. Williams 18 Dec 2002                                       */	/*****************************************************************/	int i, j, k;	double *dt, *c, *filter;	dt = (double *) calloc((size_t)n, sizeof(double) );	c  = (double *) calloc((size_t)n, sizeof(double) );	filter = (double *)calloc((size_t)(n*n), sizeof(double));	dt[0] = Delta_t;	for (j = 0; j < n-1; j++) { 		dt[j+1] = time[j+1] - time[j];	}	for (j = 0; j < n; j++) c[j] = sigma * pow(dt[j],-spectral_index / 4.0);	if (spectral_index > 0.0) c[0] = 0.0;	fractional_diff(filter,n,spectral_index / 2.0);	for (j = 0; j < n; j++) {		for (k = 0; k < n; k++){			filter[j + k * n] *= c[k];		}	}	for (j = 0; j < n; j++) {		for (k = 0; k < n; k++) {			C[j + k * n] = 0.0;			for (i = 0; i < n; i++) {				C[j + k * n] += filter[j + i * n] * filter[k + i * n];			}		}	}	free(dt);	free(c);	free(filter);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -