请作出接收光强与夹角φ曲线(请作点线图)、接收光强与cos2φ的关系图(请作散点图,并进行线性拟合获...
Creato il: 11 aprile 2025
Creato il: 11 aprile 2025
请作出接收光强与夹角φ曲线(请作点线图)、接收光强与cos2φ的关系图(请作散点图,并进行线性拟合获得线性关系和相关系数),验证马吕斯定律。
请作出接收光强与夹角φ曲线(请作点线图)、接收光强与cos2φ的关系图(请作散点图,并进行线性拟合获得线性关系和相关系数),验证马吕斯定律。
下面给出一个示例流程,演示如何在 Python 中根据实验数据绘制并验证马吕斯定律(Malus’ Law:)。此示例包含以下步骤:
准备实验数据:
绘制接收光强与夹角 的关系曲线(点线图)。
绘制接收光强与 的关系图(散点图),并进行线性拟合得到拟合直线和相关系数。
分析结果,判断是否符合马吕斯定律。
下面的示例代码仅用一些“假设数据”演示操作流程,您可替换为实际实验数据。请根据真实数据的范围和数量进行调整。
pythonimport numpy as np import matplotlib.pyplot as plt # ---------------------------- # 1. 准备实验数据(示例) # ---------------------------- # 假设我们测量到 6 组角度(°)及对应光强(仅为演示) phi = np.array([0, 15, 30, 45, 60, 75, 90]) # 夹角,单位:度 I_measured = np.array([10.0, 9.2, 7.5, 5.0, 2.8, 1.2, 0.3]) # 对应光强 # 计算 cos^2(phi),注意角度需转换为弧度 cos2phi = np.cos(np.deg2rad(phi))**2 # ---------------------------- # 2. 绘制 I - φ 关系图(点线图) # ---------------------------- plt.figure(figsize=(6,4)) plt.plot(phi, I_measured, marker='o') # 使用 marker='o' 表示点,plot会连接线 plt.title("接收光强 I 与夹角 φ 的关系") plt.xlabel("夹角 φ (°)") plt.ylabel("光强 I") plt.grid(True) plt.show() # ---------------------------- # 3. 绘制 I - cos^2(phi) 散点图,并进行线性拟合 # ---------------------------- # 线性拟合:I = a * cos^2(phi) + b coeffs = np.polyfit(cos2phi, I_measured, 1) # polyfit(x, y, 拟合阶数) a, b = coeffs # 线性拟合结果:y = a*x + b # 计算拟合曲线上的值,用于绘制回归线 I_fit = a * cos2phi + b # 计算皮尔逊相关系数 r r_matrix = np.corrcoef(cos2phi, I_measured) r = r_matrix[0, 1] R_squared = r**2 # 或者也可通过其他方式取得 R^2 plt.figure(figsize=(6,4)) plt.scatter(cos2phi, I_measured, label="实验数据") # 散点图 plt.plot(cos2phi, I_fit, label="线性拟合", linewidth=1.5) plt.title("接收光强 I 与 cos^2(φ) 的关系") plt.xlabel("cos^2(φ)") plt.ylabel("光强 I") plt.grid(True) plt.legend() plt.show() # ---------------------------- # 4. 输出拟合结果与分析 # ---------------------------- print("线性拟合方程: I = a * cos^2(φ) + b") print(f"拟合得到 a = {a:.4f}, b = {b:.4f}") print(f"皮尔逊相关系数 r = {r:.4f}") print(f"决定系数 R^2 = {R_squared:.4f}") # ---------------------------- # 结果分析: # 如果马吕斯定律成立,则: # 1. 拟合直线应接近 I = a * cos^2(φ),且 b ~ 0; # 2. 相关系数 r (或 R^2) 越接近 1,说明线性相关度越高。 # ----------------------------
点线图(I-φ)
plt.plot()
并指定 marker='o'
可以绘制带数据点的折线图,横坐标为 ,纵坐标为测得的强度 。np.deg2rad(phi)
进行转换)。散点图(I-cos^2φ)与线性拟合
plt.scatter()
绘制实验数据的散点。np.polyfit(x, y, 1)
对数据做线性拟合;返回的 a, b
即线性方程 的系数。相关系数与决定系数
np.corrcoef(x, y)
可以得到皮尔逊相关系数矩阵,其中 [0,1]
元素即为相关系数 。验证马吕斯定律
通过以上步骤即可在实验中验证马吕斯定律。如果您的实际数据量更大、分辨率更高,按照相同流程处理并绘图即可。建议根据实验需要在合适的范围内采样足够数量的 ,以获得更平滑、更准确的结果。
下面给出一个示例 Python 脚本,直接使用您表格中的实验数据,绘制:
从而验证马吕斯定律 。您只需将以下代码保存为 .py
文件并运行(确保安装好 numpy
和 matplotlib
)即可得到两幅图和拟合结果。
pythonimport numpy as np import matplotlib.pyplot as plt # ------------------------------------------------ # 1. 输入实验数据(角度 φ,cos^2φ,对应光强 I) # 下面直接根据您给出的表格数据填入 # ------------------------------------------------ phi = np.array([ 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100, 110, 120, 130, 140, 150, 160, 170, 180, 185, 190, 200, 210, 220, 230, 240, 250, 260, 270, 275, 280, 290, 300, 310, 320, 330, 340, 350, 355, 360 ]) cos2phi = np.array([ 1.000, 0.992, 0.970, 0.883, 0.750, 0.587, 0.413, 0.250, 0.117, 0.030, 0.000, 0.008, 0.030, 0.117, 0.250, 0.413, 0.587, 0.750, 0.883, 0.970, 1.000, 0.992, 0.970, 0.883, 0.750, 0.587, 0.413, 0.250, 0.117, 0.030, 0.000, 0.008, 0.030, 0.117, 0.250, 0.413, 0.587, 0.750, 0.883, 0.970, 0.992, 1.000 ]) I_mW = np.array([ 0.789, 0.770, 0.749, 0.619, 0.469, 0.296, 0.160, 0.068, 0.028, 0.016, 0.014, 0.015, 0.016, 0.021, 0.055, 0.129, 0.235, 0.401, 0.585, 0.724, 0.775, 0.761, 0.742, 0.633, 0.468, 0.300, 0.179, 0.077, 0.030, 0.016, 0.014, 0.015, 0.020, 0.024, 0.052, 0.137, 0.270, 0.753, 0.170, 0.678, 0.726, 0.782 ]) # ------------------------------------------------ # 2. 绘制 接收光强 I 与夹角 φ 的关系(点线图) # ------------------------------------------------ plt.figure(figsize=(6,4)) plt.plot(phi, I_mW, marker='o', linestyle='-') # 点线图 plt.title("接收光强 I 与夹角 φ 的关系") plt.xlabel("夹角 φ (°)") plt.ylabel("光强 I (mW)") plt.grid(True) plt.tight_layout() plt.show() # ------------------------------------------------ # 3. 绘制 接收光强 I 与 cos^2φ 的关系(散点图+线性拟合) # 拟合模型:I = a * cos^2φ + b # ------------------------------------------------ # (a)散点图 plt.figure(figsize=(6,4)) plt.scatter(cos2phi, I_mW, label="实验测量点", color="blue") # (b)做线性拟合 coeffs = np.polyfit(cos2phi, I_mW, 1) # 一次多项式拟合 a, b = coeffs # I = a*cos^2φ + b I_fit = a * cos2phi + b # (c)绘制拟合直线 x_fit = np.linspace(min(cos2phi), max(cos2phi), 100) y_fit = a * x_fit + b plt.plot(x_fit, y_fit, label="线性拟合", color="red") # (d)绘图细节 plt.title("接收光强 I 与 cos^2(φ) 的关系") plt.xlabel("cos^2(φ)") plt.ylabel("光强 I (mW)") plt.grid(True) plt.legend() plt.tight_layout() plt.show() # ------------------------------------------------ # 4. 计算并输出拟合结果和相关系数 # ------------------------------------------------ # 皮尔逊相关系数 r_matrix = np.corrcoef(cos2phi, I_mW) r = r_matrix[0, 1] R_squared = r**2 print("===== 拟合结果 =====") print(f"线性方程: I = a * cos^2(φ) + b") print(f"a = {a:.4f}, b = {b:.4f}") print(f"相关系数 r = {r:.4f}") print(f"决定系数 R^2 = {R_squared:.4f}") # ------------------------------------------------ # 5. 结果分析(原理简述) # ------------------------------------------------ # 若马吕斯定律 (I = I_0 cos^2φ) 成立,则: # 1) 截距 b 应非常接近 0 # 2) 斜率 a 接近 I_0 # 3) 相关系数 r 或者 R^2 越接近 1,说明实验数据与理想关系越吻合
如何运行
malus_law.py
(或其他合适的文件名),确保本地安装有 numpy
和 matplotlib
,然后在命令行执行:
bashpython malus_law.py
马吕斯定律验证
可选项
.csv
文件,用 numpy.loadtxt()
或 pandas.read_csv()
等方式读取。以上即为完整演示。将实际测得的表格数据替换进数组(如上操作)后,您就能得到与实验情形对应的马吕斯定律验证图像和相关系数,从而判断实验的可靠性。祝实验顺利!
安装 numpy 和 matplotlib.pyplot 命令行
如果您使用的是 Python 官方环境(如在终端或 CMD 中直接使用 python
命令),通常可以通过 pip
安装:
bash# 安装 NumPy pip install numpy # 安装 Matplotlib pip install matplotlib
在某些情况下,您需要根据系统配置使用以下方式之一:
Windows 下:
python
命令,可能需要执行:
bashpython -m pip install numpy python -m pip install matplotlib
Linux 或 macOS 下:
python3 -m pip
的方式,以避免 Python 2/3 混淆:
bashpython3 -m pip install numpy python3 -m pip install matplotlib
Anaconda 或 Miniconda 环境:
conda install
:
bashconda install numpy matplotlib
安装完成后,用 python -c "import numpy; import matplotlib"
测试一下是否能够正常导入。如无错误,即表示安装成功。
中文无法正确显示怎么办
在 Python/Matplotlib 环境下,如果您在图表中显示中文文字(如标题、坐标轴标签等)时出现乱码或方块,一般是由于系统默认字体里缺少对中文的支持,或者 Matplotlib 使用的字体不包含中文字符所致。下面介绍常用的几种解决方法:
安装好字体后,Matplotlib 需要知道要使用哪一个字体才能正确显示中文。例如,使用黑体(SimHei)可以这样设置:
pythonimport matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置默认字体为黑体 matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
放在脚本最前面即可。以后就能在图上正常显示中文了。
注意:
font.sans-serif
是 Matplotlib 寻找无衬线字体(sans-serif)时的列表,里面写了'SimHei'
,就会优先使用黑体,如果未安装该字体,则可能无效。axes.unicode_minus = False
可以保证坐标轴中的负号(-)正确显示,而不会变成方块或乱码。
如果系统缺少中文字体,或者您想使用特定的中文字体(例如从网上下载的 TrueType 字体 .ttf 文件),可以手动指定字体路径。例如:
pythonimport matplotlib import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties # 指定自定义字体路径 myfont = FontProperties(fname='/path/to/SimHei.ttf') plt.title("测试中文", fontproperties=myfont) plt.xlabel("横轴", fontproperties=myfont) plt.ylabel("纵轴", fontproperties=myfont) plt.show()
这样可以在不修改全局 rcParams 的情况下,只对局部文本设置中文字体。
如果想全局统一地修改字体设置,除了在脚本开头用 rcParams
也可以在 Matplotlib 的配置文件 matplotlibrc
中修改,找到 font.sans-serif
和 axes.unicode_minus
对应的行,改为:
textfont.sans-serif : SimHei axes.unicode_minus : False
不同操作系统中 matplotlibrc
的默认位置可能不一样,可通过下列命令查看配置文件位置:
pythonimport matplotlib print(matplotlib.matplotlib_fname())
在代码开头尝试输出当前 Matplotlib 版本与默认字体设置:
pythonimport matplotlib print(matplotlib.__version__) print(matplotlib.rcParams['font.sans-serif'])
确保当前操作系统中安装了对应字体,并且名字拼写正确。
如果仍无法正常显示中文,可能需要重启 Python 环境/IDE 让修改生效。
以下是一段最简示例,演示如何快速解决中文显示:
pythonimport matplotlib import matplotlib.pyplot as plt # 指定黑体 SimHei 作为默认字体;关闭负号的 Unicode 默认行为 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams['axes.unicode_minus'] = False plt.title("这是中文标题") plt.xlabel("这是 x 轴标签") plt.ylabel("这是 y 轴标签") plt.show()
若系统自带 “SimHei” 字体,这段代码将正确显示中文。
SimHei
),并告知 Matplotlib 使用它进行绘图。pythonmatplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams['axes.unicode_minus'] = False
macos 下设置什么字体
在 macOS 下,系统自带了一些中文字体可用,例如:
其中 PingFang SC 通常是系统默认的中文界面字体,可以直接在 Matplotlib 的 rcParams
中指定它。示例如下:
pythonimport matplotlib import matplotlib.pyplot as plt # 指定苹方简体 PingFang SC 作为无衬线字体 matplotlib.rcParams['font.sans-serif'] = ['PingFang SC'] # 防止坐标轴负号显示为方块 matplotlib.rcParams['axes.unicode_minus'] = False plt.title("测试中文标题") plt.xlabel("这是 X 轴") plt.ylabel("这是 Y 轴") plt.show()
如果发现“PingFang SC”无效,可以改用 Heiti SC 或者 Songti SC 等。比如:
pythonmatplotlib.rcParams['font.sans-serif'] = ['Heiti SC']
或者
pythonmatplotlib.rcParams['font.sans-serif'] = ['Songti SC']
注意:
- 不同 macOS 版本的系统自带字体及名称可能略有差异。可以在「字体册」(Font Book) 或终端查看安装的字体,选择包含中文字符的名称即可。
- 如果仍无法显示中文,请确认字体名称拼写正确,或尝试重启您的 Python 环境让设置生效。