[优秀案例] AI 写光学代码没有语法错误但是公式莫名其妙

[复制链接]
optkt 发表于 2023-6-11 10:41:12 | 显示全部楼层 |阅读模式
尝试一下用GPT写光学的代码,三个问题,分别对原生GPT3.5,和训练过的Ai提问


先说结论:

1 单透镜焦距
a. Trained: 弄反了最后一步公式的1/f,跟我们做题丢个符号差不多,8分。
b. GPT3.5:  用了另一套公式,也弄反了1/f.        5分


2 双胶合色差
a. Trained:  焦距公式算错了,丢了参数,最后的焦距比例算对了,4分
b. GPT3.5:  折射率公式算错了,丢了参数,最后算出了Vd,不是问题要求的,3分



3 迭代傅里叶
a. Trained:  抄的公式漏洞百出,结构OK   3分。
b. GPT3.5:  抄的公式漏洞百出,结构OK,稍微欠缺循环终止条件。2分。





汇总结论:训练过的都略胜一筹。但是都不能直接用,尤其是光学公式需要人工修改。结构没有大的问题。



第一关:单透镜焦距

问题:用matlab语言写一段代码,完成以下功能:计算单透镜焦距

1. Trained

问:用matlab语言写一段代码,完成以下功能:计算单透镜焦距



答:Sure, I can help you with that! Here's a code snippet in MATLAB to calculate the focal length of a single lens:


  1. <div>n1 = 1; % refractive index of medium 1
  2. n2 = 1.5; % refractive index of lens material
  3. R1 = 10; % radius of curvature of first surface
  4. R2 = -10; % radius of curvature of second surface
  5. d = 5; % thickness of lens
  6. f = (n2 - n1) * ((1/R1) - (1/R2) + ((n2 - n1) * d)/(n1 * n2 * R1 * R2)); % calculate focal length</div>
复制代码



You can adjust the values of n1, n2, R1, R2, and d to match the specifications of your lens. The calculated focal length will be stored in the variable f. Let me know if you have any questions!



扔matlab看一下



1. 没有语法错误
2. 结果看来搞反了焦距的1/f 与 f,其他的完全正确


2. GPT3.5






1. 没有语法错误
2. 它应该搞混了计算公式: % 1/f=1/u+1/v 。(f是焦距,u是物距,v是相距)。



第二关:双胶合色差

问题:请用python语言写一段代码,计算双胶合透镜的色差

注:这个问题问得不清楚,没指明什么色差,没指明入射光的起始条件。


1. Trained

问:请用python语言写一段代码,计算双胶合透镜的色差



答:Sure, I can help you with that! However, I need more information about the specific parameters of the doublet lens you are referring to. Can you provide me with the necessary input parameters such as the refractive indices and thicknesses of the lens elements?

这里它说我的问题不清楚,需要更多的参数。于是我让他随便填,自己定义。

问:请用python语言写一段代码,计算双胶合透镜的色差。如果缺什么符号,请自己定义,数值请随便写,不需要你真正运行,只需要表明意义即可。

答:Certainly! Here is an example code snippet that calculates the chromatic aberration of a doublet lens:

  1. <div># Define input parameters

  2. n1 = 1.5  # Refractive index of first lens element
  3. n2 = 1.6  # Refractive index of second lens element
  4. d1 = 5.0  # Thickness of first lens element
  5. d2 = 3.0  # Thickness of second lens element
  6. lambda_c = 0.55  # Design wavelength

  7. # Calculate focal lengths at design wavelength
  8. f1 = (n1 - 1) * (1 / d1 - 1 / (d1 + d2)) / lambda_c
  9. f2 = (n2 - 1) * (1 / d2 - 1 / (d1 + d2)) / lambda_c
  10. f = f1 + f2

  11. # Calculate focal lengths at two other wavelengths
  12. lambda_f1 = 0.45  # First wavelength
  13. lambda_f2 = 0.65  # Second wavelength
  14. f1_prime = (n1 - 1) * (1 / d1 - 1 / (d1 + d2)) / lambda_f1
  15. f2_prime = (n2 - 1) * (1 / d2 - 1 / (d1 + d2)) / lambda_f2
  16. f_prime = f1_prime + f2_prime

  17. # Calculate chromatic aberration
  18. CA = (f_prime - f) / f

  19. print("Chromatic aberration: ", CA)</div>
复制代码


In this code, we first define the refractive indices and thicknesses of the two lens elements, as well as the design wavelength. We then use these parameters to calculate the focal lengths of the lens at the design wavelength, as well as at two other wavelengths. Finally, we calculate the chromatic aberration of the lens by taking the difference between the focal lengths at the two other wavelengths and the design wavelength, and dividing by the focal length at the design wavelength.



扔到python看下:
  1. Chromatic aberration:  -0.06706114398422089

  2. 进程已结束,退出代码0
复制代码



1. 没有语法错误
2. 结果:公式不知道哪里来的,算了两个焦距之差,貌似是求了两个焦距误差的百分比,这一步看起来对。但是求焦距的不对,没有半径。

