当前位置: 首页 > news >正文

AI赋能空间天气预报:深度学习预测太阳耀斑的技术实践

1. 项目概述:当AI遇见太阳风暴

太阳,这颗为我们提供光和热的恒星,其表面并非总是宁静。剧烈的太阳活动,尤其是太阳耀斑和日冕物质抛射,会向太空抛射出大量高能粒子和辐射。当这些“太阳风暴”抵达地球时,会对我们高度依赖的现代科技社会构成实实在在的威胁。从卫星通信中断、导航系统失灵,到电网波动甚至瘫痪,空间天气的影响早已从理论走向现实。因此,准确预测太阳活动,特别是太阳耀斑的爆发,成为了空间天气预报领域的“圣杯”。

传统的预报方法主要依赖物理学家和预报员对太阳观测数据(如磁场图、紫外和X射线图像)的经验分析,其准确性和提前量都面临瓶颈。而AI-FLARES项目的核心,正是将人工智能,特别是深度学习技术,引入到太阳耀斑数据的分析与预测中。这不仅仅是工具的升级,更是一次研究范式的转变。它试图从海量、多维度、高时空分辨率的太阳观测数据中,让机器自己“学习”出耀斑爆发前那些微妙且复杂的征兆模式,从而实现对强耀斑事件更早、更准的预报。

简单来说,AI-FLARES项目要解决的,是一个典型的“大海捞针”式模式识别问题。它需要处理来自太阳动力学天文台(SDO)、太阳和日球层探测器(SOHO)等卫星传回的TB甚至PB级数据,从中找出与耀斑爆发强相关的特征,并构建预测模型。这对于从事空间物理、数据科学和机器学习交叉领域的研究者或工程师而言,是一个极具挑战性和应用价值的课题。无论你是想了解AI如何赋能传统科研,还是希望亲手构建一个预测太阳风暴的模型,这个项目都能为你提供一个绝佳的实践窗口。

2. 核心思路与技术架构拆解

AI-FLARES项目的成功,绝非简单地将一个现成的图像分类模型套用到太阳数据上。它需要一整套针对领域问题量身定制的技术架构。其核心思路可以概括为:“数据驱动特征发现”替代“人工经验特征提取”

2.1 从物理先验到数据驱动:范式转变

传统方法中,预报员会重点关注太阳活动区的几个关键物理参数,如磁场梯度、电流螺度、磁通量等,并基于经验公式或统计模型判断其爆发潜力。这种方法依赖于人类对太阳物理的深刻理解,但难以处理高维数据中复杂的非线性关系,且特征工程高度依赖专家知识。

AI-FLARES项目则采用了数据驱动的端到端(End-to-End)或特征学习(Feature Learning)思路。我们不再(或减少)手动设计特征,而是将原始的或多波段预处理后的太阳图像直接输入深度学习模型。模型的卷积层会自动学习并提取从边缘、纹理到复杂磁结构的一系列层次化特征。这些特征可能包含人类尚未明确认知或难以量化的耀斑前兆信息。项目的核心假设是:在爆发前数小时至数十小时,活动区的磁场结构和能量积累过程,会在多波段观测中留下可以被神经网络捕捉的“指纹”。

2.2 技术栈选型与考量

