微透镜matlab

[复制链接]
匿名  发表于 3 天前 |阅读模式
修改下面这个代码

% MATLAB script to simulate a microlens array

% Parameters
microlens_diameter = 50e-6;  % 50 micrometers
microlens_spacing = 10e-6;   % 10 micrometers
focal_length = 300e-6;       % 300 micrometers
curvature_radius = 2.1e-6;   % 2.1 micrometers
wavelength = 1000e-9;        % 1000 nm
array_size = 64;             % 64x64 microlens array
points_per_lens = 100;       % Sampling points per microlens

% Create mesh grid for the shape of a single microlens
[x, y] = meshgrid(linspace(-microlens_diameter/2, microlens_diameter/2, points_per_lens));

% Calculate the surface profile of a single microlens
R = curvature_radius;
z_single = R - sqrt(R^2 - x.^2 - y.^2);
z_single(x.^2 + y.^2 > (microlens_diameter/2)^2) = 0; % Mask out areas outside the lens

% Initialize the entire microlens array
z_array = zeros(points_per_lens * array_size, points_per_lens * array_size);

% Fill the microlens array with repeated patterns
for i = 0array_size-1)
    for j = 0array_size-1)
        x_offset = i * points_per_lens;
        y_offset = j * points_per_lens;
        z_array(x_offset+1:x_offset+points_per_lens, y_offset+1:y_offset+points_per_lens) = ...
            max(z_array(x_offset+1:x_offset+points_per_lens, y_offset+1:y_offset+points_per_lens), z_single);
    end
end

% Plot microlens array surface
figure;
surf(linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
              array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
     linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
              array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
     z_array * 1e6);

title('Microlens Array Surface Profile');
xlabel('X (micrometers)');
ylabel('Y (micrometers)');
zlabel('Height (micrometers)');
shading interp;
axis equal tight;
colormap jet;
view(3);

% Simulate the diffraction pattern at the focal plane
k = 2*pi / wavelength;
[X, Y] = meshgrid(linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
                           array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens));
lens_phase = exp(-1j * k/(2*focal_length) * (X.^2 + Y.^2));
field_at_lens = lens_phase .* exp(-1j*k*z_array); % Initial field passing through the lens

% FFT to compute the field at the focal plane
Eout = fftshift(fft2(ifftshift(field_at_lens)));
intensity_pattern = abs(Eout).^2;

% Normalize intensity
intensity_pattern = intensity_pattern / max(intensity_pattern();

% Plot intensity pattern at the focal plane
figure;
imagesc(linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
                 array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
        linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
                 array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
        intensity_pattern);
title('Intensity Pattern at Focal Plane');
xlabel('X (micrometers)');
ylabel('Y (micrometers)');
colormap hot;
colorbar;
axis equal tight;

出现的问题是>> array
错误使用 surf (line 71)
X、Y、Z 和 C 不能是复数。

出错 array (line 35)
surf(linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...

回复

使用道具 举报

全部回复1 显示全部楼层
机器人Gpt 发表于 3 天前 | 显示全部楼层
在你的代码中,`z_array` 可能包含了复数导致 `surf` 函数出错。`z_array` 应该是一个实数数组。这个问题通常出现在计算复杂的相位或其他涉及到指数或者平方根的运算时。由于 MATLAB 在处理复杂数学运算时,可能会产生很小的虚部值。

以下是可以检查和解决这个问题的方法:

1. **确保`z_array`的内容是实数**:在计算 `z_single` 或 `z_array` 的时候,可以使用 `real` 函数强制转换为实数部分。

2. **复数的可能原因**:在你的代码中 `z_single = R - sqrt(R^2 - x.^2 - y.^2);` 可能会生成复数值。需要确保 `R^2 - x.^2 - y.^2` 是非负值。

3. **处理非常小的虚部**:如果是非常小的虚数部分引起的问题,可以直接舍掉,通过 `real(z_array)` 获得。

下面是修改过的代码片段:

  1. % Calculate the surface profile of a single microlens
  2. R = curvature_radius;
  3. z_single = R - sqrt(max(0, R^2 - x.^2 - y.^2));  % Use max to ensure non-negative inside sqrt
  4. z_single(x.^2 + y.^2 > (microlens_diameter/2)^2) = 0; % Mask out areas outside the lens

  5. % Initialize the entire microlens array
  6. z_array = zeros(points_per_lens * array_size, points_per_lens * array_size);

  7. % Fill the microlens array with repeated patterns
  8. for i = 0:(array_size-1)
  9.     for j = 0:(array_size-1)
  10.         x_offset = i * points_per_lens;
  11.         y_offset = j * points_per_lens;
  12.         z_array(x_offset+1:x_offset+points_per_lens, y_offset+1:y_offset+points_per_lens) = ...
  13.             max(z_array(x_offset+1:x_offset+points_per_lens, y_offset+1:y_offset+points_per_lens), z_single);
  14.     end
  15. end

  16. % Ensure z_array is real
  17. z_array = real(z_array);

  18. % Plot microlens array surface
  19. figure;
  20. surf(linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
  21.               array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
  22.      linspace(-array_size*(microlens_diameter+microlens_spacing)/2, ...
  23.               array_size*(microlens_diameter+microlens_spacing)/2, array_size*points_per_lens) * 1e6, ...
  24.      z_array * 1e6);
复制代码


这些修改应能解决 `surf` 函数错误的问题。如果问题依然存在,可以进一步检查每个步骤中的结果以确保所有变量都是预期的实数类型。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

快速回帖

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

本版积分规则

关于楼主

匿名用户组
  • 主题

    36
  • 回答

    4
  • 积分

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