Lumerical Mode 的电场分布数据导出到 Matlab 进行处理

本文介绍了如何在Lumerical中导出电场数据,并在Matlab中进行处理。首先,通过Lumerical脚本保存电场数据为Matlab的mat文件,然后在Matlab中读取数据,进行重排、计算和绘图,最后调整图像并导出矢量图。文章还提及了数据重排时可能遇到的问题。
摘要由CSDN通过智能技术生成

内容介绍

本文分为两部分:

  • 首先是 Lumerical 中如何导出数据
  • 然后是 Matlab 中如何对数据进行处理

Lumerical 部分

1. 运行 Lumerical 文件计算电场分布

  • calculate mode
  • 如图 Lumerical 中选中某个模式后会显示电场图,但像素较低且只能导出 jpg
    在这里插入图片描述

2. 保存 Lumerical 电场数据为 Matlab 的 mat 文件

可以采用脚本,如上图我们选择保存 mode5,脚本如下,直接在 Lumerical 中运行即可。
可以保存某个电场分量,也可以保存全部数据。

modename = 'mode5';
E = getresult(modename,'E');   # 保存全部电场数据
Ex = getresult(modename,'Ex'); # 保存x方向上的电场数据 
filename="ElectricField785";
matlabsave(filename,E,Ex); 

## 也可以先 copycard 到 d-card 之后保存
modename2 = 'mode_nir';
copydcard(modename,modename2);
Ex = getdata('::'+modename2,'Ex'); 

Matlab 部分

1. 数据读取并进行初步处理

以全部电场数据处理为例,单方向电场比较简单,可自行测试:

clear;clc;
% 读取数据
filename = 'ElectricField785.mat';  
load(filename); data = E;   Ex_dsave=Ex;
x = data.x;y = data.y;E = data.E;
% 重新排列
Nx = length(x);Ny = length(y);  
Nz = size(E, 1) / (Nx * Ny);
Ex = reshape(E(:, 1), Nx, Ny, Nz);  % x 分量
Ey = reshape(E(:, 2), Nx, Ny, Nz);  % y 分量
Ez = reshape(E(:, 3), Nx, Ny, Nz);  % z 分量 
% 总电场
E = (Ex.^2 + Ey.^2 + Ez.^2).^0.5;

% 要绘图的数据,这里我们以 Ex 为例,其实直接导出这个分量更方便
currentE = (real(Ex));  % 处理后就和直接从 Lumerical 保存的 Ex 数据一样了 
% 或者总电场 
%currentE = (real(E));

2. 绘制电场图

figure;        
f = pcolor(x*1e6,y*1e6,rot90(currentE,-1));     
set(f,'LineStyle','none');colorbar;colormap jet;axis equal;
axis([-2 2 -1 2])

在这里插入图片描述

3. 进一步调整图片字体等并导出矢量图

可以直接根据建模脚本绘制截面图

在这里插入图片描述


碰到的问题

1. 数据重排时出错

Ex = real( reshape(E(:, 1), Ny, Nx, Nz) );  
Ey = real( reshape(E(:, 2), Ny, Nx, Nz) );  
Ez = real( reshape(E(:, 3), Ny, Nx, Nz) );  

![在这里插入图片描述](https://img-blog.csdnimg.cn/30a2100cf397465083947ca17e8fc309.png

在这里插入图片描述

变分模态分解(Variational Mode Decomposition)是一种用于处理多个变量数据的信号分解方法。下面是使用MATLAB实现变分模态分解的代码: ```matlab % 假设我们有一个多个变量数据的矩阵X,其中每一列是一个变量的时间序列 % 假设矩阵X的大小为m行n列,m为时间点数,n为变量数 % 设置变分模态分解的参数 Tolerance = 1e-5; % 迭代精度 MaxIterations = 200; % 最大迭代次数 LaplacianRegularization = 0.01; % 拉普拉斯正则化参数 % 对每个变量进行变分模态分解 for i = 1:n x = X(:,i); % 获取第i个变量的时间序列 % 标准化数据 x = (x - mean(x)) / std(x); % 初始化 r = x; % 初始化残差 modes = []; % 初始化模态 % 迭代求解模态 for j = 1:MaxIterations % 计算数据的Hilbert变换 hx = hilbert(r); % 通过计算输入信号的Hilbert谱,得到每个模态的权重 spectrum = abs(hx); weights = 1 ./ (abs(spectrum) + Tolerance); % 构造拉普拉斯矩阵以满足正则化条件 Laplacian = spectralEmbedding(spectrum) + LaplacianRegularization * eye(m); % 求解拉普拉斯特征值问题,得到每个模态分量 [eigenVectors, eigenValues] = eig(Laplacian); eigenVectors = eigenVectors(:,1); mode = spectrum .* eigenVectors; % 更新残差 r = r - mode; % 判断收敛条件 if norm(mode) < Tolerance break; end % 存储模态 modes = [modes, mode]; end % 将计算得到的模态存储到矩阵中 Modes(:,i) = modes; end % 可以根据需要进一步分析和处理得到的模态 ``` 以上代码实现了对多个变量数据的变分模态分解,并将得到的模态存储在Modes矩阵中。可以根据需要进一步分析和处理得到的模态。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值