一个典型的AI-FLARES项目技术栈包含以下几个层次,每一层的选型都基于实际需求:

  1. 数据层

    • 数据源:首选NASA的SDO卫星数据,因为它提供了几乎连续、高时空分辨率的全日面多波段观测。关键数据产品包括:
      • HMI:太阳动力学天文台日震和磁像仪数据,提供矢量磁场和视线磁场图,是耀斑预测的物理基础。
      • AIA:大气成像组件数据,提供多个极紫外(EUV)和紫外(UV)波段的图像,反映不同温度层次的太阳大气状态。
    • 数据获取:使用sunpy库,这是太阳物理数据分析的Python标准库,可以方便地查询和下载FITS格式的科学数据。
    • 存储:考虑到数据量巨大(单日数据可达数TB),本地处理需大容量硬盘阵列。云平台(如AWS S3, Google Cloud Storage)结合弹性计算是更 scalable 的方案。
  2. 预处理与特征工程层

    • 核心工具numpy,scipy,sunpy。尽管是数据驱动,必要的物理预处理不可或缺。
    • 关键步骤
      • 数据对齐与裁剪:将不同仪器、不同时间点的图像进行坐标对齐,并围绕目标太阳活动区进行裁剪,形成数据立方体。
      • 归一化:对图像像素值进行标准化,例如使用Min-Max缩放或Z-score标准化,以加速模型训练收敛。
      • 标签制作:这是监督学习的关键。需要根据GOES卫星记录的X射线流量数据,为每个数据样本打上标签(例如:“未来24小时内是否发生M级或以上耀斑”)。这里涉及时间窗口的设定,是一个需要仔细权衡的超参数。
    • 数据增强:针对太阳数据特点,可以采用旋转(考虑太阳自转)、翻转、添加噪声等方式扩充数据集,提升模型泛化能力。但需注意,某些物理变换(如磁场极性反转)是不合理的。
  3. 模型层

    • 框架选择PyTorchTensorFlow/Keras。PyTorch在研究社区更受欢迎,因其动态图机制更灵活,便于实验和调试;TensorFlow在生产部署和移动端支持上更成熟。对于此类科研项目,PyTorch通常是首选。
    • 模型架构
      • 卷积神经网络:是处理太阳图像的基石。经典的架构如ResNet、DenseNet、EfficientNet都被广泛尝试。它们能有效提取空间特征。
      • 时空模型:耀斑爆发是一个演化过程。因此,结合CNN与循环神经网络(RNN)如LSTM或GRU,或直接使用时序卷积网络(TCN)、3D CNN来处理时间序列的图像数据,是提升预测性能的关键方向。这能让模型学习活动区的动态演化模式。
      • 注意力机制:引入SENet、CBAM等注意力模块,或Transformer架构,可以让模型更关注图像中与耀斑相关的关键区域(如强磁场剪切处、磁中性线附近),抑制无关背景的干扰。
    • 预训练模型:在自然图像上预训练的模型(如ImageNet预训练的ResNet)可以作为不错的起点,通过迁移学习进行微调,能有效利用其强大的通用特征提取能力,并缓解太阳耀斑数据标注不足的问题。
  4. 训练与评估层

    • 损失函数:由于耀斑事件(尤其是强耀斑)属于极端不平衡分类(非耀斑样本远多于耀斑样本),不能简单使用交叉熵损失。需要采用加权交叉熵、Focal Loss等来加大对少数类(耀斑)样本错误的惩罚。
    • 评估指标:准确率在不平衡数据上毫无意义。必须使用真正率(TPR/Recall)、假正率(FPR)、精确率(Precision)、F1分数,以及综合性的受试者工作特征曲线下面积(AUC-ROC)精确率-召回率曲线下面积(AUC-PR)。AUC-PR对不平衡数据更敏感,是核心评估指标。
    • 交叉验证:必须采用严格的时间序列交叉验证,确保训练集时间早于验证集和测试集,以模拟真实预报场景,避免“未来信息泄露”。
  5. 部署与应用层

    • 模型服务化:训练好的模型可以通过TorchServeTensorFlow ServingFastAPI+ONNX Runtime封装成RESTful API服务。
    • 自动化流水线:结合Apache AirflowPrefect等工具,构建从数据自动下载、预处理、预测到结果发布(如生成预报报告、更新数据库)的完整自动化流水线。
    • 可视化:使用matplotlib,plotly,DashStreamlit构建交互式预报看板,直观展示模型预测结果、置信度及关键区域的可视化。

注意:数据划分的“时间壁垒”。这是本项目最容易犯的致命错误。绝对不能随机打乱所有数据样本再进行划分。必须严格按照时间顺序划分训练集、验证集和测试集。例如,用2010-2017年的数据训练,2018-2019年验证,2020-2021年测试。这样才能真实评估模型的预报能力,否则会得到过于乐观的虚假性能。

3. 实操构建:从数据到预测模型

下面,我将以一个简化但完整的流程,展示如何动手构建一个基础的太阳耀斑预测模型。我们将使用SDO/HMI的磁图数据和GOES耀斑列表,目标是预测某个活动区在未来24小时内是否会发生M级及以上耀斑。

