用matlab仿真平行光经过透镜聚焦后的光场分布

[复制链接]
匿名  发表于 2024-12-5 09:13:57 |阅读模式
用matlab仿真平行光经过透镜聚焦后的光场分布,提醒:使用傅里叶光学原理
回复

使用道具 举报

全部回复27 显示全部楼层
机器人Gpt 发表于 2024-12-5 09:14:35 | 显示全部楼层
要在 MATLAB 中仿真平行光经过透镜聚焦后的光场分布,我们可以使用傅里叶光学的原理来模拟这一过程。具体来说,我们可以使用透镜的传递函数和傅里叶变换来计算光场在焦平面上的分布。

以下是一个简单的 MATLAB 脚本示例,用于仿真这一过程:

  1. % 参数设置
  2. wavelength = 500e-9; % 波长(单位:米)
  3. focal_length = 0.1;  % 透镜焦距(单位:米)
  4. lens_diameter = 0.01; % 透镜直径(单位:米)
  5. N = 1024; % 采样点数
  6. L = 0.02; % 采样区域大小(单位:米)

  7. % 空间坐标系
  8. dx = L / N; % 采样间隔
  9. x = -L/2 : dx : L/2-dx;
  10. [X, Y] = meshgrid(x, x);

  11. % 初始平行光场
  12. U0 = ones(N); % 假定初始为均匀光场

  13. % 透镜传递函数
  14. k = 2 * pi / wavelength; % 波数
  15. H_lens = exp(-1i * k / (2 * focal_length) * (X.^2 + Y.^2));

  16. % 透镜后的光场
  17. U1 = U0 .* H_lens;

  18. % 傅里叶变换:计算光场在焦平面的分布
  19. U2 = fftshift(fft2(ifftshift(U1)));
  20. U2 = U2 / max(max(abs(U2))); % 归一化

  21. % 绘制结果
  22. intensity = abs(U2).^2; % 强度分布

  23. figure;
  24. imagesc(x, x, intensity);
  25. xlabel('x (m)');
  26. ylabel('y (m)');
  27. title('Focal Plane Intensity Distribution');
  28. colorbar;
  29. axis square;
复制代码


### 代码说明
- **参数设置**:定义了光的波长、透镜的焦距和直径以及采样点数。
- **空间坐标系**:创建用于模拟的空间坐标。
- **初始光场**:假设初始光场为均匀的平行光。
- **透镜传递函数**:根据透镜公式计算其对光场的影响。
- **傅里叶变换**:计算透镜后的光场经过傅里叶变换后的结果,得到焦平面处的光强分布。
- **绘制结果**:显示焦平面上的光强分布图。

通过调整参数,如焦距、波长和透镜直径,可以模拟不同条件下的光场分布。如果需要更复杂的模型或增加其他因素(如衍射效应),可以在此基础上进一步扩展。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2024-12-5 09:17:47
采用具有面型的实际透镜进行仿真,不要只是使用虚拟的焦距
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2024-12-5 09:18:29 | 显示全部楼层
wklnuli2024 发表于 2024-12-05 09:17
采用具有面型的实际透镜进行仿真,不要只是使用虚拟的 ...


要在 MATLAB 中仿真具备实际面型的透镜对平行光的聚焦效果,我们可以通过定义透镜的面型方程来实现。这种面型可以基于如球面或非球面公式。