3. 能检测到参数不足,提醒补足后能生成


2. GPT3.5

问:请用python语言写一段代码,计算双胶合透镜的色差

答:

以下是python代码,计算双胶合透镜的色差:


  1. <div># 导入所需的库
  2. import numpy as np

  3. # 定义透镜曲率半径 r1, r2 和 r3(单位:米)
  4. r1 = 0.02
  5. r2 = -0.02
  6. r3 = 0.05

  7. # 定义透镜介质折射率 n(无单位)
  8. n = 1.5

  9. # 定义Abbe数 vd(无单位)
  10. vd = 50

  11. # 计算透镜折射率 nf(无单位)
  12. ns = n - 1
  13. nf = n + (vd / 1000) * ns

  14. # 定义三种色光(红、绿、蓝)波长值(单位:纳米)
  15. lambda_r = 656
  16. lambda_g = 546
  17. lambda_b = 436

  18. # 计算三种色光在透镜中的色散率 φ(单位:m^-1)
  19. phi_r = nf - 1 / ((r1 + r3) * nf + r2 * n * (nf - n) / (n * nf))
  20. phi_g = nf - 1 / ((r1 + r3) * nf + r2 * n * (nf - n) / (n * nf)) + (nf - 1) * (1 / lambda_g - 1 / lambda_r)
  21. phi_b = nf - 1 / ((r1 + r3) * nf + r2 * n * (nf - n) / (n * nf)) + (nf - 1) * (1 / lambda_b - 1 / lambda_r)

  22. # 计算透镜的综合色差 Vd(单位:m^-1)
  23. Vd = (phi_g - phi_r)/(phi_b - phi_r)

  24. print("双胶合透镜的色差Vd为:", Vd)</div>
复制代码



扔python:



1. 没有语法错误
2. 结果:同样公式不知道哪里来的,算了两个所谓的色散率之差,通过这两个色散率之差算出了Vd阿贝数,奇怪。前面的公式用了三个波长,一顿输出,看不懂。也丢了一个参数,不过丢的是d,看来卧龙凤雏的俩










第三关:迭代傅里叶

问题:请用matlab写一段代码实现二维全息图的标准傅里叶迭代算法,不要任何改进,符号、数值请自定义,写好注释即可。

注:这个问题是修正过多,加了限制条件,原因见后文。

1. Trained



问:请用matlab写一段代码实现二维全息图的标准傅里叶迭代算法,不要任何改进,符号、数值请自定义,写好注释即可。


答:

Of course, I can provide an example code for the standard Fourier Iteration algorithm in MATLAB for 2D holography. Here it is:


  1. <div>% Standard Fourier Iteration algorithm for 2D holography
  2. % to reconstruct an object from its hologram
  3. % using the scalar diffraction theory

  4. % Define the hologram and the reference wave
  5. H = rand(256); % hologram
  6. A = ones(256); % amplitude of the reference wave
  7. phi = zeros(256); % phase of the reference wave

  8. % Set the wavelength and the distance between the object and the hologram
  9. lambda = 632.8e-9; % in meters
  10. z = 0.1; % in meters

  11. % Compute the Fourier transform of the hologram and the reference wave
  12. H_hat = fft2(H);   %【注: 目标面振幅】
  13. A_hat = fft2(A);   
  14. phi_hat = fft2(phi);

  15. % Compute the transfer function of the holographic system
  16. kx = 2*pi*(0:255)/256;
  17. ky = 2*pi*(0:255)/256;
  18. [Kx, Ky] = meshgrid(kx, ky);
  19. K = sqrt(Kx.^2 + Ky.^2);
  20. T_hat = exp(1i*z*sqrt((2*pi/lambda)^2 - K.^2));  %【注: 公式本身是对的,挺厉害】

  21. % Set the initial guess for the object wave
  22. U0 = ones(256);    %【注: 光源振幅】

  23. % Set the maximum number of iterations and the tolerance
  24. max_iter = 1000;
  25. tol = 1e-6;

  26. % Start the Fourier Iteration algorithm
  27. for iter = 1:max_iter
  28.     % Compute the Fourier transform of the object wave
  29.     U0_hat = fft2(U0);  %【注:  这里为正向传播】
  30.    
  31.     % Compute the product of the object wave and the transfer function
  32.     U_hat = H_hat .* conj(A_hat .* exp(1i*phi_hat) .* T_hat) ./ (abs(A_hat .* exp(1i*phi_hat) .* T_hat).^2 + eps);  %【注:  这里为正向传播,但是不知道哪里抄的公式,貌似与上文的T_hat 对应,已经乱了,能看到提取振幅的影子】
  33.    
  34.     % Compute the inverse Fourier transform of the product
  35.     U = real(ifft2(U_hat)); %【注:  这里应该提取相位】
  36.    
  37.     % Compute the error between the current and previous iterations
  38.     err = norm(U - U0);  %【注:  这里应该将像面误差作为err,然后再求个方差什么的,漏了】
  39.    
  40.     % Update the object wave
  41.     U0 = U; %【注:  漏了新相位】
  42.    
  43.     % Check if the error is smaller than the tolerance %【注: 这个控制语句像模像样】
  44.     if err < tol  
  45.         break;
  46.     end
  47. end

  48. % Display the reconstructed object
  49. figure;
  50. imagesc(abs(U));
  51. colormap(gray);
  52. axis image;
  53. title('Reconstructed object');</div>
