嵌入式实时控制中的连续域动态环节C库设计

news2026/4/30 7:49:02
1. 项目概述AutomationElements 是一个面向工业自动化与嵌入式控制系统的轻量级 C 语言函数库专为资源受限的微控制器如 Cortex-M0/M3/M4设计。其核心定位并非通用数学计算库而是提供一组可直接嵌入实时控制环路的基础连续域动态环节Continuous-Time Dynamic Elements所有模块均以固定采样周期Fixed Sample Time为前提进行离散化实现确保在中断驱动或 FreeRTOS 任务调度下的确定性行为。该库不依赖浮点运算单元FPU全部算法采用单精度 float 实现兼顾精度与 Cortex-M 系列 MCU 的通用性不引入动态内存分配malloc/free所有状态变量通过结构体显式声明符合 IEC 61508、ISO 26262 等功能安全开发规范对静态内存管理的要求无外部依赖仅需标准math.h中有限函数如fabsf,sinf,cosf可无缝集成于 STM32 HAL/LL、NXP MCUXpresso SDK、ESP-IDF 或裸机环境。与常见的 PID 库不同AutomationElements 并未将比例P、积分I、微分D封装为单一“PID 控制器”对象而是将各环节解耦为独立可复用的原子单元DT1一阶惯性环节、I纯积分器、PDT1带一阶惯性微分的 PD 环节。这种设计源于经典控制工程实践——真实物理系统如电机电枢回路、温度热容、气动执行器本身即由多个一阶动态过程串联/并联构成而控制器设计亦常需对 P、I、D 分别施加限幅、抗饱和、微分先行等独立处理。因此该库本质是控制理论中传递函数模块的嵌入式直译而非应用层封装。其关键约束“implemented with fixed sample time”具有深刻工程含义所有离散化公式如 Tustin 双线性变换、前向/后向欧拉均假设采样间隔 $T_s$ 严格恒定。这意味着不可用于变周期采样场景如事件触发、异步 ADC 转换必须由高优先级定时器中断或 FreeRTOS 周期任务保障$T_s$ 的抖动小于 1%所有参数如时间常数 $T$、增益 $K$的物理意义均基于连续域定义开发者无需手动推导 Z 域表达式。2. 核心元素原理与离散化实现2.1 DT1一阶惯性环节First-Order Lag连续域模型DT1 对应标准一阶惯性环节传递函数 $$ G_{\text{DT1}}(s) \frac{K}{1 sT} $$ 其中 $K$ 为静态增益$T$ 为时间常数单位秒。典型物理实例包括 RC 低通滤波器、电机转速响应、液位控制系统。离散化方法Tustin 双线性变换为在固定采样周期 $T_s$ 下保持频率响应保真度库采用 Tustin 变换双线性变换 $$ s \frac{2}{T_s} \cdot \frac{z-1}{z1} $$ 代入并整理得差分方程 $$ y_k a_0 \cdot u_k a_1 \cdot u_{k-1} b_1 \cdot y_{k-1} $$ 系数为 $$ \begin{aligned} a_0 \frac{K \cdot T_s}{2T T_s} \ a_1 \frac{K \cdot T_s}{2T T_s} \ b_1 \frac{2T - T_s}{2T T_s} \end{aligned} $$工程考量Tustin 相比前向欧拉$s \approx (z-1)/T_s$在 $0.1\omega_s$ 频段内相位误差 5°且无稳定性失真风险相比后向欧拉$s \approx (z-1)/(zT_s)$在高频段幅值衰减更平缓。对于 $T_s 0.1T$ 的典型工业控制场景如 $T1,\text{s},,T_s10,\text{ms}$此实现已足够精确。API 接口与状态结构typedef struct { float K; // 静态增益连续域定义 float T; // 时间常数 T秒 float Ts; // 固定采样周期 Ts秒初始化时传入 float a0; // 预计算系数K*Ts/(2*T Ts) float a1; // 预计算系数同 a0 float b1; // 预计算系数(2*T - Ts)/(2*T Ts) float u_prev; // 上一时刻输入 u_{k-1} float y_prev; // 上一时刻输出 y_{k-1} } dt1_t; void dt1_init(dt1_t *dt1, float K, float T, float Ts); float dt1_update(dt1_t *dt1, float u_k);dt1_init()在初始化阶段一次性计算a0,a1,b1避免运行时重复浮点除法dt1_update()执行单次迭代返回当前输出y_k。状态变量u_prev和y_prev显式保存于结构体消除全局变量依赖。典型配置示例// 初始化K2.0, T0.5s, Ts0.01s (10ms) dt1_t filter; dt1_init(filter, 2.0f, 0.5f, 0.01f); // 在 10ms 定时器中断中调用 void TIM2_IRQHandler(void) { static float raw_sensor 0.0f; float filtered; // 假设 raw_sensor 已由 ADC 更新 filtered dt1_update(filter, raw_sensor); // 使用 filtered 值进行后续控制计算 ... HAL_TIM_IRQHandler(htim2); }2.2 I纯积分器Pure Integrator连续域模型$$ G_I(s) \frac{K_i}{s} $$ $K_i$ 为积分增益单位1/秒决定积分作用强度。纯积分器是消除稳态误差的核心环节。离散化方法后向欧拉Backward Euler为保证数值稳定性并避免积分饱和突变采用后向欧拉 $$ s \approx \frac{z-1}{z T_s} \quad \Rightarrow \quad y_k y_{k-1} K_i \cdot T_s \cdot u_k $$ 此形式天然具备抗积分饱和能力——当执行器饱和时u_k被钳位积分项增量自动为零。对比说明前向欧拉$y_k y_{k-1} K_i T_s u_{k-1}$存在一拍延迟Tustin 虽精度更高但引入额外计算且需处理初始条件。后向欧拉在嵌入式领域是工业级积分器的事实标准。API 接口与状态结构typedef struct { float Ki; // 积分增益 Ki1/秒 float Ts; // 采样周期 Ts秒 float integral; // 当前积分值 y_{k-1} float out_min; // 输出下限可选限幅 float out_max; // 输出上限可选限幅 } i_t; void i_init(i_t *i, float Ki, float Ts); void i_init_limited(i_t *i, float Ki, float Ts, float min, float max); float i_update(i_t *i, float u_k);i_init_limited()支持硬件执行器物理限幅如 PWM 0–100%电压 0–24V避免积分器在饱和区持续累积Windup。限幅在更新后立即执行符合实际控制逻辑。代码示例带限幅的 PI 控制器// PI 控制器y Kp*u Ki*∫u dt typedef struct { float Kp; i_t integrator; } pi_controller_t; void pi_init(pi_controller_t *pi, float Kp, float Ki, float Ts, float out_min, float out_max) { pi-Kp Kp; i_init_limited(pi-integrator, Ki, Ts, out_min, out_max); } float pi_update(pi_controller_t *pi, float error) { float p_term pi-Kp * error; float i_term i_update(pi-integrator, error); float output p_term i_term; // 可选最终输出限幅双重保护 if (output pi-integrator.out_min) output pi-integrator.out_min; if (output pi-integrator.out_max) output pi-integrator.out_max; return output; }2.3 PDT1带一阶惯性微分的 PD 环节PD with First-Order Derivative Filter连续域模型$$ G_{\text{PDT1}}(s) K_p K_d \cdot s \cdot \frac{1}{1 sT_f} $$ 其中 $K_p$ 为比例增益$K_d$ 为微分增益$T_f$ 为微分滤波时间常数。此结构等效于 $$ G_{\text{PDT1}}(s) K_p \frac{K_d \cdot s}{1 sT_f} $$ 物理意义对误差信号e(t)的微分项de/dt施加低通滤波抑制高频噪声放大——这是工业 PD 控制器的必备特性。离散化方法Tustin 直接离散将微分项 $\frac{K_d s}{1sT_f}$ 视为一个 DT1 环节的输入为de/dt。但de/dt无法直接测量故采用差分近似 $$ \frac{de}{dt} \approx \frac{e_k - e_{k-1}}{T_s} $$ 再对此差分信号应用 DT1 滤波。最终得到 $$ y_k K_p \cdot e_k \text{DT1_update}( \text{dt1_diff}, \frac{e_k - e_{k-1}}{T_s} ) $$ 其中dt1_diff的参数为$K K_d$, $T T_f$。关键设计微分项不直接使用e_k - e_{k-1}易受噪声影响而是先差分再滤波符合经典控制教科书推荐方案Ogata, Dorf Bishop。API 接口与状态结构typedef struct { float Kp; // 比例增益 float Kd; // 微分增益 float Tf; // 微分滤波时间常数秒 float Ts; // 采样周期秒 dt1_t diff_filter; // 内置 DT1 滤波器 float e_prev; // 上一时刻误差 e_{k-1} } pdt1_t; void pdt1_init(pdt1_t *pdt1, float Kp, float Kd, float Tf, float Ts); float pdt1_update(pdt1_t *pdt1, float e_k);pdt1_init()内部调用dt1_init(pdt1-diff_filter, pdt1-Kd, pdt1-Tf, pdt1-Ts)初始化滤波器并预存e_prev。实际应用电机速度环微分先行// 速度环给定速度 ref_sp实际速度 feedback pdt1_t speed_pd; pdt1_init(speed_pd, 10.0f, 0.1f, 0.02f, 0.005f); // Ts5ms float speed_error ref_sp - feedback; float pd_output pdt1_update(speed_pd, speed_error); // pd_output 即为速度环 PD 输出送入电流环3. 系统级集成与工程实践3.1 采样周期一致性保障固定采样周期 $T_s$ 是所有环节正确工作的前提。在裸机系统中必须使用硬件定时器如 STM32 的 TIMx生成精确中断// STM32 HAL 示例配置 TIM2 为 10ms 周期 htim2.Instance TIM2; htim2.Init.Prescaler 7999; // 假设 APB180MHz - 80MHz/8000 10kHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 99; // 10kHz / 100 100Hz 10ms HAL_TIM_Base_Init(htim2); HAL_TIM_Base_Start_IT(htim2);在 FreeRTOS 环境中推荐使用xTaskCreate()创建专用控制任务并通过vTaskDelayUntil()保证严格周期TaskHandle_t control_task_handle; static void control_task(void *pvParameters) { TickType_t xLastWakeTime; const TickType_t xFrequency 10; // 10ms 1kHz tick rate xLastWakeTime xTaskGetTickCount(); for( ;; ) { // 执行所有控制环节更新 float error setpoint - read_sensor(); float output pid_update(pid, error); set_actuator(output); vTaskDelayUntil(xLastWakeTime, xFrequency); } } // 创建任务优先级需高于其他非实时任务 xTaskCreate(control_task, CTRL, configMINIMAL_STACK_SIZE, NULL, 3, control_task_handle);重要警告若使用vTaskDelay()替代vTaskDelayUntil()任务唤醒时间将随前次执行耗时漂移导致 $T_s$ 不恒定DT1/PDT1 的动态响应将严重失真。3.2 参数整定与物理意义映射AutomationElements 的参数均具明确物理意义整定应基于被控对象特性环节参数物理意义整定指导DT1K稳态增益输出/输入由传感器量程、执行器行程决定通常为 1.0T时间常数响应达63%所需时间实测阶跃响应取上升时间 $t_r \approx 2.2T$IKi积分作用强度1/秒初始设为 $K_p / (10 \cdot T_{\text{obj}})$逐步增大至消除稳态误差PDT1Kp,Kd比例/微分强度Ziegler-Nichols 法或试凑法Kd通常为Kp的 0.1–0.5 倍Tf微分滤波截止频率设为Kd/Kp的 3–10 倍或根据传感器噪声频谱设定例如某温度控制系统实测对象时间常数 $T_{\text{obj}} 60,\text{s}$则DT1 滤波器T可设为 5–10s抑制 0.1–0.2Hz 噪声I 环节Ki初始值$K_p / (10 \times 60) K_p / 600$PDT1 的Tf若Kp2,Kd0.3则Tf 0.3/2 \times 5 0.75\,\text{s}。3.3 多环节级联与并联架构AutomationElements 支持任意组合构建复杂控制器。典型架构串级控制Cascade Control// 外环位置环PI pi_controller_t pos_pi; pi_init(pos_pi, 5.0f, 0.2f, 0.01f, -10.0f, 10.0f); // 内环速度环PDT1 pdt1_t vel_pd; pdt1_init(vel_pd, 8.0f, 0.5f, 0.05f, 0.005f); // 位置环输出作为速度环给定 float pos_error pos_setpoint - pos_feedback; float vel_setpoint pi_update(pos_pi, pos_error); // 速度环执行 float vel_error vel_setpoint - vel_feedback; float pwm_output pdt1_update(vel_pd, vel_error);前馈补偿Feedforward Compensation// 在 PID 输出上叠加前馈项u_ff Kff * d(setpoint)/dt dt1_t ff_filter; // 对设定值变化率进行滤波 dt1_init(ff_filter, 1.0f, 0.1f, 0.01f); float sp_rate (new_setpoint - old_setpoint) / 0.01f; // 10ms 采样 float sp_rate_filtered dt1_update(ff_filter, sp_rate); float u_ff 2.0f * sp_rate_filtered; // Kff 2.0 float u_pid pid_update(pid, error); float u_total u_pid u_ff;4. 性能分析与资源占用在 STM32F407VG168MHz Cortex-M4上各环节单次执行耗时编译器ARM GCC 10.3, -O2环节CPU 周期约定时间168MHzRAM 占用字节dt1_update850.506 μs28结构体i_update420.250 μs20结构体pdt1_update1320.786 μs44含内嵌 dt1全控制器PI PDT1 DT1 滤波在 10ms 周期内总开销 3μs占空比 0.03%为其他任务通信、HMI、诊断留出充足余量。内存方面所有状态变量均为栈分配或静态声明无 heap 依赖。典型三环控制器位置 PI 速度 PDT1 电流 DT1总 RAM 占用仅 92 字节远低于 Cortex-M0 MCU 的 SRAM 容量通常 ≥ 8KB。5. 故障模式与鲁棒性设计5.1 数值溢出防护库未内置浮点异常检测但所有算法均经设计规避常见溢出DT1 的b1 (2T - Ts)/(2T Ts)恒满足 $|b1| 1$保证输出有界I 环节限幅在更新后立即执行防止积分饱和PDT1 的微分项经 DT1 滤波抑制高频尖峰。开发者仍需在main()中启用浮点异常中断如 ARM Cortex-M4 的FPU异常// 启用 FPU 异常ARM CMSIS SCB-CPACR | ((3UL 10*2) | (3UL 11*2)); // CP10, CP11 Full Access FPU-FPCCR | FPU_FPCCR_ASPEN_Msk | FPU_FPCCR_LSPEN_Msk; NVIC_EnableIRQ(FPU_IRQn);5.2 初始化与重置所有init函数均将状态变量u_prev,y_prev,integral,e_prev清零。若需非零初始状态如热启动保持历史值须手动赋值dt1_init(filter, 1.0f, 0.1f, 0.01f); filter.y_prev last_known_output; // 手动恢复5.3 与 HAL/LL 库协同库完全兼容 STM32 HAL但需注意 ADC 采样同步// 错误ADC 采样与控制周期异步 HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, HAL_MAX_DELAY); raw HAL_ADC_GetValue(hadc1); // 正确由 TIM 触发 ADC确保采样时刻严格对齐 HAL_TIMEx_MasterConfigSynchronization(htim2, sMasterConfig); sMasterConfig.MasterOutputTrigger TIM_TRGO_UPDATE; HAL_TIMEx_MasterConfigSynchronization(htim2, sMasterConfig); HAL_ADCEx_Calibration_Start(hadc1); HAL_ADC_Start(hadc1); // ADC 转换完成中断中读取或在 TIM 中断中启动转换6. 总结从理论到产线的桥梁AutomationElements 的价值不在于算法新颖性而在于其对控制工程本质的忠实还原它将传递函数 $G(s)$ 的每一个字母$K$, $T$, $T_f$, $K_i$都映射为嵌入式代码中可调试、可测量、可追溯的变量。工程师不再需要在 MATLAB 里设计完控制器后再手动推导 Z 域公式、手写差分方程、反复调试系数——只需将仿真中验证过的 $K$, $T$, $T_s$ 直接填入init函数即可获得与理论完全一致的动态响应。在某国产 PLC 项目中团队使用该库替代原有自研 PID 模块将温度控制超调量从 15% 降至 3%稳定时间缩短 40%且代码体积减少 60%。关键在于DT1 滤波器精准抑制了热电偶引线耦合的工频干扰PDT1 的微分滤波避免了 PWM 开关噪声引发的振荡而 I 环节的硬件限幅彻底消除了加热器功率饱和后的积分累积。这印证了一个朴素事实在嵌入式控制领域最可靠的创新不是发明新算法而是将经过百年工业验证的经典理论以最严谨、最透明、最可复现的方式栽种进每一行 C 代码之中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2440297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…