以下是一个 MATLAB 脚本示例,模拟一个具有球面面型的透镜聚焦平行光的场景:

  1. % 参数设置
  2. wavelength = 500e-9; % 波长(单位:米)
  3. lens_radius = 0.005; % 透镜半径(单位:米)
  4. n_lens = 1.5;        % 透镜材料折射率
  5. N = 1024;            % 采样点数
  6. L = 0.01;            % 采样区域大小(单位:米)

  7. % 空间坐标系
  8. dx = L / N; % 采样间隔
  9. x = -L/2 : dx : L/2-dx;
  10. [X, Y] = meshgrid(x, x);
  11. R = sqrt(X.^2 + Y.^2);

  12. % 透镜的面型(例如,球面透镜)
  13. % z = sqrt(Rc^2 - R.^2) - (Rc - t)
  14. Rc = 0.01; % 曲率半径
  15. t = Rc * (1 - cos(asin(lens_radius / Rc))); % 中心厚度

  16. % 光程差
  17. z = sqrt(Rc^2 - R.^2) - (Rc - t);
  18. phase_shift = 2 * pi / wavelength * (n_lens - 1) * z;

  19. % 避免透镜外部的面引起不必要的相移
  20. phase_shift(R > lens_radius) = 0;

  21. % 初始平行光场
  22. U0 = ones(N); % 假定初始为均匀光场

  23. % 透镜的透过相位
  24. H_lens = exp(-1i * phase_shift);

  25. % 透镜后的光场
  26. U1 = U0 .* H_lens;

  27. % 傅里叶变换:计算光场在焦平面的分布
  28. U2 = fftshift(fft2(ifftshift(U1)));
  29. U2 = U2 / max(max(abs(U2))); % 归一化

  30. % 绘制结果
  31. intensity = abs(U2).^2; % 强度分布

  32. figure;
  33. imagesc(x, x, intensity);
  34. xlabel('x (m)');
  35. ylabel('y (m)');
  36. title('Focal Plane Intensity Distribution');
  37. colorbar;
  38. axis square;
复制代码


### 代码说明
- **透镜的面型**:使用球面透镜的公式定义了透镜的表面形状。您可以根据需要调整面型函数。
- **光程差**:基于透镜表面形状计算光程差,从而获得透镜对光的相位影响。
- **相移**:通过 `exp(-1i * phase_shift)` 计算透镜的相位传递函数。
- **傅里叶变换**:使用二维傅里叶变换计算透镜后的光场在远场平面(即焦平面)上的分布。

在这个模型中,假设透镜是理想的且均匀的。对于更复杂的透镜(如非球面透镜或包含色差和其他光学效应的透镜),需要调整透镜面型方程和相移计算。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2024-12-5 09:20:27
显示非焦平面位置的光场分布
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2024-12-5 09:21:07 | 显示全部楼层
wklnuli2024 发表于 2024-12-05 09:20
显示非焦平面位置的光场分布


要模拟非焦平面处的光场分布,我们可以利用角谱法(Angular Spectrum Method)或菲涅耳衍射公式。这里我们采用菲涅耳衍射方法来计算不同位置处的光场分布。

假设你想观察透镜后某一距离 \( z \) 处的光场分布,可以通过以下步骤来实现:

  1. % 参数设置
  2. wavelength = 500e-9; % 波长(单位:米)
  3. lens_radius = 0.005; % 透镜半径(单位:米)
  4. n_lens = 1.5;        % 透镜材料折射率
  5. N = 1024;            % 采样点数
  6. L = 0.01;            % 采样区域大小(单位:米)

  7. % 空间坐标系
  8. dx = L / N; % 采样间隔
  9. x = -L/2 : dx : L/2-dx;
  10. [X, Y] = meshgrid(x, x);
  11. R = sqrt(X.^2 + Y.^2);

  12. % 透镜的面型(例如,球面透镜)
  13. Rc = 0.01; % 曲率半径
  14. t = Rc * (1 - cos(asin(lens_radius / Rc))); % 中心厚度

  15. % 光程差
  16. z = sqrt(Rc^2 - R.^2) - (Rc - t);
  17. phase_shift = 2 * pi / wavelength * (n_lens - 1) * z;

  18. % 避免透镜外部的面引起不必要的相移
  19. phase_shift(R > lens_radius) = 0;

  20. % 初始平行光场
  21. U0 = ones(N); % 假定初始为均匀光场

  22. % 透镜的透过相位
  23. H_lens = exp(-1i * phase_shift);

  24. % 透镜后的光场
  25. U1 = U0 .* H_lens;

  26. % 非焦平面计算
  27. z_distance = 0.05; % 从透镜到观察平面的距离(单位:米)
  28. k = 2 * pi / wavelength; % 波数

  29. % 菲涅耳衍射近似
  30. Fresnel_factor = exp(1i * k / (2 * z_distance) * (X.^2 + Y.^2));
  31. U2 = fftshift(fft2(ifftshift(U1 .* Fresnel_factor)));
  32. U2 = U2 .* exp(1i * k * z_distance) / (1i * wavelength * z_distance); % 归一化

  33. % 绘制结果
  34. intensity = abs(U2).^2; % 强度分布

  35. figure;
  36. imagesc(x, x, intensity);
  37. xlabel('x (m)');
  38. ylabel('y (m)');
  39. title(['Intensity Distribution at z = ' num2str(z_distance) ' m']);
  40. colorbar;
  41. axis square;
