一.预测方法
地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测 系统会从文件中读取相应的能量数据,测试在给定的时间点上,一个短时间窗口内的取样值 与一个长时间窗口内取样值的商,如果这个比例高于给定的阈值,那么在这个事件点上极有 可能发生地震。
取样方法: 无论短/长时间内的取样值都是使用给定点能量数据的平方加上该点之前的一小部分点能量值的平方之和再求平均值
如: 某个时间点的及之前的 7 个能量数据如下,时间间隔是: 0.01 秒, 短时间周期取 2个点,长时间周期取 5 个点:
则: 短时间窗口内的取样值: (5x5 + 4x4 + 2x2) / 3 = 15
长时间窗口内的取样值: (5x5 + 4x4 + 2x2 +1x1 + 1x1) / 5 = 9
二.目的与输入输出
三.程序源码
检测地震源文件
seismic.txt
11 0.01
1 2 1 1 1 5 4 2 1 1 1
earthquake_detection.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <cmath>
#include <math.h>
using namespace std;
#define THRESHOLD 1.5
double power(double arr[], int length, int width) {
double xsquare = 0;//指定宽度内能量值之和
for (int i = 0; i < width; i++) {
xsquare += pow(arr[length - i], 2);
}
return xsquare / width;
}
int main() {
int n = 0;//数据个数
double t_interval;//采样时间间隔
double* data = NULL;
int longW = 0, shortW = 0;
string filename = "seismic.txt";
//cout << "请输入地震能量值数据所在的文件名:";
//cin >> filename;
ifstream fin;
fin.open(filename.c_str());
if (fin.fail()) {
cerr << "文件打开失败!原因:" << strerror(errno) << endl;
exit(1);
}
else {
fin >> n >> t_interval;
if (n <= 0) {
cerr << "数据个数应为正整数!" << endl;
exit(2);
}
else {
data = new double[n];
//数据录入
for (int i = 0; i < n; i++) {
fin >> *(data + i);
if (*(data + i) < 0) {
cerr << "地震能量值应为自然数!";
exit(3);
}
}
//键盘输入长窗口和短窗口宽度
cout << "width of long window:";
cin >> longW;
cout << "width of short window:";
cin >> shortW;
//计算length起始点
for (int i = longW - 1; i < n; i++) {
if (power(data, i, shortW) / power(data, i, longW) >= THRESHOLD) {//计算从i开始向前数width个
cout << "Possible event at " << i * t_interval << "s" << endl;
}
}
delete[] data;
}
fin.close();
}
system("pause");
return 0;
}