python中学物理实验模拟:凸透镜成像和凹透镜成像
python中学物理实验模拟:凸透镜成像和凹透镜成像
凸透镜成像
凸透镜是指中间厚、边缘薄的透镜。它对光线有会聚作用,即光线通过凸透镜后会向主光轴方向偏折。
成像原理
基于光的折射,平行于主光轴的光线经凸透镜折射后会聚于焦点(F),过光心的光线传播方向不变。
焦点 (F) 和焦距 (f): 平行于主光轴的光线经凸透镜折射后实际会聚的点称为实焦点(在透镜的另一侧)。焦点到透镜光心的距离称为焦距 (f)。凸透镜有两个对称的实焦点(物方焦点和像方焦点)。
成像规律: 凸透镜成像的性质(大小、正倒、虚实)和位置主要取决于物体到透镜光心的距离(物距 u)与透镜焦距 (f) 的关系。
成像规律(物距 u、像距 v、焦距 f):
物距u范围 | 像距 (v) 范围 | 像的性质 | 应用实例 |
u > 2f | f < v < 2f | 倒立、缩小的实像 | 照相机、监控摄像头 |
u = 2f | v = 2f | 倒立、等大的实像 | 测焦距 |
f < u < 2f | v > 2f | 倒立、放大的实像 | 投影仪、幻灯机 |
u = f | 不成像(光线平行射出) | - | - |
u < f | 像与物同侧,v > u | 正立、放大的虚像 | 放大镜、老花镜 |
关键点理解:
实像: 由实际光线会聚而成,可以用光屏接收(如投影在墙上)。像与物位于透镜异侧。
虚像: 是光线反向延长线的交点,不能用光屏直接接收,只能通过透镜观察到。像与物位于透镜同侧。
像距 (v): 像到透镜光心的距离。实像时 v 为正值;虚像时 v 为负值(在公式计算中体现)。
透镜公式: 1/f = 1/u + 1/v (符号规定:实物距 u 为正,实像距 v 为正,虚像距 v 为负,凸透镜焦距 f 为正)。
放大率 (m): m = |v/u| = 像高 / 物高。m > 1 表示放大,m < 1 表示缩小。
运行截图:
源码如下:
import tkinter as tk
from tkinter import ttk
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import matplotlib.font_manager as fm# 配置中文字体
def find_chinese_font():fonts = ['SimHei', 'Microsoft YaHei', 'SimSun', 'STSong', 'KaiTi']existing_fonts = []for f in fonts:if any([f.lower() in font.lower() for font in fm.findSystemFonts(fontpaths=None)]):existing_fonts.append(f)return existing_fonts[0] if existing_fonts else Nonechinese_font = find_chinese_font()
if chinese_font:matplotlib.rcParams['font.family'] = [chinese_font, 'sans-serif']
else:print("警告: 找不到中文字体,将使用英文")matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号class ConvexLensSimulator:def __init__(self, root):self.root = rootself.root.title("凸透镜成像模拟器")# 物理常量self.focal_length = 4 # 默认焦距8cmself.object_height = 2 # 物体高度4cm# 设置UIself.setup_ui()self.root.update() # 强制布局更新,处理Matplotlib 区域显示不完整def setup_ui(self):"""设置用户界面"""# 主界面布局self.main_frame = ttk.Frame(self.root)self.main_frame.pack(fill=tk.BOTH, expand=True)# 控制面板self.control_frame = ttk.LabelFrame(self.main_frame, text="参数控制")self.control_frame.pack(side=tk.LEFT, padx=10, pady=5, fill=tk.Y)# 可视化区域self.viz_frame = ttk.Frame(self.main_frame)self.viz_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)# 创建控制组件self.create_controls()# 初始化绘图区域self.init_plot()# 首次更新self.update_display()def create_controls(self):"""创建控制组件"""# 物距滑块ttk.Label(self.control_frame, text="物距 u (cm):").grid(row=0, column=0, sticky="w", pady=(10,0))self.u_value = tk.DoubleVar(value=8)self.u_slider = ttk.Scale(self.control_frame, from_=5, to=30, variable=self.u_value, command=lambda _: self.update_display())self.u_slider.grid(row=1, column=0, sticky="ew")# 焦距滑块,焦距允许的范围 from_=3, to=15,ttk.Label(self.control_frame, text="焦距 f (cm):").grid(row=2, column=0, sticky="w", pady=(10,0))self.f_value = tk.DoubleVar(value=self.focal_length)self.f_slider = ttk.Scale(self.control_frame, from_=3, to=15, variable=self.f_value,command=lambda _: self.update_display())self.f_slider.grid(row=3, column=0, sticky="ew") # 物体高度滑块ttk.Label(self.control_frame, text="物体高度 (cm):").grid(row=4, column=0, sticky="w", pady=(10,0))self.height_value = tk.DoubleVar(value=self.object_height)self.height_slider = ttk.Scale(self.control_frame, from_=1, to=10, variable=self.height_value,command=lambda _: self.update_display())self.height_slider.grid(row=5, column=0, sticky="ew")# 信息显示self.info_text = tk.StringVar()ttk.Label(self.control_frame, textvariable=self.info_text, wraplength=200).grid(row=6, column=0, sticky="w", pady=10)def init_plot(self):"""初始化绘图区域"""self.fig = plt.Figure(figsize=(10, 6))self.ax = self.fig.add_subplot(111)self.ax.set_xlim(-25, 25)self.ax.set_ylim(-8, 8)self.ax.axhline(0, color='black', lw=0.5) # 主光轴# 设置固定的边距,避免tight_layout问题self.fig.subplots_adjust(left=0.08, right=0.95, top=0.95, bottom=0.08)self.canvas = FigureCanvasTkAgg(self.fig, master=self.viz_frame)self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)def calculate_image(self):"""计算像的位置和性质"""f = self.f_value.get()u = self.u_value.get()# 特殊情况:u = fif abs(u - f) < 0.01: # 使用小的容差值return np.inf, np.inf, "不成像"v = u*f/(u-f) # 高斯成像公式 1/u + 1/v = 1/fmagnification = -v/u # 放大率 m = -v/uimage_type = "实像" if v > 0 else "虚像"return v, magnification, image_typedef draw_optical_elements(self, u, v):"""绘制光学元件和光线"""self.ax.clear()self.ax.set_xlim(-25, 25)self.ax.set_ylim(-8, 8)self.ax.grid(True, linestyle='--', alpha=0.6)self.ax.axhline(0, color='black', lw=0.5) # 主光轴self.ax.axvline(0, color='black', lw=0.5, alpha=0.3) # 光心垂线# 标记焦点f = self.f_value.get()self.ax.plot([-f, f], [0, 0], 'ro', markersize=4)self.ax.text(-f-0.5, -0.5, 'F', fontsize=10)self.ax.text(f+0.5, -0.5, 'F′', fontsize=10)# 绘制透镜self.draw_lens()# 绘制物体object_height = self.height_value.get()self.ax.plot([-u, -u], [0, object_height], 'b-', lw=2) # 物体self.ax.text(-u-0.5, object_height+0.3, 'Object', fontsize=9)# 绘制像 - 添加对无穷大的检查if v not in [np.inf, -np.inf] and v is not None and not np.isinf(v):image_height = object_height * (-v/u) # 像的高度, 负号表示倒立style = 'r-' if v > 0 else 'r--'self.ax.plot([v, v], [0, image_height], style, lw=2)self.ax.text(v+0.5, image_height-0.3, 'Image', fontsize=9)# 绘制光线 - 只有当v不是无穷大时才绘制if v not in [np.inf, -np.inf] and not np.isinf(v):self.draw_rays(u, v, object_height)else:# 当u=f时,绘制特殊的平行光线self.draw_parallel_rays(u, object_height)def draw_parallel_rays(self, u, object_height):"""绘制u=f时的平行光线"""f = self.f_value.get()# 光线1:平行于主光轴入射,经过透镜后仍然平行self.ax.plot([-u, 0], [object_height, object_height], 'r-', lw=1.5)self.ax.plot([0, 25], [object_height, object_height], 'r-', lw=1.5)# 光线2:通过光心,不发生偏折 - 这条光线应该是直线self.ax.plot([-u, 25], [object_height, object_height], 'g-', lw=1.5)# 光线3:从物体顶端指向左焦点,经过透镜后平行于主光轴射出lens_height = object_height / 2 # 当u=f时,lens_height = object_height * f / (f + u) = object_height/2self.ax.plot([-u, 0], [object_height, lens_height], 'b-', lw=1.5)self.ax.plot([0, 25], [lens_height, lens_height], 'b-', lw=1.5)def draw_lens(self):"""绘制凸透镜"""# 垂直线self.ax.plot([0, 0], [-6, 6], 'black', lw=1)# 凸出部分arc_left = plt.matplotlib.patches.Arc((0, 0), 2, 12, theta1=90, theta2=270, color='black', lw=2)arc_right = plt.matplotlib.patches.Arc((0, 0), 2, 12, theta1=270, theta2=90, color='black', lw=2)self.ax.add_patch(arc_left)self.ax.add_patch(arc_right)def draw_rays(self, u, v, object_height):"""绘制光线"""try:f = self.f_value.get()if v > 0: # 实像image_height = -object_height * v / u# 光线1:平行于主光轴入射 -> 经过右焦点self.ax.plot([-u, 0], [object_height, object_height], 'r-', lw=1.5)self.ax.plot([0, v], [object_height, image_height], 'r-', lw=1.5)# 光线2:通过光心,不发生偏折self.ax.plot([-u, v], [object_height, image_height], 'g-', lw=1.5)# 光线3:【修正】从物体顶端经过左焦点到透镜,然后平行射出# 第一段:从物体顶端(-u, object_height)经过左焦点(-f, 0)到透镜(0, y)# 计算这条直线与透镜的交点# 直线斜率 = (0 - object_height) / (-f - (-u)) = -object_height / (u - f)# 从左焦点到透镜的延伸:y = 0 + 斜率 * (0 - (-f)) = 斜率 * flens_y = -object_height * f / (u - f)# 绘制:物体顶端 -> 左焦点 -> 透镜self.ax.plot([-u, -f, 0], [object_height, 0, lens_y], 'b-', lw=1.5)# 从透镜平行于主光轴射出到像点self.ax.plot([0, v], [lens_y, image_height], 'b-', lw=1.5)else: # 虚像 (u < f)image_height = -object_height * v / u # 虚像高度(正值,正立)# 光线1:平行于主光轴入射 -> 折射后反向延长经过右焦点self.ax.plot([-u, 0], [object_height, object_height], 'r-', lw=1.5)self.ax.plot([0, 25], [object_height, object_height - (object_height/f)*25], 'r-', lw=1.5)self.ax.plot([0, v], [object_height, image_height], 'r--', lw=1.5, alpha=0.7)# 光线2:通过光心,不发生偏折self.ax.plot([-u, 25], [object_height, object_height], 'g-', lw=1.5)self.ax.plot([0, v], [object_height, image_height], 'g--', lw=1.5, alpha=0.7)# 光线3:【修正】从物体顶端指向右焦点到透镜,然后平行射出# 第一段:从物体顶端(-u, object_height)指向右焦点(f, 0),延伸到透镜(0, y)# 直线斜率 = (0 - object_height) / (f - (-u)) = -object_height / (f + u)# 从物体到透镜:y = object_height + 斜率 * (0 - (-u)) = object_height + 斜率 * ulens_y = object_height - object_height * u / (f + u)# 绘制:物体顶端 -> 透镜(指向右焦点方向)self.ax.plot([-u, 0], [object_height, lens_y], 'b-', lw=1.5)# 从透镜平行于主光轴射出self.ax.plot([0, 25], [lens_y, lens_y], 'b-', lw=1.5)# 反向延长线到虚像self.ax.plot([0, v], [lens_y, image_height], 'b--', lw=1.5, alpha=0.7)except Exception as e:print(f"绘制光线错误: {str(e)}")import tracebacktraceback.print_exc()def update_display(self, event=None):"""更新整个界面"""try:self.focal_length = self.f_value.get()self.object_height = self.height_value.get()u = self.u_value.get()v, magnification, image_type = self.calculate_image()# 更新信息显示info = f"物距 u = {u:.1f} cm\n"info += f"焦距 f = {self.focal_length:.1f} cm\n"if v is not None:if not np.isinf(v):info += f"像距 v = {v:.1f} cm\n"else:info += "像距 v = ∞\n"if not np.isinf(magnification):info += f"放大率 m = {magnification:.2f}\n"else:info += "放大率 m = ∞\n"info += f"像类型:{image_type}"# 改进的成像规律判断 - 使用统一的容差值tolerance = 0.05 # 合适的容差值if abs(u - self.focal_length) < tolerance: # u ≈ finfo += "\n不成像"elif u > 2*self.focal_length + tolerance:info += "\n倒立缩小实像"elif abs(u - 2*self.focal_length) < tolerance: # u ≈ 2finfo += "\n倒立等大实像"elif u > self.focal_length + tolerance and u < 2*self.focal_length - tolerance:info += "\n倒立放大实像"elif u < self.focal_length - tolerance:info += "\n正立放大虚像"else:# 边界情况,根据image_type来判断if image_type == "不成像":info += "\n不成像"elif image_type == "实像":if abs(magnification) > 1:info += "\n倒立放大实像"elif abs(magnification) < 1:info += "\n倒立缩小实像"else:info += "\n倒立等大实像"else: # 虚像info += "\n正立放大虚像"self.info_text.set(info)# 重绘光学元件self.draw_optical_elements(u, v)self.canvas.draw()except Exception as e:import tracebacktraceback.print_exc()self.info_text.set(f"更新错误: {str(e)}")returnif __name__ == "__main__":root = tk.Tk()app = ConvexLensSimulator(root)root.geometry("1200x700") # 增大窗口尺寸root.mainloop()
凹透镜成像
凹透镜是指中间薄、边缘厚的透镜。它对光线有发散作用,即光线通过凹透镜后会远离主光轴方向偏折。
成像原理
凹透镜成像也是基于光线的折射。光线通过凹透镜时,由于透镜的形状,光线会被发散。发散光线的反向延长线会交于一点,形成虚像。
凹透镜成像规律:
• 物距 u > 0(任意正值)
• 像距 v < 0(负值,表示虚像)
• 焦距 f < 0(负值)
• 像的性质:正立、缩小、虚像
• 数学关系:f < v < 0,即 |v| < |f| < u
透镜公式: 同样适用 1/f = 1/u + 1/v (凹透镜焦距 f 为负值,实物距 u 为正,虚像距 v 为负)。
应用
近视眼镜:矫正近视眼时,利用凹透镜的发散作用,使远处物体的像成在视网膜上。
门镜(猫眼):由凹透镜和凸透镜组合而成,凹透镜在外,使室外物体成缩小虚像,便于室内观察。
运行截图:
源码如下:
import tkinter as tk
from tkinter import ttk
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import matplotlib.font_manager as fm# 配置中文字体
def find_chinese_font():fonts = ['SimHei', 'Microsoft YaHei', 'SimSun', 'STSong', 'KaiTi']existing_fonts = []for f in fonts:if any([f.lower() in font.lower() for font in fm.findSystemFonts(fontpaths=None)]):existing_fonts.append(f)return existing_fonts[0] if existing_fonts else Nonechinese_font = find_chinese_font()
if chinese_font:matplotlib.rcParams['font.family'] = [chinese_font, 'sans-serif']
else:print("警告: 找不到中文字体,将使用英文")matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号class ConcaveLensSimulator:def __init__(self, root):self.root = rootself.root.title("凹透镜成像模拟器")# 物理常量self.focal_length = 8 # 凹透镜焦距为负,取绝对值,单位cm,滑块显示为正,内部转换为负self.object_height = 4 # 物体高度4cm# 设置UIself.setup_ui()self.root.update() # 强制布局更新,处理Matplotlib 区域显示不完整def setup_ui(self):"""设置用户界面"""self.main_frame = ttk.Frame(self.root)self.main_frame.pack(fill=tk.BOTH, expand=True)self.control_frame = ttk.LabelFrame(self.main_frame, text="参数控制")self.control_frame.pack(side=tk.LEFT, padx=10, pady=5, fill=tk.Y)self.viz_frame = ttk.Frame(self.main_frame)self.viz_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)self.create_controls()self.init_plot()self.update_display()def create_controls(self):"""创建控制组件"""# 物距滑块ttk.Label(self.control_frame, text="物距 u (cm):").grid(row=0, column=0, sticky="w", pady=(10, 0))self.u_value = tk.DoubleVar(value=20)self.u_slider = ttk.Scale(self.control_frame, from_=5, to=30,variable=self.u_value,command=lambda _: self.update_display())self.u_slider.grid(row=1, column=0, sticky="ew")# 焦距滑块(显示正值,内部取负值)ttk.Label(self.control_frame, text="焦距 f (cm):").grid(row=2, column=0, sticky="w", pady=(10, 0))self.f_value = tk.DoubleVar(value=self.focal_length)self.f_slider = ttk.Scale(self.control_frame, from_=5, to=20,variable=self.f_value,command=lambda _: self.update_display())self.f_slider.grid(row=3, column=0, sticky="ew")# 物体高度滑块ttk.Label(self.control_frame, text="物体高度 (cm):").grid(row=4, column=0, sticky="w", pady=(10, 0))self.height_value = tk.DoubleVar(value=self.object_height)self.height_slider = ttk.Scale(self.control_frame, from_=1, to=10,variable=self.height_value,command=lambda _: self.update_display())self.height_slider.grid(row=5, column=0, sticky="ew")# 信息显示self.info_text = tk.StringVar()ttk.Label(self.control_frame, textvariable=self.info_text, wraplength=200).grid(row=6, column=0, sticky="w", pady=10)def init_plot(self):"""初始化绘图区域"""self.fig = plt.Figure(figsize=(8, 6))self.ax = self.fig.add_subplot(111)self.ax.set_xlim(-25, 25)self.ax.set_ylim(-8, 8)self.ax.axhline(0, color='black', lw=0.5) # 主光轴self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.1)self.canvas = FigureCanvasTkAgg(self.fig, master=self.viz_frame)self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)def calculate_image(self):"""计算像的位置和性质, 凹透镜焦距f为负"""f = -abs(self.f_value.get()) # 确保焦距为负值u = self.u_value.get()# 成像公式 1/v = 1/f - 1/uv = (u * f) / (u - f) # 放大率 m = -v/umagnification = -v / u # 由于v是负值,所以放大率为正(正立像),但小于1(缩小像)image_type = "虚像" # 凹透镜始终成虚像return v, magnification, image_typedef draw_optical_elements(self, u, v):self.ax.clear()self.ax.set_xlim(-25, 25)self.ax.set_ylim(-8, 8)self.ax.grid(True, linestyle='--', alpha=0.6)self.ax.axhline(0, color='black', lw=0.5) # 主光轴f = -abs(self.f_value.get()) # 确保焦距为负值# 保留焦点的红色圆点self.ax.plot([f, -abs(f)], [0, 0], 'ro', markersize=6)#self.ax.text(f, -0.5, "F'", ha='center', fontsize=10)self.ax.text(-abs(f), -0.5, "F", ha='center', fontsize=10)self.draw_lens()object_height = self.height_value.get()# 保留物体箭头self.ax.arrow(-u, 0, 0, object_height, head_width=0.5, head_length=0.3, fc='blue', ec='blue', lw=2)self.ax.text(-u, object_height + 0.5, 'Object', fontsize=10, ha='center')# 保留虚像箭头if v not in [np.inf, -np.inf] and v is not None:magnification = -v / uimage_height = object_height * magnification# 虚像用虚线箭头self.ax.arrow(v, 0, 0, image_height, head_width=0.5, head_length=0.2, fc='red', ec='red', lw=2, linestyle='--', alpha=0.7)self.ax.text(v, image_height + 0.5, 'Virtual\nImage', fontsize=10, ha='center', color='red')self.draw_rays(u, v, object_height)def draw_lens(self):"""绘制凹透镜 - 边缘厚中间薄"""# 凹透镜的形状 - 双曲线h = 6 # 透镜高度# 绘制两条垂直边线self.ax.plot([0, 0], [-h, h], 'black', lw=1)# 绘制透镜的边缘轮廓(双曲线形状)t = np.linspace(-h, h, 100)x_left = -0.2 - 0.02 * t**2 # 左侧曲线x_right = 0.2 + 0.02 * t**2 # 右侧曲线self.ax.plot(x_left, t, 'black', lw=2)self.ax.plot(x_right, t, 'black', lw=2)def draw_rays(self, u, v, object_height):"""绘制凹透镜成像光路 - 去掉箭头符号版本"""try:f = -abs(self.f_value.get()) # 凹透镜焦距为负值left_focus = f # 左焦点位置magnification = -v / uimage_height = object_height * magnification# 光路1:平行于x轴的光线# 从Object顶点平行射到透镜中心线上的点(0, object_height)self.ax.plot([-u, 0], [object_height, object_height], 'r-', lw=2)# 折射后,反向延长线过左焦点,实际光线发散slope1 = object_height / (-left_focus)x_end = 25y_end = object_height + slope1 * x_endself.ax.plot([0, x_end], [object_height, y_end], 'r-', lw=2)# 光路2:从Object顶点射向透镜光心self.ax.plot([-u, 0], [object_height, 0], 'g-', lw=2)# 穿过光心后方向不变slope2 = object_height / uy_end2 = -slope2 * 25self.ax.plot([0, 25], [0, y_end2], 'g-', lw=2)# 绘制反向延长线的交点(虚像)# 光路1的反向延长线self.ax.plot([0, v], [object_height, image_height], 'r--', lw=1.5, alpha=0.7)# 光路2的反向延长线self.ax.plot([0, v], [0, image_height], 'g--', lw=1.5, alpha=0.7)# 添加焦点和虚像点之间的红虚线self.ax.plot([left_focus, v], [0, image_height], 'r--', lw=1.5, alpha=0.7)except Exception as e:print(f"绘制光线错误: {str(e)}")def update_display(self, event=None):try:self.focal_length = self.f_value.get()self.object_height = self.height_value.get()u = self.u_value.get()v, magnification, image_type = self.calculate_image()info = f"物距 u = {u:.1f} cm\n"info += f"焦距 f = {-self.focal_length:.1f} cm\n" # 负值表示凹透镜焦距if v is not None:if abs(v) != np.inf:info += f"像距 v = {abs(v):.1f} cm\n"else:info += "像距 → ∞\n"if abs(magnification) != np.inf:info += f"放大率 m = {magnification:.2f}\n"else:info += "放大率 → ∞\n"info += f"像类型:{image_type}"self.info_text.set(info)self.draw_optical_elements(u, v)self.canvas.draw()except Exception as e:import tracebacktraceback.print_exc()self.info_text.set(f"更新错误: {str(e)}")returnif __name__ == "__main__":root = tk.Tk()app = ConcaveLensSimulator(root)root.geometry("1000x600")root.mainloop()
附录
关于 matplotlib更多情况 可见 https://blog.csdn.net/cnds123/article/details/148798860
关于numpy更多情况可见 https://blog.csdn.net/cnds123/article/details/135844660
相关文章:
python中学物理实验模拟:凸透镜成像和凹透镜成像
python中学物理实验模拟:凸透镜成像和凹透镜成像 凸透镜成像 凸透镜是指中间厚、边缘薄的透镜。它对光线有会聚作用,即光线通过凸透镜后会向主光轴方向偏折。 成像原理 基于光的折射,平行于主光轴的光线经凸透镜折射后会聚于焦点ÿ…...
【AGI】突破感知-决策边界:VLA-具身智能2.0
突破感知-决策边界:VLA-具身智能2.0 (一)技术架构核心(二)OpenVLA:开源先锋与性能标杆(三)应用场景:从实验室走向真实世界(四)挑战与未来方向&…...
2D曲线点云平滑去噪
2D曲线点云,含许多噪声,采用类似移动最小二乘的方法(MLS)分段拟合抛物线并投影至抛物线,进行点云平滑去噪。 更通俗的说法是让有一定宽度的曲线点云,变成一条细曲线上的点。 分两种情况进行讨论: 1&#…...
靶场(二十一)---小白心得靶场体会---DVR4
先看端口,看到了一个dvr的服务,老规矩只要有服务就先去看看 PORT STATE SERVICE VERSION 22/tcp open ssh Bitvise WinSSHD 8.48 (FlowSsh 8.48; protocol 2.0; non-commercial use) | ssh-hostkey: | 3072 21:25:f0:53:b4…...
Qt + C++ 入门2(界面的知识点)
补充前面没有说到的一点就是,qt的页面你可以用qt自带的也就是前面所说的自动生成.UI文件生成前端所谓的界面,然后往里面拖控件就可以了,这个UI界面非常的适合用于新手,以及某些软件少量的界面应用 。但是有一个难点就是后期这个UI…...
计算机网络第九章——数据链路层《流量控制和可靠传输》
一、回顾概念 前面上一章讲了数据链路层的《差错控制》,那么回顾一下差错控制和可靠传输的区别: 差错控制:发现一个帧里的【位错(比特错)】 检错(奇偶校验码、CRC循环冗余校验码):接…...
Zephyr 调试实用指南:日志系统、Shell CLI 与 GDB 全面解析
本文深入讲解 Zephyr 的调试利器,包括统一日志系统(logging subsystem)、内置命令行(Shell CLI)、与 GDB 调试集成方法,帮助开发者快速定位问题、分析运行时行为,实现高效开发与排障。 一、日志…...
【知识图谱提取】【阶段总结】【LLM4KGC】LLM4KGC项目提取知识图谱推理部分
文章目录 前言LLM4KGC的三个部分显卡使用效果前言 之前在学习基于大模型的知识图谱提取,就找到了LLM4KGC这个项目: 项目地址: https://github.com/ChristopheCruz/LLM4KGC/ 总体来说,这个项目没有什么比较高深的idea,年份也比较古老,但确实挺适合入手的。主要是绝对简…...
基于YOLO的智能车辆检测与记录系统
基于YOLO的智能车辆检测与记录系统 摘要 本报告总结了智能车辆检测系统的开发工作,主要包括车辆数据标注、YOLO模型训练及QT交互系统搭建三部分。通过使用专业标注工具完成车辆目标数据集的标注与预处理,基于YOLO模型构建车辆检测算法并优化训练流程&a…...
5.2 Qt Creator 使用FFmpeg库
一、目录结构 ├─3rdparty # 第三方依赖库 │ └─ffmpeg-4.4.3 # ffmpeg库 │ ├─mingw # 用MinGW64编译的库 │ │ ├─bin │ │ ├─include │ │ └─lib │ └─msvc # 用MSVC编译的库 │ ├─bin │ …...
C++基础练习 sort函数,用于排序函数
题目: https://acm.hdu.edu.cn/showproblem.php?pid2039 解答: #include <iostream> #include <cmath> #include <algorithm> using namespace std;double a[3]; int main(){int n;cin>>n;while(n--){cin>>a[0]>>…...
【Docker 08】Compose - 容器编排
🌈 一、Docker Compose 介绍 ⭐ 1. Docker Compose 是什么 Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具,它让用户可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务&…...
docker执行yum报错Could not resolve host: mirrorlist.centos.org
解决办法: -- 依次执行以下命令cd /etc/yum.repos.d/sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.org|g /etc/yum.repos.d/CentOS-*sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*yum update -yecho "export LC_ALL…...
信贷域——信贷授信业务
摘要 本文详细介绍了信贷授信业务,包括其核心目标、典型流程、不同机构授信流程的对比、授信业务的其他类型以及授信模块的技术实现。信贷授信是金融机构在放贷前对客户信用额度的评估与审批流程,旨在控制风险、合理设定额度和期限、确保合规࿰…...
python的校园兼职系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
深度剖析 PACK_SESSIONID 实现原理与安全突破机制
🌐 深度剖析 PACK_SESSIONID 实现原理与安全突破机制 🖼️ 1. 完整数据处理流程 #mermaid-svg-TW7jVIcz81hCZVS9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TW7jVIcz81hCZVS9 .error-ico…...
从0开始学习计算机视觉--Day02--数据驱动
上次我们在课程里了解到,亚马逊网站在当时构建了一个在那时候最大的供AI训练的数据集,为了推广这个测试,他们举办了比赛邀请了许多的参赛者,识别图片的标准是输出的类别中只要在前面五个里包含了正确答案就算识别成功。在这个过程…...
【LeetCode#第198题】打家劫舍(一维dp)
198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&#…...
stm32串口(uart)2转发到串口(uart)3实现
今天博主在用kelil5写stm32的程序时遇到了一个全局变量因为在中断和任务切换时没有加 volatile 修饰,导致任务检测不到标志位变化,无法实现效果的问题。 全部代码: /* USER CODE BEGIN Header */ /***************************************…...
数据结构——函数填空题
链队出队入队 入队:新指针p赋给队尾的下一个,再赋给队尾 出队:队首指针赋给p,后移 p的下一个赋给队首指向的下一个 若队尾p,则证明首尾相连为1个 字符串匹配算法 二叉树 统计二叉树度为1的节点 树T为空࿰…...
什么是跨域问题?后端如何解决跨域问题?
跨域问题是指浏览器为了安全,对不同域(包含不同协议、不同端口或不同主机名)的请求进行限制,从而导致请求无法正常访问后端接口。 跨域问题的产生源于浏览器的同源策略(Same-Origin Policy),这…...
使用ccs生成bin
CCS12.6 编译生成BIN文件正确方法_ccs生成bin文件-CSDN博客...
Python 邻接表详细实现指南
邻接表是图数据结构的一种高效表示方法,特别适合表示稀疏图。下面我将用 Python 详细讲解邻接表的多种实现方式、操作方法和实际应用。 一、邻接表基础概念 邻接表的核心思想是为图中的每个顶点维护一个列表,存储与该顶点直接相连的所有邻接顶点。 邻…...
FVISION 未来视界工作室:AI驱动的创新与智能外包平台
大家好,今天给大家介绍一个非常有意思的AI创新平台——FVISION 未来视界工作室。如果你正在寻找高效、智能、前沿的数字化工具和服务,这里一定有你想要的答案! 🌟 平台简介 FVISION 未来视界工作室专注于AI驱动的创新应用开发&am…...
领域驱动设计(DDD)【3】之事件风暴
文章目录 说明一 事件风暴理论知识1.1 事件风暴的核心目标1.2事件风暴的关键步骤1.2.1 准备工作1.2.2 核心流程1.2.3 事件风暴的输出 1.3 事件风暴的优势1.4 常见问题Q1:事件风暴适合所有项目吗?Q2:事件风暴后如何落地?Q3…...
3.10 坐标导航
1.编写代码 新建文件nav_clienr.cpp编写代码 #include<ros/ros.h> #include<move_base_msgs/MoveBaseAction.h> #include<actionlib/client/simple_action_client.h>typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBas…...
TensorFlow 安装与 GPU 驱动兼容(h800)
环境说明TensorFlow 安装与 GPU 驱动兼容CUDA/H800 特殊注意事项PyCharm 和终端环境变量设置方法测试 GPU 是否可用的 Python 脚本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上启用 GPU 加速完整指南在使用 TensorFlow 进行深度学习训练时,充分利用 GPU 能力至关重要…...
WPF调试三种工具介绍:Live Visual Tree、Live Property Explorer与Snoop
WPF调试工具详解:Live Visual Tree、Live Property Explorer与Snoop 1. Live Visual Tree (实时可视化树) 简介 Live Visual Tree是Visual Studio内置的WPF调试工具,允许开发者在应用程序运行时检查可视化树结构,查看控件的层次关系及其状态。…...
用OBS Studio录制WAV音频,玩转语音克隆和文本转语音!
言简意赅的讲解OBS Studio解决的痛点 随着AI技术的快速发展,语音克隆与文本生成语音技术越来越受欢迎。无论你想要制作个人虚拟主播,还是给自媒体视频配音,拥有高质量的原始音频都是关键。本文详细教你使用免费且功能强大的软件——OBS Stud…...
5.3 VSCode使用FFmpeg库
一、VSCMake 1.1 使用ffmpeg动态库 项目目录结构: ./ ├── 3rdparty # 第三方依赖库 │ └── ffmpeg_4.4.1 │ ├── include # 头文件 │ ├── lib # 静态库库 │ └── share ├── build # 编译目…...
【Datawhale组队学习202506】零基础学爬虫 02 数据解析与提取
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言2.1 概述2.2 re 解析2.3 bs4 解析2.4 xpath 解析总结 前言 Datawhale是一个专注于…...
[muduo] ThreadPool | TcpClient | 异步任务 | 通信测试
第九章:线程池(ThreadPool) 在第八章《TcpServer》中,我们了解到muduo::net::TcpServer通过EventLoop线程池处理入站连接。 这些EventLoop线程主要负责网络I/O:套接字读写和定时器处理,由Poller和Channel…...
探索 Vue 替代方案
Vue vs React vs Angular 在快速迭代的前端世界,Vue、React和Angular三大框架的竞争从未停止。2025年的今天,它们各自进化出了怎样的面貌?让我们深入剖析它们的核心差异,助你做出明智的技术选型。 Vue.js 完整的基于组件的UI框…...
大模型的开发应用(十二):RAG 与 LlamaIndex基础
这里写目录标题 1 LlamaIndex 简要介绍1.1 核心价值1.2 核心组件1.3 核心流程1.4 为什么要用 LlamaIndex?1.5 典型应用场景1.6 与类似工具对比1.7 安装1.8 学习资源 2 文档解析与 Document 对象2.1 示例文件与代码2.2 Document 对象的核心特性2.3 在 RAG 工作流程中…...
Java面试题025:一文深入了解数据库Redis(1)
欢迎大家关注我的JAVA面试题专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系(面试题)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshareblogcolumn&sharetypeblogco…...
Web攻防-XSS跨站Cookie盗取数据包提交网络钓鱼BEEF项目XSS平台危害利用
知识点: 1、Web攻防-XSS跨站-手工代码&框架工具&在线平台 2、Web攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼 演示案例-WEB攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼&Beef工具 1、XSS跨站-攻击利用-凭据盗取 条件:无防…...
(LeetCode 面试经典 150 题) 169. 多数元素(哈希表 || 二分查找)
题目:169. 多数元素 方法一:二分法,最坏的时间复杂度0(nlogn),但平均0(n)即可。空间复杂度为0(1)。 C版本: int nnums.size();int l0,rn-1;while(l<r){int mid(lr)/2;int ans0;for(auto x:nums){if(xnums[mid]) a…...
71、单元测试-Junit5简介
71、单元测试-Junit5简介 # JUnit 5 简介 JUnit 5 是 Java 平台上最流行的单元测试框架之一,是 JUnit 的重大升级版本,引入了许多新特性和改进,旨在提供更现代化、灵活和强大的测试体验。 ## 主要组成部分 JUnit 5 由三个模块组成:…...
IEC61850 一致性测试中的 UCA 测试
一、IEC61850 与 UCA 的关系背景 标准演进:IEC61850 是电力系统自动化领域的国际通信标准,其发展与美国 UCA(User Communications Architecture)标准密切相关。2001 年,UCA 国际用户组织与 IEC 合作,将 UC…...
ProtoBuf:proto3 语法详解
🌈 个人主页:Zfox_ 🔥 系列专栏:ProtoBuf 在语法详解部分,依旧使⽤项⽬推进的⽅式完成讲解。这个部分会对通讯录进⾏多次升级,使⽤2.x表⽰升级的版本,最终将会升级如下内容: 不再打…...
博图SCL语言GOTO语句深度解析:精准跳转
在SCL编程中,**GOTO语句**是控制流程的底层工具,它允许程序无条件跳转到指定的**标签位置**。虽然现代编程中较少使用,但在特定工业场景下仍能发挥独特价值。 GOTO语句核心机制 基本语法结构 // 定义标签 <标签名>: // 跳转指令 GOTO…...
面试题-在ts中有两个类型,一个是a,一个是b,这两个联合起来就是c,如何实现联合
在 TypeScript 中,若要将两个类型 a 和 b 联合成一个新类型 c,可以使用 联合类型(Union Type) 或 交叉类型(Intersection Type),具体取决于你的需求: 一、联合类型(Unio…...
Mac电脑-触摸板增强工具-BetterTouchTool
BetterTouchTool mac 触摸板增强工具,允许用户使用各种手势来控制其计算机。 Bettertouchtool mac是一个小而高效的macOS应用程序,旨在帮助您为手势定义快捷方式。 此外,Bettertouchtool可用于使用常规鼠标和键盘快捷键,并提供伴…...
MySQL误删数据急救指南:基于Binlog日志的实战恢复详解
背景 数据误删是一个比较严重的场景 1.典型误操作场景 场景1:DELETE FROM orders WHERE status0 → 漏写AND create_time>‘2025-06-20’ 场景2:DROP TABLE customer → 误执行于生产环境 认识 binlog 1.binlog 的核心作用 记录所有 DDL/DML 操…...
API网关Apisix管理接口速查
🧭 管理接口总体分类(基于 REST API) 资源类别接口路径前缀功能说明路由(Routes)/apisix/admin/routes/{id}定义 HTTP 请求的匹配规则及转发目标服务(Services)/apisix/admin/services/{id}封装…...
React 组件通信
父传子 函数式组件 function Footer(props){const [count,setCount] useState(0)const {name,age} propsconst onClick ()>{setCount(count1)}return (<div><button onClick{()>{onClick()}}>点此1</button><div>{count}</div><di…...
Zephyr 电源管理机制深度解析:从 Tickless Idle 到平台 Suspend 实践
本文系统解析 Zephyr 的电源管理机制,包括 Tickless Idle 模式、系统 suspend/resume 生命周期管理、平台级功耗优化 Hook、自定义设备电源域,以及如何结合低功耗 SoC 实现最小化功耗设计。全文超过 5000 字,适合构建对功耗敏感的 IoT、BLE、…...
clickhouse-server连不上clickhouse-keeper的问题记录
背景 想简单部署一个1 shard 2 replica,1keeper的集群。 有两个虚拟机:192.168.1.3,192.168.1.6。 192.168.1.3:部署1个ck,1个keeper 192.168.1.6:部署1个ck 192.168.1.3和192.168.1.6的ck组成1个shar…...
Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作
🎯 今日目标 掌握 DataFrame 的条件筛选(布尔索引)学会多条件筛选、逻辑运算熟练使用排序(sort_values)提升数据组织力结合列选择进行数据提取分析 🧪 一、列选择与基本筛选 ✅ 选择单列 / 多列 df[&quo…...
Android NDK下载链接及配置版本
Android NDK下载链接及配置版本 https://github.com/android/ndk/releases 在build.gralde里面这样配置ndk具体版本号: android {ndkVersion "27.0.12077973" } Android Studio报错:Could not move temporary workspace () to immutable locat…...