3.1 环境准备与数据获取

首先,搭建一个Python环境,安装核心库。

# 创建并激活虚拟环境(可选但推荐) conda create -n ai-flares python=3.9 conda activate ai-flares # 安装核心科学计算和太阳物理库 pip install numpy scipy pandas matplotlib scikit-learn pip install sunpy astropy # 安装深度学习框架(这里以PyTorch为例) # 请根据你的CUDA版本前往PyTorch官网获取安装命令 # pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装用于数据加载和处理的辅助库 pip install tqdm requests

接下来,编写数据下载和预处理脚本。我们使用sunpy来获取SDO数据。

import sunpy.map from sunpy.net import Fido, attrs as a import astropy.units as u from datetime import datetime, timedelta import numpy as np def download_hmi_data(start_time, end_time, save_dir): """ 下载指定时间范围的SDO/HMI视线磁场图。 """ # 构建查询:时间、仪器、测量类型 query = Fido.search(a.Time(start_time, end_time), a.Instrument('HMI'), a.Physobs('los_magnetic_field'), a.Sample(12*u.hour)) # 每12小时采样一次,可根据需要调整 # 下载文件 files = Fido.fetch(query, path=save_dir) return files def create_dataset(active_region_bbox, hours_before_flare=24): """ 创建数据集。 active_region_bbox: 活动区边界框,格式为 (tx, ty, bx, by),单位为太阳像素。 hours_before_flare: 在耀斑发生前多少小时截取数据作为样本。 """ # 1. 加载GOES耀斑事件列表(可从SWPC官网下载CSV) flares_df = pd.read_csv('goes_flare_list.csv', parse_dates=['peak_time']) # 2. 遍历每个M级及以上耀斑事件 samples = [] labels = [] # 1 for flare, 0 for non-flare for _, flare in flares_df[flares_df['class'].str.startswith('M') | flares_df['class'].str.startswith('X')].iterrows(): flare_peak = flare['peak_time'] data_time = flare_peak - timedelta(hours=hours_before_flare) # 3. 尝试下载或加载对应时间的HMI磁图 try: hmi_map = sunpy.map.Map(f"path_to_hmi_data/hmi_data_{data_time.strftime('%Y%m%d_%H%M%S')}.fits") except FileNotFoundError: # 如果文件不存在,则下载 download_hmi_data(data_time, data_time + timedelta(minutes=30), './data') # ... 加载下载的文件 # 4. 裁剪出活动区区域 submap = hmi_map.submap(active_region_bbox) data = submap.data # 5. 归一化处理(例如,缩放到[-1, 1]) # HMI磁图值范围很大,需要做截断和缩放 data_clipped = np.clip(data, -2000, 2000) # 截断极端值 data_normalized = data_clipped / 2000.0 samples.append(data_normalized) labels.append(1) # 正样本:有耀斑 # 6. (可选)生成负样本:在非耀斑时间,从同一活动区或随机活动区取样 # ... # 转换为numpy数组 X = np.array(samples)[:, np.newaxis, :, :] # 增加通道维度 (N, C, H, W) y = np.array(labels) return X, y

3.2 构建一个混合CNN-LSTM预测模型

考虑到耀斑的时序演化特性,我们构建一个结合CNN空间特征提取和LSTM时序建模的混合模型。

