基于Q-learning的储能调度效益最大化:Matlab实现与参数调试全解析

能源市场里的“效益最大化”,表面上是低买高卖,但真正上手做就会发现难点从来不是“判断价格高低”,而是“做决策序列”:这一小时贪婪地把储能里所有电卖光,下一小时遇到更高价的时段就只能干瞪眼;低谷时段忍住不充,后面高峰的收益也无从谈起。这类问题用传统优化方法建模,通常得先把电价分布假定成某种已知形式,可实际电价受天气、负荷、输送约束等多重因素影响,很难用一个解析模型说清楚。

我最近把一个“基于Q-learning算法在能源市场中实现效益最大化研究(Matlab代码实现)”的课题完整跑了一遍,从环境建模、状态离散化、Q表训练到策略评估和参数调试,整个闭环都过了一遍。这篇文章就是把这套可复用的框架完整整理出来。文中以储能在分时电价下“低充高放”的调度场景为主线,这是能源市场里最直观,也最适合作为强化学习入门样例的问题。适合正在做储能调度、售电公司购售电决策、微电网能量管理相关课题的同学,也适合想开始学强化学习但暂时不想碰神经网络框架的朋友。

1. 把“效益最大化”改写成强化学习问题:状态、动作与奖励怎么定

1.1 一个具体场景:储能运营商的低充高放决策

假设有一个储能电站,容量2 MWh,最大充放电功率0.5 MW,往返效率0.92。它可以直接从电力市场按实时电价购电充电,也可以放电向市场售电。一天被切成24个小时,每个小时需要做一次决策:充、放、还是保持不动。目标不是“某一天的收益最高”,而是一个较长运行周期内的累计收益最高。

这个设定天然适合强化学习处理,因为它有三个特征:连续决策、存在延迟回报、物理约束明显。充电本身是花钱的,但它让未来高峰时段有电可放;单步贪心很容易出错,Q-learning学到的正是“把未来收益也算进来”的策略。延迟回报正是强化学习和普通监督学习最关键的分水岭,你无法给每一步决策一个独立正确的标签,只能靠长期累计收益来评判好坏。

储能场景还有一个好处:动作空间和状态空间可以控制得很小,适合用表格型Q-learning直接求解。实际课题里常见的“售电公司购售电决策”本质上也是一样的框架,只是把“储能SOC”换成“预测负荷”,把动作从“充放电功率”换成“批发电量档位”,核心逻辑完全通用。

1.2 为什么不用动态规划或预测优化,而是Q-learning

很多人第一反应是动态规划或者模型预测控制(MPC)。理论上都没问题,但都依赖“模型准确”这个前提。动态规划需要知道电价的状态转移概率;MPC需要滚动预测未来一段时间的电价和负荷,预测误差会直接转化为决策偏差。我最早做的一版就是用预测曲线加线性规划,历史数据上回测表现不错,换到另一段数据之后,策略收益明显下滑,原因就是电价分布变了,而模型没跟着变。

Q-learning是model-free的,不需要任何环境动力学模型,只从采样的“状态—动作—奖励—下一状态”经验中学习最优Q值。电力市场价格波动大、影响因素多、难以精确建模,但历史数据样本很充足,这正好落在Q-learning的强项区间。另一个实际考虑是实现门槛低:纯Matlab就能跑,不需要深度框架和GPU,写论文时作为基线方法非常合适,跑出来的策略还能拿来做对比。

1.3 时间差分、折扣回报与目标函数的等价关系

效益最大化最直接的目标函数是“运行期内所有时段收益之和”。强化学习里写成折扣累积回报:

G_t = r_t + γ·r_{t+1} + γ²·r_{t+2} + …

当γ=1时,在有限步长的episode内,两者等价。但实际训练时通常取γ=0.9~0.99,原因有两层:一是数学上,如果episode不是严格有限,γ<1才能保证累积回报收敛;二是数值上,折扣让远期信号对当前Q值更新的贡献逐渐减弱,训练过程更稳。可能有人担心γ取太小会变得短视,其实在储能日内调度这类问题里,关键延迟回报就是“低谷充电—高峰放电”,只要γ足够覆盖一个充放循环的时间尺度(比如0.95连续乘24小时,约等于0.29,远期权重虽然变小但仍有影响),策略就能学出来。