复制代码


### 代码说明
- **菲涅耳衍射**:使用菲涅耳衍射近似模型,计算透镜后特定距离 \( z \) 处的光场。
- **传输函数**:`Fresnel_factor` 表示菲涅耳透镜的传递函数,它考虑离焦时的相位变化。
- **观察平面**:通过调整 `z_distance` 参数,你可以观察到不同位置处的光场分布。

这种方法可以用于分析在非焦平面上的光强变化,帮助理解透镜后的光束传播特性。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2024-12-5 09:25:23
结果好像不太对,我要的是离焦状态下的光场分布
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2024-12-5 09:26:06 | 显示全部楼层
wklnuli2024 发表于 2024-12-05 09:25
结果好像不太对,我要的是离焦状态下的光场分布 ...


为了更准确地模拟离焦状态下的光场分布,可以考虑使用基于菲涅耳衍射的模拟方法。我们将通过计算透镜后在离焦平面(不是焦点位置)上的光强分布来实现这一点。下面是基于菲涅耳衍射的方法说明和相应的 MATLAB 脚本:

  1. % 参数设置
  2. wavelength = 500e-9; % 波长(单位:米)
  3. lens_radius = 0.005; % 透镜半径(单位:米)
  4. n_lens = 1.5;        % 透镜材料折射率
  5. N = 1024;            % 采样点数
  6. L = 0.01;            % 采样区域大小(单位:米)

  7. % 空间坐标系
  8. dx = L / N; % 采样间隔
  9. x = -L/2 : dx : L/2-dx;
  10. [Y, X] = meshgrid(x, x);
  11. R = sqrt(X.^2 + Y.^2);

  12. % 透镜的面型(例如,球面透镜)
  13. Rc = 0.02; % 透镜曲率半径(单位:米)
  14. t = Rc * (1 - cos(asin(lens_radius / Rc))); % 中心厚度

  15. % 光程差
  16. z = sqrt(Rc^2 - R.^2) - (Rc - t);
  17. phase_shift = 2 * pi / wavelength * (n_lens - 1) * z;

  18. % 避免透镜外部的相移
  19. phase_shift(R > lens_radius) = 0;

  20. % 初始平行光场
  21. U0 = ones(N); % 假定初始为均匀光场

  22. % 透镜的透过相位
  23. H_lens = exp(-1i * phase_shift);

  24. % 透镜后的光场
  25. U1 = U0 .* H_lens;

  26. % 设置离焦距离
  27. z_distance = 0.05; % 从透镜到观察平面的距离(单位:米)
  28. k = 2 * pi / wavelength; % 波数

  29. % 菲涅耳衍射近似
  30. Fresnel_factor = exp(1i * k / (2 * z_distance) * (X.^2 + Y.^2));
  31. U2 = fftshift(fft2(ifftshift(U1))) .* Fresnel_factor;
  32. U2 = U2 .* exp(1i * k * z_distance) / (1i * wavelength * z_distance); % 归一化

  33. % 绘制结果
  34. intensity = abs(U2).^2; % 强度分布

  35. figure;
  36. imagesc(x, x, intensity);
  37. xlabel('x (m)');
  38. ylabel('y (m)');
  39. title(['Intensity Distribution at z = ', num2str(z_distance), ' m']);
  40. colorbar;
  41. axis square;
复制代码


### 代码解读:

1. **透镜面型和传递函数**:
   - 计算透镜的相移函数 `phase_shift`,考虑透镜内部的材料和几何形状。
   
2. **菲涅耳衍射近似**:
   - 使用菲涅耳衍射近似公式,包含来自初始平面到目标平面的传递函数,该函数描述了不同传播距离 \( z \) 的相位变化。
   
3. **离焦状态**:
   - 通过调整 `z_distance` 值,可以改变观察平面的位置,从而得到离焦状态的光场分布。
   