import torch import torch.nn as nn import torch.nn.functional as F class FlareCNNLSTM(nn.Module): def __init__(self, input_channels=1, cnn_feat_dim=128, lstm_hidden_dim=64, num_classes=2): super(FlareCNNLSTM, self).__init__() # CNN部分:用于提取单帧图像特征 self.cnn = nn.Sequential( nn.Conv2d(input_channels, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128), nn.ReLU(), nn.AdaptiveAvgPool2d((4, 4)) # 将任意尺寸特征图池化为4x4 ) # 计算CNN输出展平后的维度:128 * 4 * 4 = 2048 self.cnn_out_features = 128 * 4 * 4 # 一个全连接层将CNN特征映射到更低维,作为LSTM的输入 self.cnn_fc = nn.Linear(self.cnn_out_features, cnn_feat_dim) # LSTM部分:用于处理时间序列的特征 self.lstm = nn.LSTM(input_size=cnn_feat_dim, hidden_size=lstm_hidden_dim, num_layers=2, batch_first=True, dropout=0.3, bidirectional=True) # 使用双向LSTM捕捉前后文 # 分类头 self.fc = nn.Sequential( nn.Linear(lstm_hidden_dim * 2, 64), # 双向LSTM,hidden_dim需要乘2 nn.ReLU(), nn.Dropout(0.5), nn.Linear(64, num_classes) ) def forward(self, x): # x 形状: (batch_size, timesteps, C, H, W) batch_size, timesteps, C, H, W = x.size() # 重塑,以便逐时间步通过CNN cnn_in = x.view(batch_size * timesteps, C, H, W) cnn_features = self.cnn(cnn_in) cnn_features = cnn_features.view(batch_size * timesteps, -1) cnn_features = F.relu(self.cnn_fc(cnn_features)) # 重塑回时间序列格式 lstm_in = cnn_features.view(batch_size, timesteps, -1) # LSTM处理 lstm_out, _ = self.lstm(lstm_in) # lstm_out 形状: (batch_size, timesteps, hidden_dim*2) # 通常取最后一个时间步的输出用于分类 last_timestep_out = lstm_out[:, -1, :] # 分类 output = self.fc(last_timestep_out) return output # 实例化模型 model = FlareCNNLSTM(input_channels=1, cnn_feat_dim=128, lstm_hidden_dim=64) print(model)

3.3 模型训练与关键技巧

有了模型和数据,接下来是训练环节。这里有几个针对本项目的关键技巧。

import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import classification_report, roc_auc_score # 1. 准备数据 (假设X, y已按时间顺序准备好) # X形状: (num_samples, timesteps, 1, height, width) # y形状: (num_samples,) # 2. 创建时序交叉验证分割 tscv = TimeSeriesSplit(n_splits=5) fold = 0 for train_idx, val_idx in tscv.split(X): fold += 1 print(f"Training Fold {fold}") X_train, X_val = X[train_idx], X[val_idx] y_train, y_val = y[train_idx], y[val_idx] # 转换为PyTorch张量并创建DataLoader train_dataset = TensorDataset(torch.FloatTensor(X_train), torch.LongTensor(y_train)) # 使用加权随机采样器处理类别不平衡 class_counts = np.bincount(y_train) class_weights = 1. / class_counts sample_weights = class_weights[y_train] sampler = torch.utils.data.WeightedRandomSampler(sample_weights, len(sample_weights)) train_loader = DataLoader(train_dataset, batch_size=32, sampler=sampler) val_dataset = TensorDataset(torch.FloatTensor(X_val), torch.LongTensor(y_val)) val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False) # 3. 定义损失函数和优化器 # 使用带权重的交叉熵损失 weight = torch.tensor([class_weights[0], class_weights[1]], dtype=torch.float32) criterion = nn.CrossEntropyLoss(weight=weight) optimizer = optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5) # 加入L2正则化 # 4. 训练循环 num_epochs = 50 for epoch in range(num_epochs): model.train() running_loss = 0.0 for batch_X, batch_y in train_loader: optimizer.zero_grad() outputs = model(batch_X) loss = criterion(outputs, batch_y) loss.backward() # 梯度裁剪,防止RNN梯度爆炸 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) optimizer.step() running_loss += loss.item() # 验证 model.eval() val_preds = [] val_labels = [] with torch.no_grad(): for batch_X, batch_y in val_loader: outputs = model(batch_X) _, predicted = torch.max(outputs.data, 1) val_preds.extend(predicted.cpu().numpy()) val_labels.extend(batch_y.cpu().numpy()) # 计算验证集指标 val_report = classification_report(val_labels, val_preds, target_names=['Non-Flare', 'Flare'], output_dict=True) val_auc = roc_auc_score(val_labels, val_preds) print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}, ' f'Val F1-Score: {val_report["Flare"]["f1-score"]:.4f}, Val AUC: {val_auc:.4f}') # 保存最佳模型 torch.save(model.state_dict(), f'flare_model_fold{fold}_best.pth')