2. Q-learning更新机制梳理与Matlab参数初值选择

2.1 核心公式拆解

Q-learning的更新公式很简洁:

Q(s,a) ← Q(s,a) + α [ r + γ·max_{a'} Q(s',a') − Q(s,a) ]

Q值可以理解为“在状态s下选择动作a,之后每一步都走最优策略,能获得的折扣累计收益期望”。问题在于一开始我们根本不知道最优策略长什么样,所以算法用了一个递归思路:当前这一步真实拿到奖励r,再加上下一状态s'里能拿到的最大Q值,两者合起来作为这次更新的目标。括号里那部分叫时序差分误差,它衡量的是“这次实际体验比之前的估计好还是差”。

直观类比是外卖骑手熟悉片区:今天这单跑了多少钱是r,下一单去哪里等单最好参考max Q(s',a'),这次选择比预期好还是坏就看TD误差。α是学习率,决定对新信息的信任程度;γ是折扣因子,决定看多远。表格型Q-learning在满足状态动作对都被无限次访问、学习率逐步衰减的条件下可以收敛到最优策略。

2.2 状态离散化与Matlab数据结构设计

Matlab里做表格型Q-learning,第一步是把Q表存成矩阵。Q表的维度是“状态数 × 动作数”。状态本身可能不止一维,比如储能场景里包含电价档位、SOC档位、时段三个量。最常见的做法有两种:

第一种是直接用多维数组,比如Q = zeros(N_price, N_soc, 24, N_act),访问时写Q(pl, sl, hour, a),直观但后期状态变量多了会很难维护。

第二种是把多维状态编码成一个整数ID,用sub2ind合并,Q表只有一个维度是状态数,主循环里通过状态ID访问。我推荐第二种,代码更简洁,后续加状态维度也只是改编码函数。

离散化粒度要谨慎。电价分6~10档、SOC分10~20档、时段固定24,组合出来是几千到几万个状态,表格型Q-learning完全可以处理。但如果电价分100档、SOC分100档,状态数一下冲到24万级别,训练需要的时间会变得很难看。初学阶段宁可分粗一点,先把闭环跑通,再逐步加细网格。

2.3 三个关键超参数怎么定

这里给出我试过比较稳的一组初值:α=0.1,γ=0.95,ε从1.0按每episode乘以0.995衰减,最低0.05。具体数值可以微调,但背后逻辑值得说清楚。

参数推荐初值偏大的后果偏小的后果调参建议
α 学习率0.1更新震荡、Q值跳动大收敛极慢、训练量需求暴涨每次调整不超过2倍
γ 折扣因子0.95远期权重过大、小样本下不稳定只重眼前、学不出“充放循环”储能场景不低于0.9
ε 探索率1.0→0.05一直在乱跑、策略不稳定过早固化、学不到最优动作衰减慢比衰减快好

特别提醒一个经验:很多人看到γ=0.95觉得“也不大嘛”,但这是一个24小时决策问题,如果每次决策之间的间隔是1小时,那么跨一天的权重是0.95^24≈0.29,仍然有作用。如果还学不出低充高放,检查ε衰减速度,大概率是探索不够而不是γ太小。

3. Matlab代码分模块拆解:环境模拟、Q表训练与策略提取

3.1 程序整体结构

代码我分成三个模块:环境模拟器、Agent训练主循环、策略提取与评估。环境模拟器负责生成电价序列、执行动作、计算奖励、返回下一状态;Agent负责ε-greedy选动作和Q表更新;最后的评估阶段关闭探索,用纯贪心策略跑测试序列,和基准策略对比。

这是个很通用的分层。环境模块单独写,方便以后换真实电价数据;Agent模块单独写,方便以后替换成DQN或者其他强化学习方法。下面这版是完整可跑的核心训练循环骨架,我删掉了一些重复性检查代码,保留最关键逻辑。

%% 参数与超参数 rng(2024); % 固定随机种子,保证实验可复现 params.T = 24; params.dt = 1; params.cap = 2; % 储能容量,MWh params.pmax = 0.5; % 最大充/放电功率,MW params.eta = 0.92; % 往返效率 params.N_price = 6; % 电价离散档数 params.N_soc = 11; % SOC离散档数:0%,10%,...,100% params.N_act = 5; % 5个动作:大充、小充、保持、小放、大放 alpha = 0.1; gamma = 0.95; epsilon = 1.0; epsilon_min = 0.05; decay = 0.995; max_episode = 2000; nS = params.N_price * params.N_soc * params.T; Q = zeros(nS, params.N_act);

3.2 环境模拟函数:电价生成与储能约束处理

电价是环境里最核心的随机因素。为了模拟真实波动,我在基础分时电价曲线上加了随机噪声。基础曲线可以理解成某地典型的分时电价模式,噪声则模拟供需变化带来的不确定性。

function price = gen_price(episode) base = [0.20,0.18,0.15,0.20,0.40,0.60,0.80,0.90,0.70,... 0.50,0.30,0.25,0.35,0.45,0.75,0.95,1.10,1.00,... 0.80,0.50,0.30,0.20,0.18,0.20]; noise = 0.05 * randn(size(base)); price = max(0.10, base + noise); end

注意这里的randn每次调用都生成不同噪声,所以每个episode都是一个新环境。这其实也对应了现实:每天的现货市场价格都不完全一样。如果希望结果可复现,可以在主脚本里固定rng。

执行动作的函数里,最重要的部分是约束处理。动作转成功率后,要先检查SOC是否会越界。以充电为例:假设当前SOC是0.9,容量2MWh,最多还能充0.2MWh,而动作要求大功率充0.5MW一个小时,那就不能全量执行,实际功率要截断到0.2MWh对应的功率。放电同理。越界时除了截断功率,还要给一个明显的负奖励惩罚,让agent把这些动作视为低价值选项。

function [soc_next, reward] = simulate_step(soc, p, price, params) % p > 0 表示放电,p < 0 表示充电 if p > 0 max_disch = soc * params.cap / params.dt; p_actual = min(p, max_disch); reward = p_actual * price * params.dt; soc_next = soc - p_actual / (params.eta * params.cap); else max_chg = (1 - soc) * params.cap / params.dt; p_actual = max(p, -max_chg); reward = p_actual * price * params.dt; % p为负,所以是成本 soc_next = soc - p_actual * params.eta / params.cap; end soc_next = min(max(soc_next, 0), 1); end

效率模型我这里做了简化,把η当成“往返效率”来折算。实际项目里如果设备手册给了充电效率和放电效率两个值,拆开写就行,代码结构不用变。

3.3 Agent训练主循环:ε-greedy与Q表更新

训练主循环的核心部分如下。状态编码用sub2ind将电价档、SOC档、时段合并成一个ID,Q表访问就变成Q(sid, a)。更新时用下一状态的max(Q(sid_next, :))作为未来价值估计。

for ep = 1:max_episode price = gen_price(ep); soc = 0.3; total_reward = 0; for h = 1:params.T pl = discretize(price(h), linspace(0.1, 1.2, params.N_price+1)); sl = min(floor(soc / (1/(params.N_soc-1))) + 1, params.N_soc); sid = sub2ind([params.N_price, params.N_soc, params.T], pl, sl, h); if rand < epsilon a = randi(params.N_act); else [~, a] = max(Q(sid, :)); end p = actions(a); % 例如 [-0.5,-0.25,0,0.25,0.5] [soc_next, reward] = simulate_step(soc, p, price(h), params); pl_next = discretize(price(max(h+1, params.T)), ... linspace(0.1, 1.2, params.N_price+1)); sl_next = min(floor(soc_next / (1/(params.N_soc-1))) + 1, params.N_soc); sid_next = sub2ind([params.N_price, params.N_soc, params.T], ... pl_next, sl_next, min(h+1, params.T)); Q(sid, a) = Q(sid, a) + alpha * (reward + gamma * max(Q(sid_next, :)) - Q(sid, a)); soc = soc_next; total_reward = total_reward + reward; end epsilon = max(epsilon_min, epsilon * decay); end

这段代码里有几个细节容易踩坑。第一个是discretize返回的是档位编号,本身就落在1到N区间,正好可以直接用作索引,不需要再+1。第二个是最后一步的下一状态,由于没有第25个时段,我直接让h_next = min(h+1, T),也就是最后一个时刻状态还是自己,这样Q更新不会越界。第三个是sid_next计算时,如果h+1超过24,就用24时刻的档位,这是一个简化处理,不影响整体训练目标。

3.4 训练后的策略提取与结果验证

训练结束后,把探索关掉,用纯贪心策略跑测试序列:

[~, best_action] = max(Q, [], 2); train_reward_history = ... % 在训练循环里记录每个episode的total_reward

仅仅看训练收益曲线上升还不够,还要验证学出来的策略是否符合物理直觉。我最常用的办法是挑几个典型状态打印最优动作:深夜3点、低电价、SOC为0.3时,最优动作应该是充电;下午两点、高电价、SOC为0.8时,最优动作应该是放电。如果连这种常识都没有学出来,基本可以断定是建模或调参出了问题,赶紧回查状态编码和奖励函数。

更严格的验证是和基准策略对比,至少要跑三组:完全不参与市场(收益恒为0)、保持SOC在50%不变、每个时段随机选动作。Q-learning策略在每个测试序列上的收益都必须稳定高于这三组基准,才能说明“效益最大化”真的有效。

4. 训练不收敛怎么办:六个调试场景与参数调整实录

4.1 问题一:Q表“学不动”或收益曲线一动不动

症状:训练了500个episode,收益曲线是一条直线,Q表数值几乎没变化。先别急着怀疑算法出了问题,最常见的原因是奖励尺度太小。假设每次决策收益在0.01元量级,α只有0.1,TD误差又小,更新后Q表变化几乎可以忽略。

解决办法是把收益单位放大,或者对奖励做归一化。比如把电价单位从“元/kWh”改成“百元/MWh”,收益数值就从0.01变成1左右。训练脚本里我习惯在所有计算完成之后再归一化,而不是每个时段都除一次,避免引入尺度混乱。

4.2 问题二:学习曲线剧烈震荡、Q值来回跳

如果训练曲线不是一条平滑上升曲线,而是上下乱跳,先降低α。α=0.1在多数问题上都能用,但如果奖励尺度较大,0.1的更新步长会产生明显震荡。可以直接把α降到0.03再试。另一个原因是γ设置过大,在奖励变化剧烈的环境下,稍大的γ会把噪声放大。

我自己的经验是:学习曲线允许前期剧烈波动,但后期要明显收敛。后30%的训练里如果还在大幅波动,多半是参数问题,不是环境随机性太大。

4.3 问题三:探索不足,过早固化到次优策略

症状很有趣:Q表看起来收敛了,收益也不错,但最佳动作几乎只有“保持”和“小功率放电”,大功率动作几乎没有被选过。这就是ε衰减太快导致的探索不足。比如ε从1.0按0.99衰减,到300个episode时已经接近0.05,后面全都走贪心路径,极端动作没被充分尝试。

两个补救办法:一是把衰减系数改成0.998甚至0.999,加长探索期;二是乐观初始值技巧,把所有Q值初始化成5而不是0,让每个动作在还没被访问时都看起来“很有前途”,agent更愿意去试。

4.4 问题四:测试集收益波动大,单次结果没法看

测试时用固定策略跑,但因为电价噪声是随机生成的,单次收益差异可能很大。这不是过拟合,而是环境本身的随机性。正确的评估方式是固定多个随机种子,各跑若干次,取平均收益和标准差。为了公平对比,基准策略也必须用同一组随机种子。

如果平均收益确实比基准高,但标准差也很大,说明策略本身不稳定。这时候可以考虑在动作集里加入更保守的档位,比如把原来的大功率放电拆成“大功率”和“中功率”两档,让agent在不确定时可以选择更稳的动作。

4.5 常见错误速查表

症状可能原因快速排查方法
Q表几乎不变奖励尺度太小打印奖励的均值和方差,确认不是0.001级别
收益曲线发散α偏大检查Q表是否有快速增长的异常项
最优动作始终是“不动”探索不足或奖励引导过弱看Q表中各状态最佳动作分布是否单一
SOC长期卡在0或1约束处理有误检查实际功率是否正确截断,越界惩罚是否生效
测试收益远低于训练电价噪声太大或评估次数过少固定多组随机种子取平均

4.6 判断“效益最大化”是否有效的最终标准

不要只盯着训练曲线。最终的衡量标准是对比实验:Q-learning策略、随机策略、固定50% SOC不动作策略,在同样一组测试电价序列上的平均收益。只有当Q-learning显著超过其他基准,并且收益的标准差在可接受范围内,才能说明算法真的学会了在能源市场里做有利决策。

还有一个容易被忽略的细节:检查训练集和测试集不能重叠。如果你的电价序列生成函数是带随机噪声的,每次生成都是一组新数据,天然不存在重叠问题。但如果用的是固定历史数据,一定要按时间切分,前70%训练后30%测试,否则结果虚高没有意义。

5. 往实用方向扩展:DQN升级、多智能体与真实数据接入

5.1 从Q表到DQN:连续状态空间的升级

表格型Q-learning最明显的天花板是状态空间。当状态变量超过四五个、每个变量离散粒度又不能太粗时,Q表规模会爆炸。比如把电价连续化、SOC连续化,再叠加“上一时段动作”这类记忆变量,表格就撑不住了。

这时候可以升级到DQN,用神经网络逼近Q(s,a)。Matlab的深度学习工具箱提供了完整的网络搭建、训练和推理接口,改动逻辑其实很清晰:一是增加经验回放缓存区,把训练中的“状态、动作、奖励、下一状态”四元组存下来,随机采样更新;二是增加目标网络,定期同步参数,缓解单网络自举导致的震荡。DQN的收敛性比表格型Q-learning需要更多调参,但它能把状态空间从几千扩展到几十万甚至更高。

5.2 多智能体与安全约束:更接近真实市场

现实中能源市场不是一家储能独自面对随机电价,而是多个主体同时决策。多智能体Q-learning是一个自然延伸方向,但要注意一个坑:市场电价会反过来受所有智能体决策的影响,环境对每个agent而言都是非平稳的,独立Q-learning在这种设定下收敛性没有保证。如果要做,建议从对称参与者的小规模仿真入手,并引入“经验共享”或“对手策略建模”的手段。

安全约束是另一个实用方向。Q-learning本身不保证每一步决策都满足硬约束,训练中的越界惩罚只能减少越界概率,不能彻底禁止。在实际工程里,可以在训练好的策略外层加一个安全过滤器:任何会被判定为越界的动作一律替换成最接近的安全动作。这个思路类似强化学习里的“安全层”概念,代码实现成本很低。

5.3 接入真实历史数据的三点现实建议

如果想把Demo升级成真正的研究实验,关键是把“模拟电价生成函数”替换成真实历史电价序列。这时候有三点经验值得记住。

第一,必须按时间顺序划分训练集和测试集,不能用随机打乱的方式,否则会引入未来信息泄漏。第二,真实电价存在明显的季节性和趋势性,直接用十年前的数据训练去决策下个月没有意义,建议用滑动窗口:只取最近30天或者90天的数据训练,然后预测/决策下一个窗口。第三,如果运行周期很长、市场结构可能发生变化,可以考虑定期用新数据重训练Q表,或者做增量更新,让策略跟着市场状态漂移。

提示:以上扩展都不需要推翻现有代码框架,只要把环境模块的gen_price换成真实数据加载函数,把Q表更新换成神经网络训练循环,就是个完全不同的研究项目了。

最后分享一个我自己的实操体会。这个课题看起来是做“储能收益最大化”,但实际上真正难的不是算法实现,而是怎么定义一个可学习的序贯决策问题。把状态、动作、奖励边界划清楚了,Q-learning只是那个把策略逼出来的工具。如果你第一次跑通代码,建议做一个最简单的常识测试:直接打印出一组典型状态下的最优动作,看深夜低谷电价时agent是不是在充电、白天高峰时是不是在放电。如果连这一步都不过关,先别急着换复杂算法,把离散化粒度、奖励函数和探索衰减三个环节重新捋一遍,往往问题就出在这些地方。

相关新闻

Pi 1.0 原生MCP与Durable:终端编程代理从对话到持久化执行

Pi 1.0 原生MCP与Durable:终端编程代理从对话到持久化执行

如果你也在终端里用过 AI 编程代理&#xff0c;应该能感受到一个尴尬&#xff1a;它能写代码、能跑命令&#xff0c;但一关终端&#xff0c;上下文全丢。这个痛点卡了我很久。所以当我看到 Pi 1.0 正式发布&#xff0c;主打原生 MCP 和 Pi Durable 时&#xff0c;第一反应不是“…

2026/10/20 18:48:51 阅读更多 →
context-mode设计实战:从上下文管理到模式切换的工程化落地

context-mode设计实战:从上下文管理到模式切换的工程化落地

1. 从“context-mode”说起&#xff1a;一个被低估的工程概念第一次看到“context-mode”这个词&#xff0c;很多人会下意识地把它归到某个具体框架的配置项里&#xff0c;觉得无非是个开关或者枚举值。但如果你真正在多个项目里跟“上下文”打过交道&#xff0c;就会发现它其实…

2026/10/20 18:48:51 阅读更多 →
面向对象设计实战:从封装多态到SOLID原则落地

面向对象设计实战:从封装多态到SOLID原则落地

1. 对象思维是一道分水岭我面试过不少人&#xff0c;聊到“面向对象的编程设计”&#xff0c;背概念都能背得滚瓜烂熟&#xff1a;封装、继承、多态&#xff0c;三大特征如数家珍。但一旦落到实际项目里&#xff0c;写出来的代码还是一把梭——几百行的方法&#xff0c;到处是i…

2026/10/20 18:48:51 阅读更多 →

最新新闻

果办OfficeAce真活实测:多平台数据清洗与跨部门协作全记录

果办OfficeAce真活实测:多平台数据清洗与跨部门协作全记录

上周四下午&#xff0c;我做了一件过去打死都不会干的事——把手头真正要交付的工作&#xff0c;原封不动地交给了一套还没怎么被正经活儿考验过的办公套件&#xff1a;果办OfficeAce。办公室那台老电脑里装的旧表格软件&#xff0c;在关键时刻当着我的面崩了&#xff0c;恢复回…

2026/10/20 19:25:55 阅读更多 →
响应式数据处理框架rea:依赖追踪与增量更新原理及实践

响应式数据处理框架rea:依赖追踪与增量更新原理及实践

1. 从“rea”这个标题说起&#xff1a;一个极简命名背后的完整项目拆解“rea”这个标题&#xff0c;第一次看到的时候确实让人摸不着头脑。三个字母&#xff0c;没有上下文&#xff0c;没有说明&#xff0c;放在任何技术社区里都像是一个随手敲下的占位符。但恰恰是这种极简命名…

2026/10/20 19:25:55 阅读更多 →
从硬技能到元技能:构建可迁移的个人技能系统

从硬技能到元技能:构建可迁移的个人技能系统

1. 从“skills”这个词说起&#xff1a;它到底指什么“skills”这个词最近频繁出现在各种讨论里&#xff0c;很多人第一反应是“技能”这个翻译&#xff0c;但如果你只把它理解成简历上那一栏“掌握技能”&#xff0c;那就把问题想简单了。我做了十多年一线项目&#xff0c;带过…

2026/10/20 19:25:55 阅读更多 →
技能系统架构设计与实现:从定义、注册到执行的全链路解析

技能系统架构设计与实现:从定义、注册到执行的全链路解析

1. 从“skills”这个标题说起&#xff1a;它到底在指什么“skills”这个词看起来简单到几乎不像一个项目标题&#xff0c;但恰恰是这种极简的命名方式&#xff0c;在技术社区里往往藏着最值得深挖的东西。我第一次看到这个标题的时候&#xff0c;脑子里蹦出来的第一个判断是&am…

2026/10/20 19:25:55 阅读更多 →
AI辅助编程项目为何容易烂掉?上下文契约是关键解药

AI辅助编程项目为何容易烂掉?上下文契约是关键解药

1. 为什么AI辅助编程的项目更容易“烂掉”先说一个我观察到的现象&#xff1a;身边不少朋友用AI写代码之后&#xff0c;项目初期推进速度快得惊人&#xff0c;两三天就能搭出一个能跑的原型。但过了一两个月再去看那些项目&#xff0c;十有八九已经变成了一团乱麻——没人敢改&…

2026/10/20 19:25:55 阅读更多 →
数据结构(笔记)——顺序栈

数据结构(笔记)——顺序栈

1.顺序栈的定义顺序栈是 栈的一种顺序存储结构&#xff0c;即用 一段连续的存储空间&#xff08;通常是数组&#xff09;来实现栈。 栈的特点是 先进后出&#xff08;LIFO, Last In First Out&#xff09;&#xff1a;只能在一端&#xff08;称为栈顶 Top&#xff09;进行插入和…

2026/10/20 19:24:51 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →