2023CUPT第四题彩色线思路与解法

Posted River Chandler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023CUPT第四题彩色线思路与解法相关的知识,希望对你有一定的参考价值。

  • 这是一道很彻底的光学题,可以参考
    • 5.7 振幅型平面透射光栅 光学(第三版)郭永康 主编 朱建华 副主编
  • CUPT前国赛队员倾情写作

英文题目

        When a compact disc or DVD is illuminated with light coming from a filament lamp in such a way that only rays with large angles of incidence are selected, a clear green line can be observed. The colour varies upon slightly changing the angle of the disc. Explain and investigate this phenomenon.

  • 不翻译了,搞物理的同学不需要别人的翻译

符号规定

符号

含义

D

观察点

S

光源

P

反射点

O

光盘的圆心

a

光盘刻槽宽度

𝑑

O点到SD的距离

𝑟

SP之间的距离

光盘中心环半径

𝛼

角SPD的一半

𝛽

光盘与

水平方向的夹角

理论推导01

装置示意图(由一美丽的工科女提供):

程序模拟

  • 先确认一些事情:
    • 你点赞,收藏没有?
    • 可见光的波长怎么样?
  • color = ["红光","橙光","黄光","绿光","青色","蓝光","紫光"]
  • color_wavelength = [[760*10**-9,622*10**-9],[622*10**-9,597*10**-9],\\

                    [597*10**-9,577*10**-9],[577*10**-9,492*10**-9],\\
                    [492*10**-9,450*10**-9],[450*10**-9,435*10**-9],\\
                    [435*10**-9,390*10**-9]]
 

源代码

import matplotlib.pyplot as plt
import numpy as np

import matplotlib
matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
matplotlib.rcParams["axes.unicode_minus"] = False

#120型号光盘
C = 1
a = 1.5 * 10**-6
N = int((120-15)* 10**-3/a)

alpha = 0.22    #(arccos alpha \\apx 30)
beta  = 0.32

plt.title("归一化前特定角度下观察到的可见光光强分布")

color = ["红光","橙光","黄光","绿光","青色","蓝光","紫光"]
color_wavelength = [[760*10**-9,622*10**-9],[622*10**-9,597*10**-9],\\
                    [597*10**-9,577*10**-9],[577*10**-9,492*10**-9],\\
                    [492*10**-9,450*10**-9],[450*10**-9,435*10**-9],\\
                    [435*10**-9,390*10**-9]]

for i in range(7):
    plt.scatter(color_wavelength[i],[0,0],c="black",s=3)
    plt.text(color_wavelength[i][0]*1/4+color_wavelength[i][1]*3/4,0,color[i],size=5)


Lambda = np.linspace(390*10**-9,780*10**-9,1000)
I = np.zeros(1000)
for i in range(1000):
    I[i] = C*np.sin((N+1)*np.pi*a*np.cos(beta)/Lambda[i]/np.cos(alpha))**2/np.sin(np.pi*a*np.cos(beta)/Lambda[i]/np.cos(alpha))**2

plt.plot(Lambda,I,label="alpha:"+str(round(alpha,2))+"beta:"+str(round(beta,2)),c="red")
plt.legend()
plt.show()

效果图 

  •  显然,我们认为,光强最强的地方,就是我们所见到的光盘衍射出的颜色。

理论02

  • 显然这是一个闪耀光栅,我们必须要考虑到这个什么分辨率,色散率,色分辨率的问题
  • 第一点,我们要看到这个闪耀波长的问题:
    • 在单槽衍射主极大方向上衍射光最强,在此方向上产生多槽干涉的主极大的光谱级次K:

  • 第二点,我们要看到从白光到分析这个哪个成分最强肯定是小有难度的

