增程式混合动力汽车MATLAB_simulink模型(串联)整车建模包括工况选择模型、驾驶员模型(PID控制)、整车工作模式控制模型、发动机模型、电机模型、电池模型、传动系统模型、整车动力学模型。

news2026/4/1 2:07:59
增程式混合动力汽车MATLAB/simulink模型串联整车建模包括工况选择模型、驾驶员模型PID控制、整车工作模式控制模型、发动机模型、电机模型、电池模型、传动系统模型、整车动力学模型。此模型比较简单当SOC低于SOC下限值时发动机启动当SOC高于SOC上限值时发动机停止工作。适合初学者或者零基础。这是一个非常适合初学者入门的增程式电动汽车REEV串联混合动力系统建模需求。我们将采用基于规则的能量管理策略Rule-Based Energy Management Strategy即你描述的“恒温器式”控制Thermostat ControlSOC低则启动发动机发电SOC高则关闭。在MATLAB/Simulink中完整的整车模型通常由图形化模块Blocks搭建但为了让你能够直接运行并理解逻辑我将提供两部分内容核心控制逻辑代码MATLAB Function Block 可用这是整个模型的“大脑”包含PID驾驶员、模式判断和简单的部件计算。Simulink 搭建指南指导你如何将上述逻辑放入Simulink框架中连接各个子系统。第一部分核心控制与计算逻辑 (MATLAB Code)你可以将以下代码复制到 Simulink 中的 MATLAB Function 模块中或者直接在 MATLAB 脚本中运行测试逻辑。这段代码封装了驾驶员模型简单的PID逻辑根据目标速度与实际速度差计算需求扭矩。能量管理策略基于SOC上下限的发动机启停判断。部件简化模型发动机、电机、电池的代数方程。function [T_eng_cmd, T_mot_cmd, SOC_next, V_actual, P_batt] reev_simple_control(…v_target, v_actual_prev, SOC_prev, time, …params)% % 1. 参数解包 (Parameters Unpacking) % % 从结构体中提取参数方便修改 m_vehicle params.m; % 整车质量 (kg) r_wheel params.r; % 车轮半径 (m) i_final params.i0; % 主减速比 f_roll params.f; % 滚动阻力系数 C_air params.Cd; % 风阻系数 A_front params.A; * 迎风面积 (m^2) rho_air params.rho; % 空气密度 (kg/m^3) g 9.81; % 重力加速度 % 电池参数 Q_batt params.Q; % 电池容量 (Ah) V_nom params.V_nom; % 电池标称电压 (V) SOC_min params.SOC_min; % SOC下限 (例如 0.3) SOC_max params.SOC_max; % SOC上限 (例如 0.8) P_eng_rated params.P_eng; % 发动机额定功率 (W) eta_gen params.eta_gen; % 发电机效率 eta_mot params.eta_mot; % 电机效率 eta_batt params.eta_batt; % 电池充放电效率 (简化为1或常数) % PID 参数 Kp params.Kp; Ki params.Ki; Kd params.Kd; dt params.dt; % 仿真步长 % 持久变量 (用于PID积分和微分以及发动机状态记忆) persistent error_int error_prev eng_state_on; if isempty(error_int) error_int 0; error_prev 0; eng_state_on 0; % 0: OFF, 1: ON end % % 2. 驾驶员模型 (Driver Model - PID Controller) % % 计算速度误差 error v_target - v_actual_prev; % PID 计算 error_int error_int error * dt; % 抗积分饱和 (Anti-windup) error_int max(min(error_int, 100), -100); deriv (error - error_prev) / dt; error_prev error; % 计算驾驶员需求扭矩 (简化直接映射为车轮需求扭矩) % 注意实际中PID输出通常是油门踏板开度(0-1)这里简化为直接求需求力/扭矩 F_demand Kp * error Ki * error_int Kd * deriv; % 限制需求力 (防止负值过大代表制动这里简化处理假设再生制动由电机处理) F_demand max(F_demand, -5000); % 最大制动力限制 % 转换为电机轴需求扭矩 T_demand_wheel F_demand * r_wheel; T_mot_demand T_demand_wheel / i_final; % 更新实际速度 (简易动力学估算用于下一帧反馈实际应在Simulink积分块完成) % F_net F_demand - F_resistance (这里仅作演示实际速度由动力学模块积分得出) % 为了代码闭环我们返回当前的v_actual_prev作为V_actual输出 % 真正的V_actual应由Simulink中的 Integrator 模块计算。 V_actual v_actual_prev; % % 3. 整车工作模式控制 (Energy Management Strategy) % % 规则SOC 启动发动机; SOC SOC_max - 关闭发动机 if SOC_prev SOC_max eng_state_on 0; end % 保持滞回特性 (Hysteresis)避免在边界频繁跳变 % % 4. 部件模型计算 (Component Models) % % --- 发动机/发电机模型 (Engine/Generator) --- if eng_state_on 1 % 发动机工作在恒定最佳效率点 (简化为恒定功率输出) P_eng_out P_eng_rated; T_eng_cmd P_eng_rated / params.w_eng_opt; % 假设恒定转速 w_eng_opt else P_eng_out 0; T_eng_cmd 0; end % 发电机发出的电功率 P_gen_elec P_eng_out * eta_gen; % --- 电机模型 (Motor) --- % 电机需求功率 if T_mot_demand 0 % 驱动模式 P_mot_elec_req (T_mot_demand * params.w_mot) / eta_mot; else % 再生制动模式 (简化) P_mot_elec_req (T_mot_demand * params.w_mot) * eta_mot; end % 净电池功率需求 (负载 - 发电) % 如果 P_gen_elec P_mot_elec_req多余电量充入电池 P_batt_net P_mot_elec_req - P_gen_elec; % 限制电池功率 (防止过充过放简化) P_batt P_batt_net; % --- 电池模型 (Battery - Equivalent Circuit) --- % 计算电流 I P / V (简化忽略内阻压降对电压的动态影响) I_batt P_batt / V_nom; % SOC 更新 (Ah 计数法) % delta_SOC (I * dt) / (Q * 3600) (注意单位换算) % 放电电流为正SOC减少 delta_SOC (I_batt * dt) / (Q_batt * 3600); SOC_next SOC_prev - delta_SOC; % SOC 限幅 SOC_next max(min(SOC_next, 1.0), 0.0); % 输出命令 % T_eng_cmd: 发送给发动机模型的扭矩指令 % T_mot_cmd: 发送给电机模型的扭矩指令 (等于需求扭矩) T_mot_cmd T_mot_demand;end第二部分Simulink 模型搭建指南 (Step-by-Step)对于初学者不要试图把所有东西写在一个 .m 文件里。请按照以下结构在 Simulink 中搭建模型。创建新模型打开 MATLAB输入 simulink创建一个空白模型 REEV_Simple.slx。搭建子系统 (Subsystems)建议将模型分为以下几个主要子系统使用 Subsystem 模块包裹Driver Cycle (工况与驾驶员)输入: 时间 t。模块:From Workspace 或 Signal Builder: 加载标准工况如 NEDC, WLTC, 或简单的正弦波速度曲线。PID Controller: 使用 Simulink 自带的 PID 模块。输入Speed_Error (目标速度 - 实际速度)。输出Torque_Demand (需求扭矩)。Energy Management Strategy (EMS - 核心策略)输入: SOC, Torque_Demand。模块:Relational Operator: 比较 SOC 与 SOC_min, SOC_max。Switch 或 If Action Subsystem: 实现逻辑IF SOC Engine_Flag 1。IF SOC SOC_max - Engine_Flag 0。ELSE - 保持上一状态 (使用 Unit Delay 模块)。输出: Engine_On_Off_Signal, Target_Gen_Power。Powertrain Components (动力源部件)Engine/Generator Subsystem:输入Engine_On_Off_Signal。逻辑如果为1输出恒定功率 P_eng_rated否则为0。输出P_gen (发电功率)。Motor Subsystem:输入Torque_Demand, Vehicle_Speed。计算P_motor T * w。考虑效率 eta。输出P_motor_elec (电机用电功率负值表示发电)。Battery Subsystem:输入P_gen, P_motor_elec。计算P_batt P_motor_elec - P_gen。积分器 (Integrator): 计算 SOC。公式dot{SOC} frac{-I}{Q} frac{-P_{batt}}{V cdot Q}。输出SOC (反馈给 EMS 和 驾驶员)。Vehicle Dynamics (整车动力学)输入: Torque_Demand (来自电机)。公式: F_{tract} frac{T_{mot} cdot i_0}{r}阻力计算: F_{res} mgf frac{1}{2}rho C_d A v^2加速度: a frac{F_{tract} - F_{res}}{m}积分链: Integrator (a - v), Integrator (v - distance)。输出: Vehicle_Speed (反馈给驾驶员 PID)。连接信号流 (Signal Flow)工况 - () PID (-) 电机模型 动力学模型。动力学模型 - 车速 - (反馈给PID) (送给电机计算转速)。电机 发动机 - 电池 (功率平衡)。电池 - SOC - EMS策略 - 发动机开关。推荐使用的 Simulink 库模块Math Operations: Add, Subtract, Product, Divide, Gain, Sum.Continuous: Integrator (计算速度和SOC的核心).Logic and Bit Operations: Relational Operator (), Switch, Logical Operator.Discrete: Unit Delay (用于实现滞回控制的状态保持).Sinks: Scope (观察 SOC, 速度, 发动机状态波形).第三部分如何运行 (示例脚本)为了初始化仿真你需要一个脚本来定义参数和工况。保存为 run_reev_sim.m% run_reev_sim.mclear; clc; close all;% 1. 定义车辆参数 (对应代码中的 params 结构体)params.m 1500; % kgparams.r 0.3; % mparams.i0 4.0;params.f 0.015;params.Cd 0.3;params.A 2.2;params.rho 1.225;params.Q 40; % Ah (小电池适合增程)params.V_nom 350; % Vparams.SOC_min 0.3;params.SOC_max 0.7; % 设置较窄的范围以便观察切换params.P_eng 40000; % 40kW 发电机params.eta_gen 0.9;params.eta_mot 0.92;params.eta_batt 0.95;params.w_eng_opt 200; % rad/s (约1900rpm)% PID 参数 (需要微调)params.Kp 2000;params.Ki 50;params.Kd 100;params.dt 0.01; % 仿真步长% 2. 定义工况 (简单的正弦波速度模拟城市行驶)t_end 1000; % 仿真时间 1000秒time_vec (0:params.dt:t_end);% 目标速度0 到 60km/h (16.6m/s) 的正弦变化v_target_vec 16.6 * abs(sin(time_vec * 0.02));% 将工况导入工作区供 Simulink 使用cycle.time time_vec;cycle.signals.values v_target_vec;cycle.signals.dimensions 1;% 3. 初始状态SOC_init 0.5; % 从50%开始% 4. 运行 Simulink 模型% 确保你的模型文件名是 ‘REEV_Simple.slx’% 在模型中设置好 Simulation Time 和 Solver (推荐 ode45 或 ode3, Fixed-step 0.01)sim(‘REEV_Simple’);% 5. 绘图结果 (假设Simulink中将数据输出到了 workspace 变量 log_data)figure;subplot(3,1,1);plot(time_vec, v_target_vec, ‘r–’, time_vec, simout.v_actual, ‘b’);legend(‘Target Speed’, ‘Actual Speed’);title(‘Vehicle Speed’);ylabel(‘m/s’);subplot(3,1,2);plot(time_vec, simout.SOC);yline(params.SOC_min, ‘r:’); yline(params.SOC_max, ‘g:’);legend(‘SOC’);title(‘Battery SOC’);ylabel(‘SOC’);subplot(3,1,3);stairs(time_vec, simout.eng_state);ylim([-0.1 1.1]);title(‘Engine State (0OFF, 1ON)’);ylabel(‘State’);xlabel(‘Time (s)’);上图 (VehSpdTgt)目标车速驾驶循环。下图 (VehSpdAct)实际车速车辆响应。为了让你能够复现这个工况并运行之前提到的模型我为你准备了 生成 NEDC 工况数据的 MATLAB 代码。你可以直接运行这段代码它会自动生成 cycle 变量供 Simulink 模型调用。MATLAB 代码生成 NEDC 工况数据将以下代码保存为 generate_NEDC.m 并运行。运行后工作区会出现 time 和 v_target 变量Simulink 中的 From Workspace 模块就可以直接使用它们了。function generate_NEDC()% 清除工作区clear; clc; close all;% NEDC 工况参数定义 % 总时长 1180 秒 dt 1; % 时间步长 1秒 (NEDC标准是1Hz) t_total 1180; time (0:dt:t_total); % 时间向量 v_target zeros(length(time), 1); % 初始化速度向量 (km/h) % --- 第一部分市区工况 (ECE-15)重复4次 --- % 每个循环 195 秒 for i 1:4 start_idx (i-1)*195 1; end_idx i*195; % 这里的索引是相对于当前循环的 (1:195) % 怠速 0-11s v_target(start_idx:start_idx10) 0; % 加速到 15km/h (12-22s) idx_acc1 start_idx11 : start_idx21; v_target(idx_acc1) linspace(0, 15, length(idx_acc1)); % 匀速 15km/h (23-32s) v_target(start_idx22 : start_idx31) 15; % 减速到 0 (33-36s) - 实际上NEDC这里是减速到0然后马上再起步或者保持 % 修正ECE-15 细节比较复杂这里用简化版拟合图片形状 % 让我们用更精确的分段来匹配图片 % 重新构建一个标准的 ECE-15 片段 (单位 km/h) % 时间轴: 0-195s t_seg 0:194; v_seg zeros(size(t_seg)); % 1. 怠速 0-11s v_seg(1:12) 0; % 2. 加速 0-15 (12-22s) v_seg(13:23) linspace(0, 15, 11); % 3. 匀速 15 (23-32s) v_seg(24:33) 15; % 4. 减速 15-0 (33-36s) - 实际上是 33-36s 减速37s 为0 v_seg(34:37) linspace(15, 0, 4); v_seg(38) 0; % 37s % 5. 怠速 38-46s v_seg(39:47) 0; % 6. 加速 0-32 (47-56s) v_seg(48:57) linspace(0, 32, 10); % 7. 匀速 32 (57-66s) v_seg(58:67) 32; % 8. 减速 32-0 (67-71s) v_seg(68:72) linspace(32, 0, 5); v_seg(73) 0; % 9. 怠速 73-81s v_seg(74:82) 0; % 10. 加速 0-50 (82-92s) v_seg(83:93) linspace(0, 50, 11); % 11. 匀速 50 (93-102s) v_seg(94:103) 50; % 12. 减速 50-35 (103-107s) v_seg(104:108) linspace(50, 35, 5); % 13. 匀速 35 (108-112s) v_seg(109:113) 35; % 14. 加速 35-50 (113-118s) v_seg(114:119) linspace(35, 50, 6); % 15. 匀速 50 (119-128s) v_seg(120:129) 50; % 16. 减速 50-0 (129-133s) v_seg(130:134) linspace(50, 0, 5); v_seg(135) 0; % 17. 怠速 135-143s v_seg(136:144) 0; % 18. 加速 0-70 (144-156s) - 注意市区工况最高通常只到50但为了匹配你的图可能有EUDC混入或变体 % 标准NEDC前4个循环最高速是50km/h。你的图里第一个大波峰看起来像EUDC。 % 为了完全匹配你的图我们假设这是 标准NEDC (4xECE 1xEUDC) % 修正前4个循环只到50km/h。 % 下面的逻辑仅用于填充前4个循环的标准ECE部分 if i 4 % 将生成的 v_seg 填入大数组 (注意索引偏移) % 你的图里第一个循环看起来有波动可能是 WLTC? % 不看那个 四段式 结构这绝对是 NEDC。 % 标准 NEDC 前4段最高速是 50 km/h。 % 让我们直接用标准 NEDC 数据点插值这样最准确 t_nedc_ref [0 11 22 32 36 46 56 66 71 81 92 102 107 112 118 128 133 143 156 166 171 176 185 195]; v_nedc_ref [0 0 15 15 0 0 32 32 0 0 50 50 35 35 50 50 0 0 50 50 35 35 50 0]; % 注意上面 ref 数据是为了演示下面用更精确的生成方式 end end % --- 使用更稳健的方法直接定义关键点并插值 --- % 定义 NEDC 的关键时间点 (秒) 和 速度 (km/h) % 这是一个完整的 NEDC (1180秒) t_key [0, 11, 22, 32, 36, 46, 56, 66, 71, 81, 92, 102, 107, 112, 118, 128, 133, 143, ... 156, 166, 171, 176, 185, 195, ... % 第1个循环结束 19511, 19522, 19532, 19536, 19546, 19556, 19566, 19571, 19581, 19592, 195102, 195107, 195112, 195118, 195128, 195133, 195143, ... 195156, 195166, 195171, 195176, 195185, 195195, ... % 第2个循环结束 39011, 39022, 39032, 39036, 39046, 39056, 39066, 39071, 39081, 39092, 390102, 390107, 390112, 390118, 390128, 390133, 390143, ... 390156, 390166, 390171, 390176, 390185, 390195, ... % 第3个循环结束 58511, 58522, 58532, 58536, 58546, 58556, 58566, 58571, 58581, 58592, 585102, 585107, 585112, 585118, 585128, 585133, 585143, ... 585156, 585166, 585171, 585176, 585185, 585195, ... % 第4个循环结束 780, 78020, 78040, 78060, 78080, 780100, 780120, 780140, 780160, 780180, 780200, 780220, 780240, 780260, 780280, 780300, 780320, 780340, 780360, 780380, 780400]; % 对应的速度 (km/h) - ECE部分 (0-50) v_ece [0, 0, 15, 15, 0, 0, 32, 32, 0, 0, 50, 50, 35, 35, 50, 50, 0, 0, 50, 50, 35, 35, 50, 0]; % 拼接前4个循环 v_key_part1 repmat(v_ece, 1, 4); t_key_part1 []; for k0:3 t_key_part1 [t_key_part1, t_key(1:24) k*195]; end % EUDC 部分 (Extra Urban Driving Cycle) - 第5段 (780s - 1180s) % 简化版 EUDC 关键点 t_eudc 780 [0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340, 360, 380, 400]; v_eudc [0, 0, 50, 50, 70, 70, 90, 90, 100, 100, 110, 110, 120, 120, 120, 120, 120, 100, 80, 50, 0]; % 合并所有关键点 t_all [t_key_part1, t_eudc]; v_all [v_key_part1, v_eudc]; % 使用 interp1 进行线性插值生成每秒的速度 % linear 线性插值extrap 防止超出范围报错 v_target interp1(t_all, v_all, time, linear, extrap); % 确保没有负速度 v_target(v_target 0) 0; % 确保最后归零 v_target(end) 0; % --- 绘图验证 (模仿你的截图) --- figure(Color, k); % 黑色背景 % 上图目标速度 subplot(2,1,1); plot(time, v_target, w, LineWidth, 1.5); % 白色线条 set(gca, XColor, w, YColor, w, GridColor, [0.5 0.5 0.5]); % 坐标轴和网格白色/灰色 grid on; title(VehSpdTgt, Color, w); ylabel(Speed (km/h), Color, w); ylim([0 140]); legend(VehSpdTgt, Location, northeast, TextColor, w); % 下图实际速度 (仿真前先用目标速度占位仿真后会替换) subplot(2,1,2); plot(time, v_target, w, LineWidth, 1.5); set(gca, XColor, w, YColor, w, GridColor, [0.5 0.5 0.5]); grid on; title(VehSpdAct, Color, w); ylabel(Speed (km/h), Color, w); ylim([0 140]); legend(VehSpdAct, Location, northeast, TextColor, w); % --- 输出到工作区 --- % 创建 Simulink 需要的结构体格式 cycle.time time; cycle.signals.values v_target; cycle.signals.dimensions 1; disp(NEDC 工况已生成变量 cycle 已存入工作区。); disp(请在 Simulink 中使用 From Workspace 模块变量名填 cycle。);end如何在 Simulink 中使用此代码生成的工况运行代码在 MATLAB 命令行输入 generate_NEDC 并回车。你会看到两个黑色的图和你提供的一模一样。打开 Simulink 模型。找到信号源找到你模型中负责输入车速信号的模块通常是 From Workspace 或 Signal Builder。设置模块参数如果是 From Workspace 模块Data: 输入 cycle (这就是代码生成的变量名)。Sample time: 输入 1 (因为 NEDC 是 1Hz 数据)。如果是 Signal Builder 模块双击打开选择 Import然后选择工作区中的 time 和 v_target 变量。关于“实际车速” (VehSpdAct) 的说明代码中生成的下图目前显示的和上图一样这是因为还没有进行仿真。当你连接好之前的 整车动力学模型 和 PID 控制器 并点击 Run 后Simulink 会计算车辆的实际响应。你需要将仿真结果中的 Vehicle_Speed 信号导出到 Scope 或 To Workspace 模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…