数学建模B

avatar
作者
筋斗云
阅读量:0

题目

一种太阳能光热发电的能量汇聚系统简化后如图1所示。平行光线先经过若干个长度不超过2.5的直线段反射到曲线EF上,再经过曲线EF反射后汇聚到直线段CD上。已知AB的长度为400,CD的长度为10,OG的高度为100。请设计曲线EF的长度和形状,在设计好曲线EF后,给出下列问题的解答。

问题1 当入射的平行光线与AB的夹角为90度时,请安排长度不超过2.5的直线段的数量、每个直线段的位置和角度,使得与AB垂直的光线经过两次反射后进入CD区间内的比例最大。

问题2 当入射的平行光线与AB的夹角从45度变化到90度的过程中,请给出长度不超过2.5的直线段的数量、位置和角度的调整方案,使得光线经过两次反射后进入CD区间内的比例最大。

问题3 能否将长度为不超过2.5的直线段改为长度不超过2.5的光滑曲线,通过对每一段长度不超过2.5的光滑曲线形状和位置的设计以及角度变化的调整,使得当入射平行光线与AB的夹角从45度变化到90度的过程中,光线经过两次反射后进入CD区间的比例有所提高?

图1  入射平行光线经过二次反射后汇聚示意图

问题1:

  1. 确定入射光线与AB的夹角为90度时的设计:

    • 首先,我们可以选择一定数量的直线段,并确定它们的位置和角度。这些直线段将用于实现光线的反射。
    • 接下来,根据入射光线与AB的夹角为90度,使用反射定律来计算光线在每个直线段上的反射角度,并决定光线的路径。
  2. 优化直线段的位置和角度:

    • 我们可以使用数值优化方法,例如遗传算法、模拟退火算法等,来调整直线段的位置和角度,以最大化光线经过两次反射后进入CD区间内

import numpy as np from scipy.optimize import minimize  # 已知参数 AB_length = 400    # AB长度 CD_length = 10     # CD长度 OG_height = 100    # OG高度 max_segment_length = 2.5  # 直线段最大长度 num_segments = 10  # 直线段数量  # 初始直线段位置和角度 segment_positions = np.linspace(0, AB_length, num_segments+1) initial_angles = np.linspace(45, 90, num_segments)  # 定义光线追踪函数 def ray_trace(angles):     total_ratio = 0     for angle, position in zip(angles, segment_positions):         # 根据入射角计算光线到达CD的比例(这里用简化的线性模型)         ratio = min(1, CD_length / (position * np.tan(np.radians(angle))))         total_ratio += ratio     return -total_ratio  # 返回的是相反的比例,因为我们希望最大化比例  # 定义优化问题 result = minimize(ray_trace, initial_angles, method='BFGS')  # 输出结果 optimized_angles = result.x print("优化后的直线段角度:") print(optimized_angles)  # 计算最终的光线到达CD的比例 final_ratio = -result.fun print("最终光线到达CD的比例:", final_ratio) 

优化方案

我们需要找到最佳的反射镜形状,使得光线在AB和CD之间进行多次反射后最终聚焦在一个点上。这个问题可以通过优化算法来解决,其中包括遗传算法、粒子群优化算法等。下面是一个使用遗传算法的示例代码:

import numpy as np from geneticalgorithm import geneticalgorithm as ga  # 目标函数:计算垂直入射光线经过两次反射后进入CD区间内的比例 def objective_function(params):     # 计算反射点位置     reflection_points = calculate_reflection_points(params)     # 计算反射后进入CD区间内的比例     ratio = calculate_ratio(reflection_points)     return -ratio  # 由于是最大化比例,因此取负值作为目标函数  # 计算反射点位置的函数 def calculate_reflection_points(params):     # 根据参数计算直线段的位置和角度     # 计算反射点位置     pass  # 计算反射后进入CD区间内的比例的函数 def calculate_ratio(reflection_points):     # 计算反射后进入CD区间内的比例     pass  # 定义参数范围 n = 10  # 假设有10个直线段 varbound = np.array([[0, 400], [0, 90]] * n)  # 每个直线段的位置范围为[0, 400],角度范围为[0, 90]  # 使用遗传算法进行优化 model = ga(function=objective_function, dimension=2 * n, variable_type='real', variable_boundaries=varbound) model.run()  # 输出结果 optimal_params = model.output_dict['variable'] print("Optimal Parameters:", optimal_params)

问题2:

  1. 调整入射角度并重新设计:
    • 当入射角度从45度变化到90度时,需要重新调整直线段的数量、位置和角度。
    • 对于每个入射角度,使用反射定律计算光线在直线段上的反射角度,并进行优化,以最大化光线进入CD区间的比例。
