地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以 及强度 。
预测方法
地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测系统会从文件中读取相应的能量数据,测试在给定的时间点上,一个短时间窗口内的取样值与一个长时间窗口内取样值的商,如果这个比例高于给定的阈值,那么在这个事件点上极有可能发生地震。取样方法:无论短/长时间内的取样值都是使用给定点能量数据的平方加上该点之前的一小部分点能量值的平方之和再求平均值
如: 某个时间点的及之前的 7 个能量数据如下,时间间隔是: 0.01 秒, 短时间周期取 2 个点,长时间周期取 5 个点:
则: 短时间窗口内的取样值: (5x5 + 4x4 + 2x2) / 3 = 15
长时间窗口内的取样值: (5x5 + 4x4 + 2x2 +1x1 + 1x1) / 5 = 9
具体开发需求
1.问题描述:
使用数据文件中的一组地震检波器测量值确定可能的地震事件的位置。
2. 输入输出描述:
程序的输入是名为seismic.dat的数据文件和用于计算短时间能量和长时间能量的取样值的数目。输出是给出关于潜在的地震事件次数的报告。
seismic.dat 的结构是这样的,第一行包含两个值: 地震检波器能量值的数目和时间间隔,从第二行开始就是能量值的数据,以空格分开
短时间窗口和长时间窗口的值可以由键盘读入
判定地震事件给定的阀值是 1.5
seismic.dat 中的数据如下:
11 0.01
1 2 1 1 1 5 4 2 1 1 1
算法设计:
1) 读取文件头并分配内存;
2) 从数据文件读取地震数据,从键盘读取计算能量的短时间和长时间窗口测量 值的数目;
3) 计算各个时间点上的短时间窗口和长时间窗口的能量值,打印出可能的地震 事件时间,在这里,因为会涉及到频繁调用短时间窗口和长时间窗口的能量值, 我们可以将计算能量值设计为单独的一个函数
代码实现:
#include <iostream> #include <Windows.h> #include <string> #include <fstream> #include <cmath> using namespace std; #define THRESHOLD 1.5 double power_r(double arr[], int j, int n); int main(void) { string filename; fstream fin; double time_s = 0; double* arr = NULL; double short_power = 0, long_power = 0; int num = 0, short_Windows = 0, long_Windows = 0; cout << "Enter Your Open File:" << endl; cin >> filename; fin.open(filename.c_str()); if (fin.fail()) { cout << "Error Open File.\n"; exit(-1); } else { fin >> num >> time_s; if (num > 0) { arr = new double[num]; for (int i = 0; i < num; i++) { fin >> arr[i]; } cout << "请输入长窗口:" << endl; cin >> long_Windows; cout << "请输入短窗口:" << endl; cin >> short_Windows; for (int j = long_Windows-1; j < num; j++) { short_power = power_r(arr, j, short_Windows); long_power = power_r(arr, j, long_Windows); double ratio = 0; ratio = short_power / long_power; if (ratio > THRESHOLD) { cout << " Possible event at " << time_s * j <<"seconds\n"; } } delete[] arr; } fin.close(); } system("pause"); return 0; } double power_r(double arr[],int j, int n) { double s = 0; for (int i = 0; i < n; i++) { s = s + pow(arr[j - i], 2); } return s / n; }