铛铛!小秘籍来咯!
小秘籍希望大家都能轻松建模呀,数维杯也会持续给大家放送思路滴~
抓紧小秘籍,我们出发吧~
完整内容可以在文章末尾领取!
来看看认证杯(A题)!
问题重述:
太阳黑子是太阳光球上出现的暂时比周围区域更暗的斑点现象。它们是由于磁通量的浓集而引起的表面温度降低区域,抑制对流而形成的。太阳黑子通常出现在活跃区域内,通常成对出现,具有相反的磁极性。它们的数量根据大约11年的太阳周期而变化。我们需要预测太阳黑子,通常我们需要将结果在月度基础上进行平均。
问题一、请预测当前太阳周期和下一个太阳周期的开始和结束时间;
预测太阳周期的开始和结束时间通常是基于太阳黑子活动的观测数据。我们可以使用时间序列分析方法来预测太阳周期的开始和结束时间。在这里,我们将使用ARIMA(差分整合移动平均自回归模型)作为一种常用的时间序列分析方法。
ARIMA 模型是一种包含自回归(AR)、差分(I,表示整合)、和移动平均(MA)的时间序列分析模型。以下是 ARIMA 模型的一般形式:
A R I M A ( p , d , q ) ARIMA(p, d, q) ARIMA(p,d,q)
其中:
-
p(AR阶数): 自回归的阶数,表示当前观测与过去 p 个观测之间的关系。
-
d(差分阶数): 整合的阶数,表示对时间序列进行差分的次数,以使其变得平稳。
-
q(MA阶数): 移动平均的阶数,表示当前观测与过去 q 个观测的误差之间的关系。
ARIMA 模型的一般形式可以用数学公式表示为:
Y t = ϕ 1 Y t − 1 + ϕ 2 Y t − 2 + … + ϕ p Y t − p + ϵ t − θ 1 ϵ t − 1 − θ 2 ϵ t − 2 − … − θ q ϵ t − q Y_t = \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \ldots + \phi_p Y_{t-p} + \epsilon_t - \theta_1 \epsilon_{t-1} - \theta_2 \epsilon_{t-2} - \ldots - \theta_q \epsilon_{t-q} Yt=ϕ1Yt−1+ϕ2Yt−2+…+ϕpYt−p+ϵt−θ1ϵt−1−θ2ϵt−2−…−θqϵt−q
其中:
-
Y t Y_t Yt 是时间点 t t t 的观测值。
-
ϕ 1 , ϕ 2 , … , ϕ p \phi_1, \phi_2, \ldots, \phi_p ϕ1,ϕ2,…,ϕp 是自回归系数。
-
ϵ t \epsilon_t ϵt 是时间点 t t t 的误差项。
-
θ 1 , θ 2 , … , θ q \theta_1, \theta_2, \ldots, \theta_q θ1,θ2,…,θq 是移动平均系数。
ARIMA 模型的关键思想是通过差分(d 阶数)来使时间序列平稳,然后通过自回归和移动平均项建模残差项的结构。
具体的参数选择可以通过观察自相关函数(ACF)和偏自相关函数(PACF)来进行。在确定 p 和 q 的值时,通常通过观察 ACF 和 PACF 图形中截尾的模式来进行估计。
时序图分析: 绘制时序图,观察太阳黑子数量随时间的变化。这有助于初步了解数据的趋势和周期性。
平稳性检验: 对时序数据进行平稳性检验。如果数据不是平稳的,可能需要进行差分操作,直到数据平稳。
确定 ARIMA 参数: 使用自相关函数(ACF)和偏自相关函数(PACF)来确定 ARIMA 模型的参数。这些图形可以帮助确定自回归(AR)和移动平均(MA)的阶数。
拟合 ARIMA 模型: 使用确定的参数拟合 ARIMA 模型。在拟合模型时,可以将数据分为训练集和测试集,以便后续验证模型的性能。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 包含两列:'Date' 和 'Sunspot_Count'
# 日期列是 datetime 类型
data = pd.read_csv("sunspot_data.csv")
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
sunspot_series = data['Sunspot_Count']
# 绘制时序图
plt.figure(figsize=(10, 6))
plt.plot(sunspot_series, label='Sunspot Count')
plt.title('Sunspot Activity Over Time')
plt.xlabel('Date')
plt.ylabel('Sunspot Count')
plt.legend()
plt.show()
# 平稳性检验
# 这里可以进行差分操作,观察是否能够使时序数据变得平稳
diff_sunspot_series = sunspot_series.diff().dropna()
# 绘制差分后的时序图
plt.figure(figsize=(10, 6))
plt.plot(diff_sunspot_series, label='Differenced Sunspot Count')
plt.title('Differenced Sunspot Activity Over Time')
plt.xlabel('Date')
plt.ylabel('Differenced Sunspot Count')
plt.legend()
plt.show()
# ACF 和 PACF 图形
plot_acf(sunspot_series, lags=20)
plt.title('Autocorrelation Function (ACF)')
plt.show()
plot_pacf(sunspot_series, lags=20)
plt.title('Partial Autocorrelation Function (PACF)')
plt.show()
# ARIMA 模型拟合
# 根据ACF和PACF的图形,选择合适的p和q值
p = 2 # 示例值,根据实际情况调整
d = 1 # 示例值,根据实际情况调整
q = 2 # 示例值,根据实际情况调整
model = ARIMA(sunspot_series, order=(p, d, q))
result = model.fit()
# 模型诊断
result.plot_diagnostics(figsize=(12, 8))
plt.show()
# 预测未来值
forecast_steps = 12 # 示例值,根据实际情况调整
forecast = result.get_forecast(steps=forecast_steps)
forecast_index = pd.date_range(start=sunspot_series.index[-1], periods=forecast_steps + 1, freq='M')[1:]
# 绘制预测结果
plt.figure(figsize=(10, 6))
plt.plot(sunspot_series, label='Historical Sunspot Count')
plt.plot(forecast_index, forecast.predicted_mean, color='red', label='Forecasted Sunspot Count')
plt.fill_between(forecast_index,
forecast.conf_int()['lower Sunspot_Count'],
forecast.conf_int()['upper Sunspot_Count'],
color='red', alpha=0.2)
plt.title('Sunspot Activity Forecast')
plt.xlabel('Date')
plt.ylabel('Sunspot Count')
plt.legend()
plt.show()
问题二:请预测下一个太阳周期太阳最大值的发生时间和持续时间;
预测太阳周期最大值发生时间和持续时间的步骤:
加载观测数据: 保留之前加载的太阳黑子活动的观测时间序列数据。
时序图分析: 绘制时序图,观察太阳黑子数量随时间的变化。
确定周期性: 使用周期性分析方法,例如傅立叶变换,以识别太阳黑子数量的周期性成分。
寻找峰值: 在周期性分析的基础上,找到太阳黑子数量的峰值,这可能对应于太阳周期的最大值。
峰值发生时间: 从峰值处确定太阳周期的最大值发生时间。
峰值持续时间: 可以考虑使用半峰全宽(Full Width at Half Maximum,FWHM)等指标来估计太阳周期的最大值持续时间。
寻找太阳黑子数量的峰值通常可以通过信号处理中的峰值检测方法来实现。在这个背景下,峰值检测的一种常见方法是使用信号的局部最大值。
在周期性分析中,我们通常使用傅立叶变换等技术来识别信号的频率成分。在太阳黑子数量的时间序列中,太阳活动周期的峰值对应于频谱图中的峰值。通过找到这些峰值,我们可以定位太阳周期的最大值。
傅立叶变换将时域信号转换为频域信号,通过观察频谱图,我们可以找到峰值。太阳黑子数量的周期性成分会在频谱图中产生尖峰,这些尖峰对应于太阳周期的峰值。
峰值检测的数学概念可以通过以下步骤简要表示:
-
傅立叶变换: 对太阳黑子数量的时间序列进行傅立叶变换,将信号转换为频域。
$ X(f) = \int_{-\infty}^{\infty} x(t) e^{-j 2 \pi f t} ,dt $
-
频谱图: 绘制频谱图,显示信号在不同频率上的强度。频谱图的 x 轴表示频率,y 轴表示信号的强度。
-
峰值检测: 通过一些算法或方法,检测频谱图中的局部最大值。这些局部最大值对应于太阳周期的峰值。
峰值检测的具体算法可以使用各种方法,例如:
阈值法: 通过设置一个阈值,只保留频谱图中大于该阈值的峰值。
导数法: 通过分析频谱图的导数,找到导数为零的点,即峰值。
小波变换: 使用小波变换进行频谱分析,找到太阳周期的峰值。
总体来说,峰值检测是通过分析频域上的信号特征来找到太阳黑子数量的周期性成分,从而定位太阳周期的最大值。
对于峰值检测,可以使用 scipy
库中的 find_peaks
函数。这个函数可以帮助找到数组中的峰值.
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
# 包含两列:'Date' 和 'Sunspot_Count'
# 日期列是 datetime 类型
data = pd.read_csv("sunspot_data.csv")
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
sunspot_series = data['Sunspot_Count']
# 找到峰值
peaks, _ = find_peaks(sunspot_series, height=0) # 通过设置 height 参数调整峰值检测的灵敏度
# 绘制峰值位置
plt.figure(figsize=(10, 6))
plt.plot(sunspot_series, label='Sunspot Count')
plt.plot(sunspot_series.index[peaks], sunspot_series.iloc[peaks], 'x', color='red', label='Peaks')
plt.title('Sunspot Activity with Peaks')
plt.xlabel('Date')
plt.ylabel('Sunspot Count')
plt.legend()
plt.show()
在某些情况下,也可以使用其他方法,例如小波变换或其他信号处理技术。
问题三:预测当前太阳周期和下一个太阳周期的太阳黑子数量和面积,并在您的论文中解释模型的可靠性。
对于太阳黑子数量和面积的预测,我们可以考虑使用之前提到的ARIMA模型,因为它是一种适用于时间序列数据的常见模型。我们将利用一个简单的框架::
太阳黑子数量和面积预测的步骤:
-
加载观测数据: 使用已有的太阳黑子数量和面积的观测数据。
-
时序图分析: 绘制太阳黑子数量和面积的时序图,观察它们的变化趋势。
-
平稳性检验: 对时序数据进行平稳性检验,确保数据满足ARIMA模型的要求。
-
ARIMA模型选择: 根据时序图、ACF和PACF的分析,选择适当的ARIMA模型。
-
模型训练: 使用历史数据对ARIMA模型进行训练。
-
模型预测: 利用训练好的ARIMA模型进行太阳黑子数量和面积的未来预测。
-
模型验证: 使用验证集对模型进行验证,评估其预测的准确性。
-
结果解释: 解释模型对太阳黑子数量和面积的预测结果,包括对模型可靠性的讨论。
下面是一个简单的Python代码框架,演示了太阳黑子数量的预测。同样的方法可以应用于面积的预测。
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
# 假设你有一个名为 "sunspot_data.csv" 的CSV文件,包含两列:'Date'、'Sunspot_Count' 和 'Sunspot_Area'
# 请确保你的日期列是 datetime 类型
data = pd.read_csv("sunspot_data.csv")
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
sunspot_count_series = data['Sunspot_Count']
# 绘制太阳黑子数量的时序图
plt.figure(figsize=(10, 6))
plt.plot(sunspot_count_series, label='Sunspot Count')
plt.title('Sunspot Count Over Time')
plt.xlabel('Date')
plt.ylabel('Sunspot Count')
plt.legend()
plt.show()
# 平稳性检验,差分操作
diff_sunspot_count_series = sunspot_count_series.diff().dropna()
# 绘制差分后的时序图
plt.figure(figsize=(10, 6))
plt.plot(diff_sunspot_count_series, label='Differenced Sunspot Count')
plt.title('Differenced Sunspot Count Over Time')
plt.xlabel('Date')
plt.ylabel('Differenced Sunspot Count')
plt.legend()
plt.show()
# ARIMA模型选择
p = 2 # 示例值,根据实际情况调整
d = 1 # 示例值,根据实际情况调整
q = 2 # 示例值,根据实际情况调整
# 拟合ARIMA模型
model = ARIMA(sunspot_count_series, order=(p, d, q))
result = model.fit()
# 模型诊断
result.plot_diagnostics(figsize=(12, 8))
plt.show()
# 预测未来值
forecast_steps = 12 # 示例值,根据实际情况调整
forecast = result.get_forecast(steps=forecast_steps)
# 绘制预测结果
plt.figure(figsize=(10, 6))
plt.plot(sunspot_count_series, label='Historical Sunspot Count')
plt.plot(forecast.predicted_mean.index, forecast.predicted_mean, color='red', label='Forecasted Sunspot Count')
plt.fill_between(forecast.predicted_mean.index,
forecast.conf_int()['lower Sunspot_Count'],
forecast.conf_int()['upper Sunspot_Count'],
color='red', alpha=0.2)
plt.title('Sunspot Count Forecast')
plt.xlabel('Date')
plt.ylabel('Sunspot’)
平稳性是指时间序列的统计性质在不同时间段内是不变的。在使用ARIMA模型时,平稳性是一个关键的前提条件,因为ARIMA模型是基于平稳时间序列的。平稳性检验主要是为了确保时间序列的均值、方差和自相关结构在整个序列中是恒定的。
平稳性检验的基本思想是通过比较时间序列在不同时间点上的统计性质,来判断序列是否是平稳的。这可以通过视觉检查时序图、自相关图(ACF)、偏自相关图(PACF)以及定量的统计检验来实现。
-
视觉检查: 绘制时序图观察整体趋势。如果有季节性或趋势成分,可能需要去除。
-
自相关图(ACF)和偏自相关图(PACF): 这两个图形可以用于检测序列是否存在自相关结构。在平稳的序列中,自相关图通常会快速衰减,而在非平稳序列中,可能会存在较强的相关性。
-
单位根检验(Unit Root Test): 单位根检验是检测序列是否具有单位根(即非平稳性)的方法之一。ADF(Augmented Dickey-Fuller)检验是其中一个常用的单位根检验方法。
-
差分操作: 如果序列不是平稳的,可以进行差分操作,即计算序列每个时间点与前一个时间点的差值。重复差分直到序列变得平稳。
理论上,一个平稳的时间序列应该满足以下条件:
-
恒定的均值(Mean Stationary): 时间序列的均值在整个序列中是恒定的。
-
恒定的方差(Variance Stationary): 时间序列的方差在整个序列中是恒定的。
-
恒定的自相关结构(Autocorrelation Stationary): 时间序列的自相关结构在整个序列中是恒定的。
在使用ARIMA模型时,我们通常会通过差分操作来实现平稳性,因为ARIMA模型要求时间序列是平稳的。如果进行了差分操作后,序列满足平稳性的要求,就可以使用ARIMA模型进行建模。
平稳性检验的目标是确保我们的时间序列在建模时符合ARIMA模型的假设,从而提高模型的准确性和可靠性。
认证杯跟紧小秘籍冲冲冲!!更多内容可以点击下方名片详细了解!
记得关注 数学建模小秘籍打开你的数学建模夺奖之旅!