手把手教你写地震监测系统(跟着走,慢慢一步步)

地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以 及强度 。

 

a2875ca7afa44f2c8b4541f7b87fcd7c.png

 

预测方法

地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测系统会从文件中读取相应的能量数据,测试在给定的时间点上,一个短时间窗口内的取样值与一个长时间窗口内取样值的商,如果这个比例高于给定的阈值,那么在这个事件点上极有可能发生地震。取样方法:无论短/长时间内的取样值都是使用给定点能量数据的平方加上该点之前的一小部分点能量值的平方之和再求平均值

如: 某个时间点的及之前的 7 个能量数据如下,时间间隔是: 0.01 秒, 短时间周期取 2 个点,长时间周期取 5 个点:

f983a218bec34b82b6d81c8602c2b7ec.png

 

则:    短时间窗口内的取样值:     (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;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的鱼-blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值