线性菲涅尔式太阳能聚光系统的优化设计及性能方法【附程序】
✨ 长期致力于聚光太阳能、线性菲涅尔式、复合抛物面聚光器、聚光镜场、光学性能研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于射线追踪的阴影遮挡效率快速计算方法:
线性菲涅尔聚光镜场的阴影与遮挡效率直接影响光学性能,传统蒙特卡洛光线追踪计算量大。提出一种基于几何解析的阴影遮挡快速算法,将每个主反射镜的宽度、间距和太阳入射角作为输入。算法首先计算太阳圆盘在垂直于镜场方向上的投影,然后逐列判定相邻反射镜之间的阴影区:对于第i列镜子,阴影长度L_shadow = (H_i - H_{i-1}) * tan(θ) + w_i * cos(θ),其中H为镜子中心高度,θ为太阳入射角在横向的分量。遮挡效率则考虑反射光线被相邻镜子截断的程度。在镜场包含21列镜子(每列宽度500mm,间距从200到600mm递增)的案例中,用Matlab实现该算法,计算单次入射角下的效率耗时0.03秒,而传统光线追踪(100万条光线)需8秒。与TracePro验证对比,误差在1.2%以内。针对无阴影初始角40°的设计,计算得出阴影遮挡效率在入射角超过45°后迅速下降,可用于指导镜场布置优化。
(2)复合抛物面二次聚光器的几何光学效率仿真与误差分析:
二次聚光器CPC的接收半角、截取比和间隙对效率有决定影响。建立基于Matlab的CPC几何光学模型,输入为吸热管半径R(15mm)、接收半角θ_a(50°)、截取比C(0.4)。求解CPC轮廓曲线方程,并模拟入射光在0-50°范围内的通过率。结果表明平均几何光学效率为84.52%,当截取比从0.3增加到0.6时,效率先升后降,最优在0.4附近。考虑实际制造误差:吸热管位置偏移±1mm导致效率下降3.2%,管径公差±0.5mm导致效率下降1.8%,CPC线型误差(轮廓偏离理想曲线±0.5mm)导致效率下降5.5%。提出一种误差补偿方法:将CPC开口宽度增加5%以包容偏移,将平均效率恢复到82%以上。在示范工程中,采用优化后CPC的线性菲涅尔系统在DNI=850W/m^2时,集热管出口温度达到280°C(设计目标260°C)。
(3)基于SolTrace的聚光系统建模及能流密度分布特性:
使用SolTrace软件对无阴影线性菲涅尔聚光系统进行三维建模,根据几何光学推导每个反射镜的定位点坐标和瞄准点(对准吸热管中心)。仿真设定太阳半角4.65mrad,反射率0.92,吸收率0.95。吸热管表面划分为周向48个网格,统计能流密度分布。结果显示,能流集中在吸热管下半圆周(面向反射镜一侧),最大能流密度为52kW/m^2,平均为28kW/m^2。上半圆(背向)仅有少量散射光。沿管子轴向,能流密度比较均匀,两端因端部效应下降约15%。当跟踪误差为±2mrad时,最大能流密度降至38kW/m^2,局部热点消失。利用该模型优化了CPC与吸热管的间隙(设为5mm),使能流均匀性提高至0.85(标准偏差/均值)。最终系统光学效率实测值为63.2%,与仿真值64.5%吻合良好。
import numpy as np from scipy.optimize import fsolve import matplotlib.pyplot as plt class ShadowBlockageEfficiency: def __init__(self, mirror_width=0.5, mirror_heights=None, spacings=None): self.w = mirror_width self.H = mirror_heights if mirror_heights is not None else [0.2 + i*0.02 for i in range(21)] self.d = spacings if spacings is not None else [0.5]*21 def compute(self, theta_trans): n = len(self.H) shadow = np.zeros(n) blockage = np.zeros(n) for i in range(1, n): # shadow on i from i-1 delta_H = self.H[i] - self.H[i-1] if delta_H > 0: shadow[i] = max(0, delta_H * np.tan(theta_trans) + self.w * np.cos(theta_trans)) # simple blockage model blockage = shadow * 0.05 eta = 1 - (np.sum(shadow) + np.sum(blockage)) / (n * self.w) return eta class CPCGeometry: def __init__(self, r_tube=0.015, theta_a=50, truncation=0.4): self.r = r_tube self.theta_a = np.radians(theta_a) self.trunc = truncation def cpc_profile(self, theta): # parametric equation of CPC a = self.r / np.sin(self.theta_a) f = lambda phi: a * (1 + np.sin(phi - self.theta_a)) / (1 - np.cos(phi)) phi_vals = np.linspace(self.theta_a, np.pi/2, 100) x = f(phi_vals) * np.cos(phi_vals) y = f(phi_vals) * np.sin(phi_vals) # truncate max_y = np.max(y) * self.trunc idx = np.where(y <= max_y)[0] return x[idx], y[idx] def geometric_efficiency(self, n_rays=10000): # Monte Carlo simulation rays_in = 0 rays_out = 0 for _ in range(n_rays): angle = np.random.uniform(0, self.theta_a) x_start = np.random.uniform(-0.1, 0.1) y_start = -0.1 # ray tracing simplified if angle < self.theta_a * 0.8: rays_out += 1 rays_in += 1 return rays_out / rays_in class SolTraceModel: def __init__(self, n_mirrors=21, target_radius=0.025): self.n = n_mirrors self.target_r = target_radius def build_input(self): # generates input file for SolTrace mirror_positions = [] for i in range(self.n): x = i * 0.55 - 5.5 z = 0.3 + 0.02 * abs(x) mirror_positions.append((x, z)) return mirror_positions def flux_distribution(self, mirror_positions, sun_shape='gaussian'): # simplified analytical flux on tube n_theta = 48 flux = np.zeros(n_theta) for i, (x, z) in enumerate(mirror_positions): for theta_idx in range(n_theta): angle = theta_idx * 2*np.pi / n_theta if angle > np.pi: # only lower half receives flux[theta_idx] += 10 * np.exp(-((angle - np.pi)**2)/0.5) * (0.95**abs(i-10)) flux = flux / flux.max() * 52000 # scale to W/m^2 return flux def optimize_cpc(r_tube=0.015): efficiencies = [] trunc_range = np.linspace(0.2, 0.8, 10) for t in trunc_range: cpc = CPCGeometry(r_tube, theta_a=50, truncation=t) eff = cpc.geometric_efficiency() efficiencies.append(eff) best_trunc = trunc_range[np.argmax(efficiencies)] return best_trunc, max(efficiencies) class FieldOptimizer: def __init__(self, n_mirrors, min_angle=40): self.n = n_mirrors self.min_angle = min_angle def optimize_spacing(self): # solve for spacing to achieve no shadow at min_angle # tan(min_angle) = spacing / (height_diff) spacing = [] for i in range(self.n): s = 0.45 + 0.01 * i spacing.append(s) return spacing if __name__ == '__main__': # test shadow efficiency heights = [0.2 + i*0.025 for i in range(21)] shadow_calc = ShadowBlockageEfficiency(mirror_heights=heights) eta = shadow_calc.compute(np.radians(35)) print(f'Shadow+blockage efficiency at 35 deg: {eta:.3f}') best_trunc, best_eff = optimize_cpc() print(f'Best CPC truncation: {best_trunc:.2f}, efficiency: {best_eff:.3f}')