实操心得:模型训练的“耐心”与“监控”。太阳耀斑预测模型的训练往往需要更多耐心。由于正样本极少,模型初期可能“学不会”识别耀斑,表现为对非耀斑的过拟合。此时,不要急于调整架构,应先确保:

  1. 损失函数权重:正样本的权重是否足够大?可以尝试根据类别频率的倒数或使用Focal Loss的alphagamma参数进行调节。
  2. 学习率与早停:使用较小的学习率(如1e-4, 1e-5)和ReduceLROnPlateau调度器。密切监控验证集上正类(Flare)的召回率(Recall)和AUC-PR,而不是整体准确率。当这些指标连续多个epoch不再提升时,果断早停。
  3. 可视化特征图:使用torchcamgrad-cam等工具可视化CNN卷积层关注的重点区域。这不仅能帮助调试模型(看它是否关注了正确的物理区域,如磁中性线),还能为物理学家提供新的发现线索。

4. 挑战、陷阱与进阶方向

在实际操作AI-FLARES项目时,你会遇到一系列教科书上不会写的挑战。这里记录一些常见的“坑”和对应的排查思路。

4.1 数据层面的典型问题

  1. 问题:模型AUC很高,但实际预报中漏报(Miss)严重。

    • 排查:检查数据泄露。最常见的原因是在时间序列数据上进行了随机划分。确保你的验证集和测试集在时间线上严格位于训练集之后。任何未来的信息(即使是同一活动区不同时间的状态)混入训练集,都会导致性能虚高。
    • 解决:重构数据预处理流程,确保按时间戳排序后,再进行分割。使用TimeSeriesSplit进行交叉验证。
  2. 问题:模型对所有样本都预测为“非耀斑”,F1-score为0。

    • 排查:严重的类别不平衡。检查你的数据集中正负样本比例。如果M/X级耀斑样本占比低于1%,模型很容易倾向于永远预测多数类。
    • 解决
      • 重采样:对正样本进行过采样(如SMOTE),或对负样本进行欠采样。注意,过采样可能引入过拟合,欠采样会丢失信息。
      • 损失函数加权:如上文所示,在CrossEntropyLoss中为不同类别设置权重,这是最常用且有效的方法。
      • 调整决策阈值:模型输出的是概率。默认阈值是0.5。你可以通过绘制P-R曲线,找到一个在召回率和精确率之间取得更好平衡的阈值(例如0.3或0.2),以提高对正类的检出率。
  3. 问题:不同活动区、不同太阳周期的数据,模型性能差异巨大。

    • 排查:太阳活动具有周期性(约11年),不同周期、不同活动区的磁场结构可能存在差异,导致模型泛化能力不足。
    • 解决:在数据集中尽可能涵盖多个太阳周期的数据。在模型设计中加入领域自适应(Domain Adaptation)技术,或者使用元学习(Meta-Learning)的思路,让模型学会快速适应新的、未见过的活动区特征。

4.2 模型与训练层面的挑战

  1. 问题:LSTM训练速度慢,且容易过拟合。

    • 排查:序列长度可能过长(例如,使用了长达48小时、每小时一帧的数据,序列长度=48),导致LSTM梯度传播困难。
    • 解决
      • 降采样:不一定需要每小时一帧。可以尝试每3小时或6小时采样一帧,在保留演化信息的同时缩短序列长度。
      • 使用TCN或Transformer:时序卷积网络(TCN)具有并行计算、感受野可控的优点。Transformer的Self-Attention机制能更好地捕捉长距离依赖,且训练效率更高。可以尝试用这些架构替代LSTM。
      • 增加Dropout和正则化:在LSTM层之间、全连接层之间使用Dropout,并增大weight_decay参数。
  2. 问题:模型可解释性差,预报员不信任“黑箱”结果。

    • 排查:深度学习模型缺乏物理可解释性,这是其在科学领域应用的最大障碍之一。
    • 解决
      • 特征可视化:如前所述,使用Grad-CAM等工具生成热力图,显示模型做出决策所依据的图像区域。将其与物理学家关注的特征(如剪切角、磁通量)进行对比。
      • 输出不确定性估计:使用蒙特卡洛Dropout或贝叶斯神经网络,让模型不仅给出“是否耀斑”的预测,还给出预测的“置信度”或“不确定性”。低置信度的预测可以交给预报员进行人工复核。
      • 构建混合模型:不抛弃传统物理参数。可以将CNN提取的深层特征与计算好的物理参数(如总磁通量、电流螺度)拼接在一起,共同输入分类器。这样模型既学习了数据驱动的特征,又包含了人类知识。