实验设计


  • 给大家讲个乐事,我还没有设计这个实验。。。哦,天啊 12月6号就要上交PPT啦!哈哈!
  • 那怎么设计呢?好问题,你看我们给出的公式(5),是不是很明显了。
    • 搞个CCD,放在一个圆形滑轨上
    • 给光盘放在一个可倾斜的平面上,让光盘可以做我们所给出的那种倾斜
    • 然后就测数据吧
  • 那还能怎么设计呢?
    • 你就用眼睛看呗。。还能咋地?
    • 我看到的就是这样,有种你现场复原来反驳我呗。。。。
    • 所以我觉得吧,CUPT的确挺没趣的

  • 说正经的
    • 实验,就是得去测量光的波长。
    • 问题来了,实验怎么做的?
  • 思路*2
    • 测量光的波长
      • 测量光的波长可以用光波测量仪
      • 光波测量仪的效果可能不太行,范围太广
    • 可以用分光谱仪器,但是效果都比较差,理论要求我们的 alpha 值尽可能小,掠射光的入射角尽可能大,所以我们至少得搞到一个什么电动马达带着传感器在我们自己拼接的轨道上运动,然后准确得测量。嗯,氪金佬+电子佬+技术佬可以考虑

  • 现象复现
    • 如果我们不能测量光的波长,那么可以根据我们的理论,改造这个仪器。
    • 我们将预测新的现象,怎么说呢,我们现在是可以改变两个参数,事实上,我们可以通过换光盘实现这个问题啊。比如说,这里有一些光盘参数:  

国标:

        CD光盘中两个相邻螺旋光道之间的间距为 1.5 微米

        DVD光盘中两个相邻螺旋光道之间的间距为 0.74 微米

120型光盘(内外径):15mm----120mm 

小型光盘(内外径):21mm----80mm 

  • 如果需要现象明显的话,我们只需要找到 不同光盘  相同的两个角参数 不同的反射光 即可说明


  • 其实这样依然是不严谨的,必须用CCD才能很好的说明这个问题

实验数据与验证

  • 按照CUPT的一般操作,你懂的。。。。
  • 其实,从统计学的角度来看,如果你的数据是通过取了一大堆平均之后得出的一个很合理的值,比如 预期(0.5) 实测(0.2,0.3,0.7,0.8),那么大概率是伪造的或者有操作错误的,为什么呢?
    • 概率论上不是写了嘛。。。有空我再写一个有关这个话题的文章
    • 其实同样的问题,也可用于诸多的实验课程。当然,我想很多老师并没发现这个问题

数据归一化处理

  • 其实这一步可做可不做,但是为了比分好看一点,最好还是做一下的
import matplotlib.pyplot as plt
from numba import jit
import numpy as np
import matplotlib
matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
matplotlib.rcParams["axes.unicode_minus"] = False

@jit
def fun120(alpha,beta,C=1,a = 1.5 * 10**-6):
    #120型号光盘
    N = int((120-15)* 10**-3/a)
    plt.title("归一化后特定角度下观察到的可见光光强分布")
    color = ["红光","橙光","黄光","绿光","青色","蓝光","紫光"]
    color_wavelength = [[760*10**-9,622*10**-9],[622*10**-9,597*10**-9],\\
                        [597*10**-9,577*10**-9],[577*10**-9,492*10**-9],\\
                        [492*10**-9,450*10**-9],[450*10**-9,435*10**-9],\\
                        [435*10**-9,390*10**-9]]
    for i in range(7):
        plt.scatter(color_wavelength[i],[0,0],c="black",s=3)
        plt.text(color_wavelength[i][0]*1/4+color_wavelength[i][1]*3/4,0,color[i],size=5)
    Lambda = np.linspace(390*10**-9,780*10**-9,1000)
    I = np.zeros(1000)
    for i in range(1000):
        I[i] = C*np.sin((N+1)*np.pi*a*np.cos(beta)/Lambda[i]/np.cos(alpha))**2/np.sin(np.pi*a*np.cos(beta)/Lambda[i]/np.cos(alpha))**2

    SUM = sum(I)
    I = [i/SUM for i in I]
    plt.plot(Lambda,I,label="alpha:"+str(round(alpha,2))+"beta:"+str(round(beta,2)),c="red")
    plt.legend()
    plt.pause(0.2)
    plt.cla()
    
