python的工业过程控制场景模拟第五十篇:水力闸门液位流量数据,拟合水位—泄流量数学模型。
水力闸门水位—泄流量数学模型拟合系统 —— 基于 OOP 的曲线回归实战水利枢纽的中控室里操作员盯着屏幕上密密麻麻的闸门开度和水位数据手动对照着一张十几年前印的水位—流量关系曲线图来估算下泄流量。这张图还是按当时的河床断面画的这些年泥沙淤积、闸底板磨损曲线早就偏了。但没人重新测过——因为传统率定方法需要水文站的人带着ADCP声学多普勒流速剖面仪来现场测流一条船一天最多测几条垂线凑够一组完整曲线要花好几周。其实DCS里积累了几年连续的闸门开度、上下游水位、功率/电流数据这些数据本身就藏着那条曲线的答案——只是没人把它们挖出来。—— 哈尔滨工程大学《工业过程控制》课程核心思想延伸一、实际应用场景描述在水利枢纽、城市防洪排涝、灌区渠首等场景中水力闸门是最核心的调节设备。其控制目标通常是维持上游水位恒定防洪/蓄水或按调度指令精确下泄流量生态补水/发电。典型的闸门监控系统架构如下┌──────────────────────────────────────────────┐│ 闸门计算机监控系统 (PLC/DCS) ││ ││ 超声波/雷达液位计 ──→ 上游水位 H_up (m) ││ 超声波/雷达液位计 ──→ 下游水位 H_down (m) ││ 开度传感器 ──────→ 闸门开度 H_gate (m) ││ 流量计(可选) ─────→ 实际流量 Q_meas (m³/s) ││ ││ ┌──────────────────────────────────────────┐ ││ │ 水位—流量数学模型 │ ││ │ Q f(H_up, H_down, H_gate, ...) │ ││ │ │ ││ │ 已知: 上游水位 闸门开度 → 推算下泄流量 │ ││ │ 或: 目标流量 → 反算所需闸门开度 │ ││ └──────────────────────────────────────────┘ ││ ││ 输出 ──→ 液压启闭机 ──→ 闸门开度调节 │└──────────────────────────────────────────────┘常见的水位—流量关系模型模型类型 公式形式 适用场景堰流公式 Q C \cdot L \cdot H^{3/2} 闸门完全开启自由溢流孔口出流 Q \mu \cdot A \cdot \sqrt{2gH} 闸门局部开启淹没出流实用堰经验式 Q K \cdot (H - H_0)^n 宽顶堰/实用堰多变量多项式 Q a_0 a_1H a_2H^2 ... 数据驱动拟合哈尔滨工程大学《工业过程控制》课程在第五章流体过程控制与建模中专门讨论了水力过程的数学描述水力过程的非线性特性使得精确机理建模困难。对于闸门泄流这类问题经典的堰流/孔口公式是第一性原理的起点但实际工程中由于边界条件复杂河床形态、闸墩形状、淹没度变化往往需要在机理框架基础上利用实测数据进行参数辨识和模型校正。这就是数据驱动的灰箱建模思路。二、引入痛点2.1 现场的真实困境场景 现场发生了什么 根因曲线过时 十年前的率定曲线现在算出来的流量和实际差了 20% 河床冲淤变化测流成本高 请水文局来测一次流一条垂线 5000 块 传统测流依赖专业设备和人员数据沉睡 SCADA 里存了几年的水位/流量数据没人用来更新模型 缺乏分析工具和方法调度纠纷 上游说放了 100 个流量下游说只收到 80 个 双方用的曲线不一样自动控制难 PID 要投自动但流量反馈不准只能手动 缺乏可靠的软测量模型2.2 核心矛盾机理模型给你正确的方向但参数不准黑箱模型给你准确的数字但不可解释。最优解是灰箱建模用物理公式确定模型结构用历史数据拟合未知参数。这样既有物理解释性又能适应现场变化。2.3 我们要解决什么用一段 Python 程序构建一个水力闸门水位—泄流量数学模型拟合系统实现1. 历史数据加载 —— 读取 SCADA 导出的水位、开度、流量数据2. 数据清洗 —— 剔除异常点、稳态筛选3. 模型拟合 —— 基于物理结构的参数辨识最小二乘法4. 多模型对比 —— 堰流/孔口/多项式选最优5. 精度评估 —— RMSE、R²、残差分析6. 可视化 —— 拟合曲线 实测散点 残差图三、核心逻辑讲解3.1 理论基础闸门泄流物理模型本工具基于哈工程《工业过程控制》第五章流体过程控制与建模① 自由溢流堰流当闸门全开、水流呈自由跌落状态时Q C_d \cdot L \cdot \sqrt{2g} \cdot H^{3/2}其中 H 是堰上水头上游水位 - 堰顶高程 C_d 是流量系数 L 是堰宽。② 孔口出流闸门局部开启Q \mu \cdot b \cdot h \cdot \sqrt{2g(H_{up} - H_{down})}其中 b 是闸宽 h 是闸门开度 \mu 是孔口流量系数。③ 实用经验模型灰箱Q K \cdot (H_{up} - H_{threshold})^\alpha \cdot f(\text{gate})④ 参数辨识最小二乘法对于线性化后的模型 y X\beta 最小化残差平方和\hat{\beta} (X^T X)^{-1} X^T y3.2 系统数据流┌──────────────────────────────────────────────┐│ SCADA 历史数据 CSV ││ (timestamp, H_up, H_down, gate, Q) │└──────────────┬───────────────────────────────┘│┌──────────────▼───────────────┐│ ① 数据加载 清洗 ││ 去异常、稳态筛选 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ② 特征工程 ││ 构造 H_up, ΔH, gate 等特征 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ③ 模型拟合 ││ 最小二乘 / 非线性优化 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ④ 精度评估 ││ RMSE / R² / 残差分析 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ⑤ 可视化 报告 ││ 拟合曲线 残差诊断 │└──────────────────────────────┘四、代码讲解面向对象设计4.1 类结构总览类名 职责 设计模式FlowRecord 单条流量数据记录dataclass 值对象GateSpec 闸门物理规格值对象 值对象ModelConfig 模型配置值对象 值对象FitResult 拟合结果dataclass 值对象DataLoader CSV 数据加载与清洗 封装FeatureEngineer 特征工程 策略模式PhysicalModel 物理机理模型基类 模板方法WeirModel 堰流模型 继承OrificeModel 孔口出流模型 继承PolynomialModel 多项式经验模型 继承ModelFitter 模型拟合器最小二乘 策略模式AccuracyEvaluator 精度评估器 封装CurveVisualizer 曲线可视化器 封装ReportGenerator 分析报告生成器 模板方法GateFlowModelingSystem 系统编排器聚合根 聚合根4.2 数据模型层from dataclasses import dataclass, fieldfrom typing import List, Dict, Optional, Tuple, Callablefrom enum import Enumimport numpy as npimport csvfrom pathlib import Pathfrom datetime import datetimefrom abc import ABC, abstractmethodclass ModelType(Enum):模型类型WEIR 堰流模型ORIFICE 孔口出流模型POLYNOMIAL 多项式经验模型dataclass(frozenTrue)class FlowRecord:单条流量数据记录 —— 值对象timestamp: datetimeh_up: float # 上游水位 (m)h_down: float # 下游水位 (m)gate_opening: float # 闸门开度 (m)flow_rate: float # 泄流量 (m³/s)temperature: float 20.0 # 水温 (℃)dataclass(frozenTrue)class GateSpec:闸门物理规格 —— 值对象gate_id: strwidth: float 10.0 # 闸宽 (m)crest_elevation: float 100.0 # 堰顶高程 (m)max_opening: float 5.0 # 最大开度 (m)discharge_coeff: float 0.62 # 理论流量系数dataclass(frozenTrue)class ModelConfig:模型配置steady_state_window: int 10 # 稳态判定窗口 (个采样点)max_change_rate: float 0.05 # 最大变化率 (m/s)outlier_std_multiplier: float 3.0 # 异常值判定 (标准差倍数)poly_degree: int 3 # 多项式阶数dataclassclass FitResult:拟合结果model_type: ModelTypeparameters: Dict[str, float]rmse: float 0.0r_squared: float 0.0residual_mean: float 0.0residual_std: float 0.0n_samples: int 04.3 数据加载与清洗class DataLoader:流量数据加载与清洗CSV 格式:timestamp,h_up,h_down,gate_opening,flow_rate,temperature2024-06-01 08:00:00,105.2,102.1,2.5,45.8,22.5def __init__(self, config: ModelConfig None):self.config config or ModelConfig()self.records: List[FlowRecord] []def load_csv(self, file_path: str) - List[FlowRecord]:加载 CSV 数据self.records.clear()with open(file_path, r, encodingutf-8) as f:reader csv.DictReader(f)for row in reader:try:ts datetime.strptime(row[timestamp], %Y-%m-%d %H:%M:%S)except (ValueError, KeyError):continuetry:record FlowRecord(timestampts,h_upfloat(row.get(h_up, 0)),h_downfloat(row.get(h_down, 0)),gate_openingfloat(row.get(gate_opening, 0)),flow_ratefloat(row.get(flow_rate, 0)),temperaturefloat(row.get(temperature, 20.0)))self.records.append(record)except ValueError:continuereturn self.recordsdef clean_data(self, records: List[FlowRecord]) - List[FlowRecord]:数据清洗:1. 去除明显异常值 (流量为负或超过物理极限)2. 稳态筛选 (变化率小于阈值)3. 去除水位倒挂 (下游 上游且差值不合理)cleaned []for i, r in enumerate(records):# 规则1: 流量必须为正if r.flow_rate 0 or r.flow_rate 1000:continue# 规则2: 水位合理性head r.h_up - r.h_downif head 0 or head 30:continue# 规则3: 开度合理性if r.gate_opening 0 or r.gate_opening 10:continue# 规则4: 稳态判定 (与前一个点比较)if i 0:dt (r.timestamp - records[i-1].timestamp).total_seconds()if dt 0:dh_up abs(r.h_up - records[i-1].h_up)dh_down abs(r.h_down - records[i-1].h_down)dg abs(r.gate_opening - records[i-1].gate_opening)# 变化太快可能不是稳态if (dh_up / dt self.config.max_change_rate ordh_down / dt self.config.max_change_rate ordg / dt self.config.max_change_rate):continuecleaned.append(r)return cleaned4.4 特征工程class FeatureEngineer:特征工程构造模型输入特征:- head h_up - h_down (水头)- head_crest h_up - crest_elevation (堰上水头)- gate_ratio gate_opening / max_opening (相对开度)- sqrt_head, head^1.5, head^2 等非线性变换def __init__(self, gate_spec: GateSpec):self.spec gate_specdef build_features(self, records: List[FlowRecord]) - Tuple[np.ndarray, np.ndarray]:构建特征矩阵和目标向量Args:records: 清洗后的数据Returns:(X, y) 特征矩阵和目标流量n len(records)# 基础特征: [head, sqrt(head), head^1.5, gate_ratio]X np.zeros((n, 4))y np.array([r.flow_rate for r in records])for i, r in enumerate(records):head max(0.001, r.h_up - r.h_down) # 避免除零head_crest max(0.001, r.h_up - self.spec.crest_elevation)X[i, 0] headX[i, 1] np.sqrt(head)X[i, 2] head ** 1.5X[i, 3] r.gate_opening / self.spec.max_openingreturn X, ydef build_physical_features(self, records: List[FlowRecord]) - Tuple[np.ndarray, np.ndarray]:物理模型特征: 基于堰流/孔口公式的变换对于堰流: Q C * L * sqrt(2g) * H^1.5取对数: ln(Q) ln(C*L*sqrt(2g)) 1.5 * ln(H)n len(records)X np.zeros((n, 2))y np.log(np.array([max(0.001, r.flow_rate) for r in records]))for i, r in enumerate(records):head_crest max(0.001, r.h_up - self.spec.crest_elevation)X[i, 0] 1.0 # 截距项X[i, 1] np.log(head_crest)return X, y4.5 物理模型基类与派生类class PhysicalModel(ABC):物理模型基类 —— 模板方法模式定义统一的接口:- predict(): 根据输入预测流量- fit(): 拟合模型参数- equation(): 返回公式字符串abstractmethoddef predict(self, h_up: float, h_down: float, gate: float) - float:预测流量passabstractmethoddef fit(self, X: np.ndarray, y: np.ndarray) - Dict[str, float]:拟合参数passabstractmethoddef equation(self) - str:返回公式passclass WeirModel(PhysicalModel):堰流模型Q C_d * L * sqrt(2g) * (H - H_crest)^1.5待辨识参数: C_d (流量系数)def __init__(self, gate_spec: GateSpec):self.spec gate_specself.params {Cd: gate_spec.discharge_coeff}def predict(self, h_up: float, h_down: float, gate: float 0) - float:g 9.81head max(0, h_up - self.spec.crest_elevation)if head 0:return 0.0Q self.params[Cd] * self.spec.width * np.sqrt(2*g) * (head ** 1.5)return Qdef fit(self, X: np.ndarray, y: np.ndarray) - Dict[str, float]:基于对数线性化的最小二乘拟合ln(Q) ln(Cd * L * sqrt(2g)) 1.5 * ln(H)# X 应该是 [1, ln(H)] 的形式if X.shape[1] 2:return self.params# 最小二乘: beta (X^T X)^-1 X^T ytry:beta np.linalg.inv(X.T X) X.T yintercept beta[0]slope beta[1]# 从斜率验证 1.5 次方关系# 从截距恢复 Cdg 9.81log_term np.log(self.spec.width * np.sqrt(2*g))cd_estimated np.exp(intercept - log_term)self.params[Cd] max(0.1, min(1.0, cd_estimated))self.params[slope] slopeexcept np.linalg.LinAlgError:passreturn self.paramsdef equation(self) - str:Cd self.params.get(Cd, 0.62)return fQ {Cd:.4f} × {self.spec.width} × √(2×9.81) × (H - {self.spec.crest_elevation})^{{1.5}}class OrificeModel(PhysicalModel):孔口出流模型Q μ * b * h_gate * √(2g * (H_up - H_down))待辨识参数: μ (流量系数)def __init__(self, gate_spec: GateSpec):self.spec gate_specself.params {mu: 0.65}def predict(self, h_up: float, h_down: float, gate: float) - float:g 9.81head max(0, h_up - h_down)if head 0 or gate 0:return 0.0Q self.params[mu] * self.spec.width * gate * np.sqrt(2*g*head)return Qdef fit(self, X: np.ndarray, y: np.ndarray) - Dict[str, float]:线性化: Q / (b * gate * sqrt(2g*head)) μratios []for i in range(len(y)):x_row X[i]# X 的格式: [b*gate*sqrt(2g*head), ...]if x_row[0] 1e-6:ratios.append(y[i] / x_row[0])if ratios:self.params[mu] float(np.mean(ratios))return self.paramsdef equation(self) - str:mu self.params.get(mu, 0.65)return fQ {mu:.4f} × {self.spec.width} × h_gate × √(2×9.81×(H_up - H_down))class PolynomialModel(PhysicalModel):多项式经验模型Q a0 a1*H a2*H^2 a3*H^3 b*gate纯数据驱动不考虑物理结构def __init__(self, degree: int 3):self.degree degreeself.params {}def predict(self, h_up: float, h_down: float, gate: float) - float:head h_up - h_down# 简单多项式Q self.params.get(a0, 0)for i in range(1, self.degree 1):Q self.params.get(fa{i}, 0) * (head ** i)Q self.params.get(b_gate, 0) * gatereturn max(0, Q)def fit(self, X: np.ndarray, y: np.ndarray) - Dict[str, float]:多元线性回归try:beta np.linalg.inv(X.T X) X.T yself.params[a0] beta[0]for i in range(1, min(self.degree 1, len(beta))):self.params[fa{i}] beta[i]except (np.linalg.LinAlgError, IndexError):passreturn self.paramsdef equation(self) - str:terms [f{self.params.get(a0, 0):.3f}]for i in range(1, self.degree 1):c self.params.get(fa{i}, 0)terms.append(f{c:.3f}×H^{i})b self.params.get(b_gate, 0)terms.append(f{b:.3f}×gate)return Q .join(terms)4.6 模型拟合器class ModelFitter:模型拟合器 —— 策略模式支持:- 线性最小二乘- 非线性优化 (scipy)- 交叉验证def __init__(self, model: PhysicalModel):self.model modeldef fit(self, X: np.ndarray, y: np.ndarray) - Dict[str, float]:执行拟合return self.model.fit(X, y)def evaluate(self, X: np.ndarray, y: np.ndarray) - Tuple[float, float]:评估拟合精度Returns:(RMSE, R²)y_pred self._predict_all(X)rmse np.sqrt(np.mean((y - y_pred) ** 2))ss_res np.sum((y - y_pred) ** 2)ss_tot np.sum((y - np.mean(y)) ** 2)r2 1 - ss_res / (ss_tot 1e-10)return rmse, r2def _predict_all(self, X: np.ndarray) - np.ndarray:批量预测# 这是一个简化版本实际需要存储原始 records# 这里用参数直接计算return np.zeros(len(X)) # placeholder4.7 精度评估器class AccuracyEvaluator:精度评估器计算:- RMSE (均方根误差)- MAE (平均绝对误差)- R² (决定系数)- MAPE (平均绝对百分比误差)- 残差分布def evaluate(self, y_true: np.ndarray, y_pred: np.ndarray) - dict:全面评估Args:y_true: 实测流量y_pred: 预测流量Returns:评估指标字典residuals y_true - y_predrmse np.sqrt(np.mean(residuals ** 2))mae np.mean(np.abs(residuals))mape np.mean(np.abs(residuals / (y_true 1e-10))) * 100ss_res np.sum(residuals ** 2)ss_tot np.sum((y_true - np.mean(y_true)) ** 2)r2 1 - ss_res / (ss_tot 1e-10)return {rmse: round(rmse, 4),mae: round(mae, 4),mape: round(mape, 2),r_squared: round(r2, 4),residual_mean: round(np.mean(residuals), 4),residual_std: round(np.std(residuals), 4),n_samples: len(y_true)}4.8 曲线可视化器class CurveVisualizer:曲线可视化器生成:- 实测 vs 拟合散点图- 残差图- 水位-流量关系曲线def plot_fit(self, y_true: np.ndarray, y_pred: np.ndarray,model_name: str, output_path: str fit_result.png):绘制拟合效果try:import matplotlib.pyplot as pltfig, axes plt.subplots(1, 2, figsize(12, 5))# 左图: 实测 vs 拟合axes[0].scatter(y_true, y_pred, alpha0.6, s20)min_val min(y_true.min(), y_pred.min())max_val max(y_true.max(), y_pred.max())axes[0].plot([min_val, max_val], [min_val, max_val], r--, lw2)axes[0].set_xlabel(Measured Q (m³/s))axes[0].set_ylabel(Predicted Q (m³/s))axes[0].set_title(f{model_name}: Measured vs Predicted)axes[0].grid(True, alpha0.3)# 右图: 残差residuals y_true - y_predaxes[1].scatter(y_pred, residuals, alpha0.6, s20)axes[1].axhline(y0, colorr, linestyle--)axes[1].set_xlabel(Predicted Q (m³/s))axes[1].set_ylabel(Residual (m³/s))axes[1].set_title(Residual Plot)axes[1].grid(True, alpha0.3)plt.tight_layout()plt.savefig(output_path, dpi150)plt.close()except ImportError:print(⚠️ matplotlib 未安装跳过可视化)def plot_rating_curve(self, model: PhysicalModel, h_range: Tuple[float, float],gate: float, output_path: str rating_curve.png):绘制水位-流量关系曲线try:import matplotlib.pyplot as plth_vals np.linspace(h_range[0], h_range[1], 100)q_vals [model.predict(h, h - 1.0, gate) for h in h_vals]plt.figure(figsize(8, 5))plt.plot(h_vals, q_vals, b-, linewidth2)plt.xlabel(Upstream Water Level (m))plt.ylabel(Discharge (m³/s))plt.title(fRating Curve (Gate {gate}m))plt.grid(True, alpha0.3)plt.tight_layout()plt.savefig(output_path, dpi150)plt.close()except ImportError:pass4.9 分析报告生成器class ReportGenerator:分析报告生成器def generate_report(self, model_type: str, params: dict,metrics: dict, equation: str) - str:生成拟合报告lines [ * 65,f 水力闸门水位—泄流量模型拟合报告, * 65,, 【模型信息】,f 模型类型: {model_type},f 拟合方程: {equation},, 【辨识参数】]for k, v in params.items():lines.append(f {k}: {v:.6f} if isinstance(v, float) else f {k}: {v})利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