这段代码通过菲涅耳衍射模拟了光在非焦平面上的传播,展示了离焦光场的强度分布状况。可以通过改变 `z_distance` 来研究不同离焦距离下的光场特性。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2024-12-5 09:40:13
为什么我改变离焦距离后,光场分布不变?
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2024-12-5 09:40:32 | 显示全部楼层
wklnuli2024 发表于 2024-12-05 09:40
为什么我改变离焦距离后,光场分布不变? ...


如果在改变离焦距离后,光场分布没有变化,可能是因为代码在处理菲涅耳衍射时存在一些问题。让我们仔细检查一下计算步骤,并确保正确实现菲涅耳衍射的模拟。

在菲涅耳衍射的处理中,我们要考虑以下几个重要步骤:

1. **透镜相位因子**:确定透镜对入射波前的相位修改。
   
2. **角谱传播(Fresnel 传播)**:要在频域中进行适当的处理,考虑到不同的传播距离。

请看下面的 MATLAB 代码改进:

  1. % 参数设置
  2. wavelength = 500e-9; % 波长(单位:米)
  3. lens_radius = 0.005; % 透镜半径(单位:米)
  4. n_lens = 1.5;        % 透镜材料折射率
  5. N = 1024;            % 采样点数
  6. L = 0.01;            % 采样区域大小(单位:米)

  7. % 空间坐标系
  8. dx = L / N; % 采样间隔
  9. x = -L/2 : dx : L/2-dx;
  10. [X, Y] = meshgrid(x, x);
  11. R = sqrt(X.^2 + Y.^2);

  12. % 透镜的面型(例如,球面透镜)
  13. Rc = 0.02; % 曲率半径
  14. t = Rc * (1 - cos(asin(lens_radius / Rc))); % 中心厚度

  15. % 光程差
  16. z = sqrt(Rc^2 - R.^2) - (Rc - t);
  17. phase_shift = 2 * pi / wavelength * (n_lens - 1) * z;

  18. % 避免透镜外部的面引起不必要的相移
  19. phase_shift(R > lens_radius) = 0;

  20. % 初始平行光场
  21. U0 = ones(N); % 假定初始为均匀光场

  22. % 透镜的透过相位
  23. H_lens = exp(-1i * phase_shift);

  24. % 透镜后的光场
  25. U1 = U0 .* H_lens;

  26. % 设置离焦距离
  27. z_distance = 0.05; % 从透镜到观察平面的距离(单位:米)
  28. k = 2 * pi / wavelength; % 波数

  29. % 菲涅耳衍射近似
  30. Fresnel_factor = exp(1i * k / (2 * z_distance) * (X.^2 + Y.^2));
  31. U2 = fftshift(fft2(ifftshift(U1)));
  32. U2 = U2 .* Fresnel_factor;
  33. U2 = ifftshift(ifft2(fftshift(U2)));
  34. U2 = U2 * exp(1i * k * z_distance) / (1i * wavelength * z_distance); % 归一化

  35. % 绘制结果
  36. intensity = abs(U2).^2; % 强度分布

  37. figure;
  38. imagesc(x, x, intensity);
  39. xlabel('x (m)');
  40. ylabel('y (m)');
  41. title('Intensity Distribution at Off-focus Plane');
  42. colorbar;
  43. axis square;
复制代码


### 关键改动与说明

1. **频域转换和反变换**:
   - `fft2` 和 `ifft2` 用于在频域和空间域之间切换。
   - 通过 `fftshift` 和 `ifftshift` 保证傅里叶频谱中心对齐。

2. **传播因子**:
   - `Fresnel_factor` 应该正确地应用到频域的场分布上,之后通过逆傅里叶变换回到空间域。

3. **修正离焦距离的影响**:
   - 传播距离 `z_distance` 应该对相位产生显著影响。如果距离改变,`Fresnel_factor` 应更新,进而改变最终的光场分布。

通过这些调整,你应该可以观察到随离焦距离变化的光场分布。这种设置将更精确地模拟真实光学系统中离焦情况下的行为。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

123下一页
发帖

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    50
  • 回答

    6
  • 积分

    50
联系客服 关注微信 访问手机版 返回顶部 返回列表