4.3 项目进阶与扩展方向

当你完成了基础版本的构建后,可以从以下几个方向深化项目:

  1. 多模态数据融合:耀斑爆发是太阳大气中多层次的能量释放过程。仅用光球层磁图(HMI)是不够的。将色球层/日冕层的极紫外图像(AIA 94Å, 131Å, 171Å, 193Å, 211Å, 304Å, 335Å)作为额外输入通道,构建多通道输入模型。不同波段反映不同温度的物质,能提供互补信息。

  2. 时空图神经网络(ST-GNN):将太阳活动区视为一个图,每个像素或超像素是节点,节点间的空间关系是边。利用图卷积网络(GCN)来建模磁场复杂的拓扑结构,再结合时序建模,这可能更符合太阳磁场的物理本质。

  3. 预报概率与爆发时间:将问题从二分类(是否爆发)扩展为多任务学习:一个是分类任务(爆发概率),另一个是回归任务(预测从当前时刻到爆发的时间间隔)。这能提供更丰富的预报信息。

  4. 在线学习与持续部署:构建一个可以持续从SDO数据流中学习新数据的在线学习系统。当新的耀斑事件被确认后,系统能自动将其作为新样本加入训练集,微调模型,实现模型的自我进化。

构建AI-FLARES项目的过程,是一个不断在数据、模型和物理认知之间循环迭代的过程。它要求你既要有扎实的深度学习工程能力,又要对太阳物理的基本概念保持敬畏和好奇心。每一次模型的失败,都可能指向一个未被充分理解的物理过程;而每一次预测的成功,也可能为太阳物理学家打开一扇新的窗户。这个过程本身,就是人工智能与自然科学深度融合最具魅力的体现。

http://www.jsqmd.com/news/783126/

相关文章:

  • 你以为AI先裁基层,其实最危险的是中层管理者
  • 基于可解释AI与核形态分析的淋巴瘤辅助诊断系统实践
  • CANN/ops-math掩码填充张量
  • CANN/hcomm获取通道通知数API
  • claude cli 登录403问题
  • CANN π₀.₅模型训练优化说明
  • Docker Registry Push 超时排查全记录:从网络栈到残留 veth 的真相
  • MoE、多模态与AGI:生成式AI研究范式的变革与工程实践
  • 联邦学习在物联网场景下的性能评估与基准测试实践
  • CANN运行时跨机内存共享
  • AI驱动电弧故障检测:从传统信号处理到深度学习实战
  • 可解释AI如何破解人机协同决策的信任难题?
  • Likeshop一个开源商城到底有哪些功能模块?
  • CANN块稀疏注意力算子
  • cann/ops-math反射填充算子
  • 创业公司如何借助Taotoken低成本快速验证AI产品创意
  • 组态屏工程备份 / 恢复 / 加密 / 密码忘记
  • CANN PyPTO索引添加UB函数
  • 2026年数据驾驶舱模版选型指南:可视化能力、行业适配与智能分析深度对比 - 科技焦点
  • torchtitan-npu测试设计指南
  • Python 异步核心
  • CANN/sip Ssyr2示例
  • 2026年数据治理平台选型排行:从数据中台落地看工具的真实差距
  • CANN算子测试赛作品提交规范
  • 2026年自贡一站式家装避坑指南:全案整装vs传统装修,5大品牌深度横评 - 优质企业观察收录
  • 数学专业书籍推荐2:数学分析教科书(国内篇)
  • CANN/ops-solver批量复数矩阵求逆
  • 华为CANN PyPTO实验性UB聚集操作
  • CANN/asc-devkit Arrive同步函数API
  • 多智能体粒子群优化的ELM模型预测控制附Matlab代码