相关新闻

如何用WeChatFerry构建智能微信机器人:从零到实战的完整指南

如何用WeChatFerry构建智能微信机器人:从零到实战的完整指南

如何用WeChatFerry构建智能微信机器人:从零到实战的完整指南 【免费下载链接】WeChatFerry 微信机器人,可接入DeepSeek、Gemini、ChatGPT、ChatGLM、讯飞星火、Tigerbot等大模型。微信 hook WeChat Robot Hook. 项目地址: https://gitcode.com/GitHub_…

2026/10/18 11:43:21 阅读更多 →
现代C++ MQTT客户端库实战:设计原理与物联网应用集成

现代C++ MQTT客户端库实战:设计原理与物联网应用集成

1. 项目概述:为什么我们需要一个C的MQTT实战库?如果你正在用C做物联网项目,大概率已经和MQTT协议打过交道了。这个轻量级的发布/订阅消息协议,几乎成了物联网设备通信的“普通话”。但当你真正上手时,可能会发现一个尴…

2026/10/17 11:13:52 阅读更多 →
CSDN问答功能入口与使用全攻略

CSDN问答功能入口与使用全攻略

1. 问答功能入口位置详解作为CSDN平台创作者,掌握平台各项功能的入口位置是提升创作效率的基础。问答功能作为连接创作者与用户的重要桥梁,其入口设计直接影响着使用体验。今天我们就来全面解析CSDN问答功能的各个入口位置及使用场景。1.1 网页端主入口在…

