编码超材料吸波体智能设计方法【附代码】
✨ 长期致力于超材料、多频段吸波体、宽带吸波体、深度学习、进化算法研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1低通道残差卷积网络与LSTM结合的吸收谱预测设计LCResNet卷积层通道数压缩为16-32-64比标准ResNet减少约70%参数量。每个残差块包含两个3x3卷积和跳跃连接。在残差块后接入两层LSTM每层64单元用于捕捉吸收谱在频域的连续性。输入为超材料拓扑结构二进制矩阵16x16输出为1-12GHz频率点的吸收率201个点。训练数据由CST仿真生成共5.2万组样本其中80%用于训练。LCResNet-LSTM的预测平均绝对误差为0.023比仅用全连接网络降低0.018。单次预测耗时4.8毫秒比CST仿真快4500倍。2离散二进制粒子群与神经网络联合优化BPSO种群规模30迭代50次适应度函数根据设计目标动态定义三频吸波体要求三个频点吸收率90%宽带吸波体要求6-10GHz内平均吸收率85%。每代粒子适应度通过LCResNet-LSTM快速预测而非调用CST。在搜索过程中引入局部扰动以概率0.1翻转拓扑结构的随机位。优化三频吸波体最终结构在3.2GHz、5.8GHz和9.5GHz吸收率分别为93%、91%、94%。宽带吸波体在5.2-11GHz范围内吸收率均高于86%。总优化时间约2.3小时而纯CST优化需要超过80小时。3正向与逆向级联网络的一对多映射解法构建Forward NetworkFNet和Inverse NetworkINet级联INet输入为吸收谱指标中心频率、带宽、吸收率阈值输出为二进制结构矩阵。FNet预测该结构的吸收谱。训练时联合损失函数包括结构重构损失和吸收谱预测损失权重比1:3。采用直通估计器解决二值化时的梯度不连续问题前向传播用sign函数反向传播用恒等映射。增设特征转换网络将性能指标映射到吸收谱空间缓解非唯一性问题。成功设计出基于金属贴片的单频10.1GHz吸收95%、双频4.2和8.6GHz吸收92%/90%和三频超材料吸波体以及基于电阻膜的宽带3-9GHz吸收80%吸波体。逆向设计成功率86%。import numpy as np import tensorflow as tf class LCResNet(tf.keras.Model): def __init__(self): super().__init__() self.conv1 tf.keras.layers.Conv2D(16, 3, paddingsame, activationrelu) self.res1 self._res_block(16) self.res2 self._res_block(32) self.res3 self._res_block(64) self.lstm1 tf.keras.layers.LSTM(64, return_sequencesTrue) self.lstm2 tf.keras.layers.LSTM(64) self.dense tf.keras.layers.Dense(201) def _res_block(self, filters): return tf.keras.Sequential([ tf.keras.layers.Conv2D(filters, 3, paddingsame), tf.keras.layers.BatchNormalization(), tf.keras.layers.ReLU(), tf.keras.layers.Conv2D(filters, 3, paddingsame), tf.keras.layers.Add(), tf.keras.layers.ReLU() ]) def call(self, x): x self.conv1(x) x self.res1(x) x self.res2(x) x self.res3(x) x tf.reduce_mean(x, axis[1,2]) # global pooling x tf.expand_dims(x, axis1) x self.lstm1(x) x self.lstm2(x) return self.dense(x) class BinaryParticleSwarm: def __init__(self, n_particles30, dim256, max_iter50, prob_flip0.1): self.pos np.random.randint(0, 2, (n_particles, dim)) self.vel np.random.rand(n_particles, dim) self.pbest self.pos.copy() self.pbest_fit np.zeros(n_particles) self.gbest None self.gbest_fit -np.inf self.prob_flip prob_flip def optimize(self, fitness_func): for it in range(self.max_iter): for i in range(self.n_particles): fit fitness_func(self.pos[i]) if fit self.pbest_fit[i]: self.pbest_fit[i] fit self.pbest[i] self.pos[i] if fit self.gbest_fit: self.gbest_fit fit self.gbest self.pos[i].copy() w 0.9 - 0.5*(it/self.max_iter) c1, c2 2.0, 2.0 r1, r2 np.random.rand(2, self.n_particles, self.dim) self.vel w*self.vel c1*r1*(self.pbest - self.pos) c2*r2*(self.gbest - self.pos) prob_sigmoid 1 / (1 np.exp(-self.vel)) self.pos (prob_sigmoid np.random.rand(self.n_particles, self.dim)).astype(int) if np.random.rand() self.prob_flip: flip_idx np.random.randint(0, self.dim) self.pos[:, flip_idx] 1 - self.pos[:, flip_idx] return self.gbest class StraightThroughEstimator(tf.keras.layers.Layer): def call(self, x): return tf.where(x 0, 1.0, 0.0) def get_config(self): return super().get_config()