if __name__ == "__main__":
    for i in np.linspace(0.1,0.8,40):
        for j in np.linspace(0.1,0.8,40):
            fun120(i,j)

效果

归一化光强 22年12月2日 CUPT

  • 效果是个动画
  • 其实也不是动画,matplotlib做动画其实挺方便的,但是我不想做
  • 话说,我挺想讲上两句的:
    • 第一呢,我有个好朋友,俏冤家
    • 第二呢,这个学期过得挺痛苦的,没意思
      • 基础学科竟然有考核,没意思 
    • 第三呢,我要去准备美赛啦,我希望能碰上偏微分方程优化的问题,我对这种数学问题挺敏感的,国家天元数学中心就是好!!!
      • 其实,统计问题我觉得我也可以
      • 我们的队伍很强的啦!!!
    • 第四呢,我要去打全国大学生电子设计大赛啦!
      • 提前顺利
    • 第五呢,雅思该考第一次喽。。
    • 第六呢,下学期有拓扑,呜呜。。。

LeedCode第四题:寻找两个有序数组的中位数

这里我有两种解法,第一种执行时间是157ms,通过两个for循环排序(有点多余)效率比较慢:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int i = 0;
        int j = 0;
        double res = 0;

        int[] nums3 = new int[len1 + len2];
        while (i < len1) {
            nums3[i] = nums1[i];
            i++;
        }

        while (j < len2) {
            nums3[len1] = nums2[j];
            len1++;
            j++;
        }

        int len3 = nums3.length;
        int temp = 0;
        for (int h = 0; h < len3; h++) {
            for (int k = 1; k < len3; k++) {
                if (nums3[k - 1] > nums3[k]) {
                    temp = nums3[k - 1];
                    nums3[k - 1] = nums3[k];
                    nums3[k] = temp;
                }
            }
        }
        if (len3 % 2 == 0) {
            int m = len3 / 2;
            res = (float)(nums3[m] + nums3[m - 1]) / 2;
        }
        if (len3 % 2 == 1) {
            int n = (len3 - 1) / 2;
            res = nums3[n];
        }
        return res;
    }
}

通过优化后的代码,执行时间是3ms,明显效率快很多:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int i = 0;
        int j = 0;
        double res = 0;

        int[] nums3 = new int[len1 + len2];

        int len3 = nums3.length;
        int temp = 0;
        while(i < len1 && j < len2) {
            if (nums1[i] < nums2[j]) {
                nums3[temp] = nums1[i];
                temp++;
                i++;
            }
            else {
                nums3[temp] = nums2[j];
                temp++;
                j++;
            }
        }
        while (i < len1) {
            nums3[temp] = nums1[i];
            temp++;
            i++;
        }
        while (j < len2) {
            nums3[temp] = nums2[j];
            temp++;
            j++;
        }

        if (len3 % 2 == 0) {
            int m = len3 / 2;
            res = (float)(nums3[m] + nums3[m - 1]) / 2;
        }
        if (len3 % 2 == 1) {
            int n = (len3 - 1) / 2;
            res = nums3[n];
        }
        return res;
    }
}

以上是关于2023CUPT第四题彩色线思路与解法的主要内容,如果未能解决你的问题,请参考以下文章

LeedCode第四题:寻找两个有序数组的中位数

数据结构二叉树相关面试题 Java版 LeetCode题 ------- 二叉树

美团笔试题2021.8.29(第四题求大佬解答)

动态规划:leetcode题库第四十四题

算法入门 02二分查找(简单 - 第四题)LeetCode 167

JZOJ_7.15C组第四题 城市统计