2026/10/18 17:46:18 阅读更多 →

最新新闻

《初始化教条》终端渲染全解析:从TrueColor到ANSI动画的诗意代码

《初始化教条》终端渲染全解析:从TrueColor到ANSI动画的诗意代码

我是在某个深夜的终端模拟器里读完《初始化教条》完整渲染的。清屏指令落下那一刻,缓冲区的字符像退潮一样撤走,光标回到左上角原点,紧接着一行行诗随着渐变色的光晕浮现出来——不是静态文本,是带着呼吸节奏的逐字渲染。整个过程…

2026/10/18 18:05:51 阅读更多 →
agent-skills 实战:为 Claude Code 与 Cursor 构建可复用技能库

agent-skills 实战:为 Claude Code 与 Cursor 构建可复用技能库

1. 从“装完就吃灰”说起:agent-skills 到底解决了什么问题如果你最近半年一直在折腾 AI coding agents,大概率经历过这个循环:兴冲冲装好 Claude Code 或者 Cursor,敲了几个 prompt,觉得“也就那样”,然后…

2026/10/18 18:05:51 阅读更多 →
安全审计不是找漏洞,而是构建可信交付链

安全审计不是找漏洞,而是构建可信交付链

1. 安全审计不是“找漏洞比赛”,而是构建可信交付链的底层能力 “security-audit-skill”这个标题乍看像一个技术标签,但在我带过二十多个交付型研发团队、亲手做过137次代码级安全审计之后,越来越确信:它根本不是某种可速成的“…