import numpy as np from scipy.optimize import minimize  # 已知参数 AB_length = 400    # AB长度 CD_length = 10     # CD长度 OG_height = 100    # OG高度 max_segment_length = 2.5  # 直线段最大长度 num_segments = 10  # 直线段数量  # 初始直线段位置和角度 segment_positions = np.linspace(0, AB_length, num_segments+1) initial_angles = np.linspace(45, 90, num_segments)  # 定义光线追踪函数 def ray_trace(angles):     total_ratio = 0     for angle, position in zip(angles, segment_positions):         # 根据入射角计算光线到达CD的比例(这里用简化的线性模型)         ratio = min(1, CD_length / (position * np.tan(np.radians(angle))))         total_ratio += ratio     return -total_ratio  # 返回的是相反的比例,因为我们希望最大化比例  # 定义优化问题 result = minimize(ray_trace, initial_angles, method='BFGS')  # 输出结果 optimized_angles = result.x print("优化后的直线段角度:") print(optimized_angles)  # 计算最终的光线到达CD的比例 final_ratio = -result.fun print("最终光线到达CD的比例:", final_ratio)
优化方案

我们可以使用优化算法来寻找最佳的波长组合,以最大化光热发电系统的能量吸收。一个常用的优化算法是遗传算法(Genetic Algorithm),它可以搜索最佳的波长组合以满足特定的优化目标。

import numpy as np from geneticalgorithm import geneticalgorithm as ga  # 定义目标函数:使得能量吸收最大化 def objective_function(wavelengths):     # 计算能量吸收     energy_absorption = calculate_energy_absorption(wavelengths)     # 目标是最大化能量吸收,因此返回负值以转换为最小化问题     return -energy_absorption  # 定义问题的上下界 varbound = np.array([[400, 700]] * 5)  # 5个波长的范围,假设波长范围为400到700纳米  # 使用遗传算法进行优化 model = ga(function=objective_function, dimension=5, variable_type='real', variable_boundaries=varbound) model.run()  # 输出结果 optimal_wavelengths = model.output_dict['variable'] print("Optimal Wavelengths:", optimal_wavelengths)

问题3:

  1. 探讨光滑曲线的设计:

    • 考虑将直线段替换为光滑曲线,以更好地引导光线。
    • 设计光滑曲线的形状和位置,使其能够最大程度地聚焦光线到CD区间内。
  2. 使用数值优化方法:

    • 借助数值优化方法,可以调整光滑曲线的形状、位置和角度,以提高反射后进入CD区间的比例。
import numpy as np from scipy.optimize import minimize  AB_length = 400    # AB长度 CD_length = 10     # CD长度 OG_height = 100    # OG高度 max_curve_length = 2.5  # 光滑曲线最大长度 num_curves = 10  # 光滑曲线数量  # 初始化光滑曲线位置和角度 curve_positions = np.linspace(0, AB_length, num_curves+1) initial_angles = np.linspace(45, 90, num_curves)  # 定义光线追踪函数 def ray_trace(curves):     total_ratio = 0     for angle, position in zip(initial_angles, curve_positions):         ratio = min(1, CD_length / (position * np.tan(np.radians(angle))))         total_ratio += ratio     return -total_ratio  # 定义优化问题并执行优化 result = minimize(ray_trace, initial_angles, method='BFGS')  # 输出结果 optimized_angles = result.x print("优化后的光滑曲线角度:") print(optimized_angles)  final_ratio = -result.fun print("最终光线到达CD的比例:", final_ratio) 
优化方案:

一个可能的优化方案是采用遗传算法来搜索最佳的入射角度组合

import numpy as np from geneticalgorithm import geneticalgorithm as ga  # 设定光热发电能量汇聚系统的参数 AB_length = 10  # AB的长度 CD_length = 5   # CD的长度  # 定义函数计算光线在AB和CD之间的反射路径 def calculate_reflection_path(incident_angles):     reflection_positions = [0]  # 起始位置     for angle in incident_angles:         reflection_positions.append(reflection_positions[-1] + AB_length * np.tan(angle))         reflection_positions.append(reflection_positions[-1] + CD_length * np.tan(angle))     return reflection_positions  # 定义目标函数:使得反射路径尽可能地接近给定的路径 def objective_function(incident_angles):     num_reflections = len(incident_angles)     calculated_path = calculate_reflection_path(incident_angles)     target_path = [1, 3, 7, 9]  # 给定的目标路径     return np.sum((np.array(calculated_path) - np.array(target_path)) ** 2)  # 定义问题的上下界 varbound = np.array([[0, np.pi/2]] * 3)  # 3个入射角度的范围  # 使用遗传算法进行优化 model = ga(function=objective_function, dimension=3, variable_type='real', variable_boundaries=varbound) model.run()  # 输出结果 optimal_incident_angles = model.output_dict['variable'] optimal_incident_angles_degrees = np.degrees(optimal_incident_angles) print("Optimal Incident Angles:", optimal_incident_angles_degrees)

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!