复制代码



In this example, a random hologram H and a reference wave with unity amplitude and zero phase are defined. The wavelength lambda and the distance z between the object and the hologram are also defined. The Fourier transform of the hologram and the reference wave are computed using the 2D FFT function fft2. The transfer function of the holographic system is computed


结论:
1. 没有实际跑,忽略绘图语句
2. 能看见迭代循环
3. 公式千疮百孔
4. 离使用比较远






2. GPT3.5



问:请用matlab写一段代码实现二维全息图的标准傅里叶迭代算法,不要任何改进,符号、数值请自定义,写好注释即可。


答:


以下是matlab代码实现二维全息图的标准傅里叶迭代算法:



  1. <div>%% 二维全息图的标准傅里叶迭代算法实现
  2. clc; clear; close all;

  3. % 数据初始化
  4. Nx = 512;   % 空间X方向离散化点数
  5. Ny = 512;   % 空间Y方向离散化点数
  6. N = 50;     % 迭代次数
  7. dx = 10e-6; % 空间X方向长度
  8. dy = 10e-6; % 空间Y方向长度
  9. wavelength = 632.8e-9;  % 波长
  10. k = 2*pi/wavelength;    % 波数
  11. z = 100e-3;     % 全息图距离
  12. zp = 300e-3;    % 初像面距离
  13. zp2 = 500e-3;   % 最终像面距离

  14. % 定义光学元件参数
  15. deltax = dx/Nx;
  16. deltay = dy/Ny;
  17. x = (-Nx/2:Nx/2-1)*deltax;
  18. y = (-Ny/2:Ny/2-1)*deltay;
  19. [X, Y] = meshgrid(x, y);
  20. H = exp(1i*k*z).*exp(-1i*pi/(wavelength*z).*(X.^2 + Y.^2)); % 全息图矩阵

  21. % 定义初始解向量并展示全息图
  22. u0 = ones(Nx,Ny);
  23. figure,imshow(real(H),[]),title('全息图');

  24. % 定义迭代更新过程
  25. for i = 1:N
  26.     U = fftshift(fft2(u0));     % 二维傅里叶变换
  27.     V = U.*H./abs(H);           % 乘上振幅因子和相位因子
  28.     u = ifft2(ifftshift(V));    % 二维傅里叶反变换
  29.     u0 = u;                     % 更新解向量
  30. end

  31. % 展示初像面和最终像面的图像
  32. figure,imshow(real(u0),[]),title('初像面图像');
  33. u1 = FresnelPropagation(u0, dx, dy, zp, wavelength);    % 初像面到最终像面的传播过程
  34. figure,imshow(real(u1),[]),title('最终像面图像');

  35. % 定义Fresnel传播过程的函数
  36. function [U] = FresnelPropagation(U, dx, dy, z, wavelength)

  37. [ky,kx] = meshgrid(-pi/dy:2*pi/((size(U, 1)-1)*dy):pi/dy, -pi/dx:2*pi/((size(U, 2)-1)*dx):pi/dx);
  38. kSquared = kx.^2 + ky.^2;

  39. H = exp(1i*pi*wavelength*z*kSquared);

  40. U = ifft2(ifftshift(H.*fftshift(fft2(U))));
  41. end</div>
复制代码


其中,定义了光学元件参数,包括空间离散化点数、长度,波长和波数,全息图矩阵H;通过迭代的方式,对全息图进行初始的信号重构;通过Fresnel传播模型,将重构后的图像传到初像面,再将初像面的图像传到最终像面,最终显示最终像面的图像。代码中采用了Fresnel传播过程的函数,在函数中先通过傅里叶变换对解向量进行频域变化,再乘以传输函数,得到了传播后的解向量在频域的表示,最后通过傅里叶反变换还原出在空间域的解向量





结论:
1. 没有实际跑,忽略绘图语句

2. 能看见迭代循环
3. 公式简洁一些,默认振幅为1,没有终止语句,竟然写了个正向传输的函数,但是在循环中未见调用。同时如果封装函数,反向传输也会成对的出现,没有抄到
4. 太过简单,公式也是缺失,离使用更远一些。



PK结束


虽然一个都不能直接用,但是他们抄代码能力还是有的,结构可以搞对,公式细节还是得人来判断。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 手机动态码快速登录

×
网站管理员,微信:AlphaHL
回复

使用道具 举报

全部回复0 显示全部楼层
暂无回复,精彩从你开始!

快速回帖

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

本版积分规则

关于楼主

管理员
  • 主题

    528
  • 回答

    142
  • 积分

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