2026/10/18 18:05:51 阅读更多 →
HTML+CSS+JS实战:丝芙兰风格购物商城期末作业从0到1

HTML+CSS+JS实战:丝芙兰风格购物商城期末作业从0到1

每年期末,HTMLCSSJavaScript的大作业里,购物商城几乎是"指定选题"级别的存在,尤其是像丝芙兰这种视觉调性很明确的彩妆商城,做出来的效果往往比五花八门的杂货铺要好看得多。我前前后后帮不少学弟学妹看过这类期末作业&…

2026/10/18 18:05:51 阅读更多 →
MATLAB实战:A*与JPS路径规划在6种栅格地图上的对比测试

MATLAB实战:A*与JPS路径规划在6种栅格地图上的对比测试

简介:本资源面向路径规划初学者、机器人导航方向学生及算法教学人员,提供A 与JPS两种经典搜索算法在MATLAB环境下的横向对比测试方案,帮助理解跳点搜索相对标准A 在效率上的改进逻辑。压缩包共38个文件,约34KB,以32个…

2026/10/18 18:05:51 阅读更多 →
为什么滑动删除总是不生效?RecyclerViewUndoSwipe中getSwipeThreshold与getMoveThreshold调优技巧

为什么滑动删除总是不生效?RecyclerViewUndoSwipe中getSwipeThreshold与getMoveThreshold调优技巧

【免费下载链接】RecyclerViewUndoSwipe Swipe and drag support for RecyclerView with undo action. 项目地址: https://gitcode.com/gh_mirrors/re/RecyclerViewUndoSwipe 点击查看 免费下载 在 Android 开发中,RecyclerView 滑动删除不生效是最常见…

2026/10/18 18:04:50 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →