当前位置: 首页 > news >正文

Electricity Market Optimization(VI) - 机组组合模型以及 Gurobi 求解

本文参考链接:link

\hspace{1.6em} 机组组合问题在电力系统中非常重要,这个问题也是一个优化问题,研究的就是如何调度现有的机组,调度的对象是以煤炭、石油、天然气为燃料的火力发电机以及水力发电机等可预测处理的发电机组,调度的过程是指派某个发电机组在未来的某个特定的时间开始启动,在预定的时段开始发电,调度的目标是在满足约束的前提下尽量的是发电成本最小化。截止24年底,中国以煤炭、石油、天然气为燃料的火力发电机的装机容量占全部发电装机容量的 47.62%,所以我们这主要讨论火力发电机的启停的情况,下面是一个记录大型火电机组启动过程的甘特图
五

\hspace{1.6em} 可以看到一个大型火电机组的启动过程比较复杂,这也带来了机组组合问题的核心特征:

  • 发电成本函数是一个在原点不连续的函数
  • 需要提前确定哪些机组需要开,以保证第二天的电能实际交割

\hspace{1.6em} 为了描述机组的开关状态,引入如下方程:
v i , t − w i , t = u i , t − u i , t − 1 ∑ s = t − ( U T i − 1 ) t v i , s ≤ u i , t ∑ s = t − ( D T i − 1 ) t w i , s ≤ 1 − u i , t u i , t ∈ { 0 , 1 } 0 ≤ v i , t , w i , t ≤ 1 ∀ i ∈ [ G ] , t ∈ [ T ] \begin{aligned} & v_{i,t} - w_{i,t} = u_{i,t} - u_{i,t-1} \\ & \sum_{s=t-(UT_i-1)}^t v_{i,s} \leq u_{i,t} \\ & \sum_{s=t-(DT_i-1)}^t w_{i,s} \leq 1-u_{i,t} \\\\ & u_{i,t}\in\{0,1\} \\\\ & 0 \le v_{i,t}, w_{i,t} \le 1 &&&&&&&&&&&&& \forall i \in [G], t \in [T] \end{aligned} vi,twi,t=ui,tui,t1s=t(UTi1)tvi,sui,ts=t(DTi1)twi,s1ui,tui,t{0,1}0vi,t,wi,t1i[G],t[T]
\hspace{1.6em} 方程中 u i , t = 1 u_{i,t} = 1 ui,t=1 表示在 t t t 时刻,发电机处于运行状态,这种运行状态表示发电机正在准备或者已经处于发电状态,
v i , t > 0 v_{i,t} > 0 vi,t>0 在 表示 t t t 时刻,发电机正在准备发电
w i , t > 0 w_{i,t} >0 wi,t>0 在 表示 t t t 时刻,发电机正在准备停机

机组组合问题的约束

\hspace{1.6em} 机组组合问题的约束进行分类,分为三类:

  • 功率平衡约束
  • 火电机组启停约束和爬坡约束
  • 备用容量约束

\hspace{1.6em} 我在之前的博客中对功率平衡约束和爬坡约束进行了讨论,本文就机组启停约束和备用容量约束进行讨论

火电机组启停约束和爬坡约束

启动时功率变化和停机功率变化

\hspace{1.6em} 当机组在时刻 t t t 启动时,即 v i , t = 1 v_{i,t} = 1 vi,t=1 时,发电机的功率可以从 0 直接增加到最小发电功率 P i ‾ \underline{P_i} Pi, 同样当机组在时刻 t t t 停止时,即 w i , t = 1 w_{i,t} = 1 wi,t=1 时,发电机的功率可以从最小发电功率直接减少到 0,所以可以用下面的式子来描述这一点:
p i , t c − p i , t − 1 c ≤ R i 60 + v i , t P ‾ i p i , t − 1 c − p i , t c ≤ R i 60 + w i , t P ‾ i ∀ i ∈ [ G ] , t ∈ [ T ] \begin{aligned} & p_{i,t}^{\rm c} - p_{i,t-1}^{\rm c} \le R_i^{\rm 60} + v_{i,t}\underline{P}_i \\\\ & p_{i,t-1}^{\rm c} - p_{i,t}^{\rm c} \le R_i^{\rm 60} + w_{i,t}\underline{P}_i &&&&&&&&&&&&&&&\forall i \in [G],t \in [T] \\ \end{aligned} pi,tcpi,t1cRi60+vi,tPipi,t1cpi,tcRi60+wi,tPii[G],t[T]
其中 R i 60 R_i^{\rm 60} Ri60 是机组功率变化的上限

\begin{aligned}&&&&&&&&&&&&&&&&\end{aligned} 至此,成功往模型中加入离散变量!

备用容量约束

\hspace{1.6em} 为了避免出现发电容量短缺的情况,在考虑发电机组组合的时候需要在日前就考虑到有一些火电机组本身就要留有备用容量,这里的备用容量是只针对处于开机状态的机组而言的,即热备用。这是为了防止在电能交割日出现的发电容量无法满足需求的情况。无法满足需求的原因包括:负荷突然升高,多台发电机组同时故障。站在发电厂的角度来看,解决短缺的措施之一就是保证有足够的机组备用容量,下面是 link 中介绍的几个关于备用容量的基本约束:

  • 发电机只能提供其输出功率之下的备用容量,启动状态下无法提供非旋转备用
  • 只有一部分的发电机才能提供旋转备用,只有具备启动可靠性才能提供
  • 总备用容量应该大于或等于最大单发电机的输出功率
  • 总备用容量应该大于或等于要求的最低备用容量 r t r e q r^{\rm req}_t rtreq.
  • 一半的最低备用容量 r t r e q r^{\rm req}_t rtreq 应该通过旋转备用来满足
    p i , t + r i , t s ≤ P ‾ i u i , t p i , t + r i , t s + r i , t n s ≤ P ‾ i r i , t s = 0 ∀ i ∈ [ G ] ∖ G S , r t r e q ≥ p i , t ∑ i ∈ [ G ] ( r i , t s + r i , t n s ) ≥ r t r e q ∑ i ∈ [ G ] r i , t s ≥ 0.5 r t r e q ∀ i ∈ [ G ] , t ∈ [ T ] \begin{aligned} & p_{i,t} + r^{\rm s}_{i,t} \le \overline{P}_i u_{i,t} \\ & p_{i,t} + r^{\rm s}_{i,t} + r^{\rm ns}_{i,t} \le \overline{P}_i \\ & r_{i,t}^{\rm s} = 0 && \forall i \in [G]\setminus \mathcal{G}^{\rm S}, \\ & r^{\rm req}_t \ge p_{i,t} \\ & \sum_{i\in[G]} (r^{\rm s}_{i,t} + r^{\rm ns}_{i,t}) \ge r^{\rm req}_t \\ & \sum_{i\in[G]} r^{\rm s}_{i,t} \ge 0.5 r^{\rm req}_t &&&&&&&&&& \forall i \in [G],t \in [T] \end{aligned} pi,t+ri,tsPiui,tpi,t+ri,ts+ri,tnsPiri,ts=0rtreqpi,ti[G](ri,ts+ri,tns)rtreqi[G]ri,ts0.5rtreqi[G]GS,i[G],t[T]

模型目标函数

\hspace{1.6em} 机组组合问题的目标函数中的成本分为两部分:启停成本和发电成本

启动成本和停机成本

\hspace{1.6em} 那么机组启停成本可以用下式表示:
C t u c = ∑ i ∈ [ G ] ( c i s u v i , t + c i s d w i , t ) ∀ t ∈ [ T ] \begin{aligned} C_t^{\rm uc} = \sum_{i\in[G]}\big(c^{\rm su}_i v_{i,t} + c^{\rm sd}_i w_{i,t} \big) &&&&&&&&&&&&&&&&&&&&& \forall t \in [T] \end{aligned} Ctuc=i[G](cisuvi,t+cisdwi,t)t[T]

发电成本

\hspace{1.6em} 我们这里考虑了新能源机组的运行成本,新能源机组的运行成本构成已经在之前的博客中有说明link

对于数据的说明

启动可靠性

\hspace{1.6em} 这是评判一个机组是否能够正常进行启动的标准,一个机组是否具有启动可靠性需要看:

  • 硬件性能是否正常,比如机械结构,电气系统是否正常运行
  • 软件性能是否正常,比如检测和控制系统是否能精准测量并调节设备的各种性能参数,这些参数包括:机组的转速、负荷、温度、压力等运行参数
  • 机组启动时的电网运行条件是否正常,发电机启动初期需要从电网获取电能建立足够的磁场和感应电动势,此时如果电网电压或者频率不稳定,会影响发电机的正常启动

利用Gurobi + python 建立模型并求解

import pandas as pd
import numpy as np
import math
import gurobipy as gp
from gurobipy import *
import matplotlib.pyplot as pltgen_colors = {"Hydro": "#1f78b4",  # Deep Blue"Nuclear": "#e31a1c",  # Red"Coal": "#8b4513",  # Dark Brown"Gas CC": "#8e44ad",  # Medium Purple"Gas CT": "#a569bd",  # Light Purple"Oil CT": "#4d4d4d",  # Dark Gray"Wind": "#6baed6",  # Light Sky Blue"PV": "#ff7f00",  # Bright Orange"Storage": "#33a02c" # Green
}def print_gp_status(m):status = m.Statusif status == GRB.OPTIMAL:print("The model is optimal.")elif status == GRB.INFEASIBLE:print("The model is infeasible.")elif status == GRB.UNBOUNDED:print("The model is unbounded.")else:print(f"Optimization ended with status {status}.")print()return status# 读入数据
data_file = "ts_and_gen_scuc.xlsx"
load_and_res_data = pd.read_excel(data_file, sheet_name=0)
gen_data = pd.read_excel(data_file, sheet_name=1)# 不同发电机的类型、编号、可变成本、容量、爬坡速率
gen_id = gen_data['Gen ID'].to_numpy()
gen_type = gen_data['Unit Type'].to_numpy()
mc = gen_data['Variable Cost USD/MWh'].to_numpy()
Pmax = gen_data['Installed in MW'].to_numpy()
R60 = gen_data['Ramp Rate in MW /hr'].to_numpy()# 不同发电机的固定成本、最小发电功率、最小启停时间、启动可靠性状态变量
su_cost = gen_data['SU cost $'].to_numpy()
Pmin = gen_data['PMin in MW'].to_numpy()
min_uptime = gen_data['Min Up Time Hr'].to_numpy()
min_downtime = gen_data['Min Down Time Hr'].to_numpy()
sr_elig = gen_data['SR eligible'].to_numpy()
n_gen = len(gen_id)# 负荷数据
load = load_and_res_data['Load MW'].to_numpy()
wind = load_and_res_data['Wind MW'].to_numpy()
pv = load_and_res_data['PV MW'].to_numpy()
n_t = len(load)# 建立模型# 弃风弃光的成本系数
wind_curt_pen = 0 # $/MWh
pv_curt_pen = 0 # $/MWhm = gp.Model()
m.setParam("OutputFlag", 0)# 向模型中添加变量,这些变量包括:
# 发电机的发电功率、运行状态、启动状态、停机状态、风力发电机的发电功率
# 光伏发电机的发电功率、对于电机的备用容量要求、旋转备用容量、非旋转备用容量
p = m.addVars(n_gen, n_t, lb=0, ub=GRB.INFINITY, name="p")
u = m.addVars(n_gen, n_t, vtype=GRB.BINARY, name="u") 
v = m.addVars(n_gen, n_t, lb=0, ub=1, name="v") 
w = m.addVars(n_gen, n_t, lb=0, ub=1, name="w")
p_wind = m.addVars(n_t, lb=0, ub=GRB.INFINITY, name="p_wind")
p_pv = m.addVars(n_t, lb=0, ub=GRB.INFINITY, name="p_pv")
r_req = m.addVars(n_t, lb=0, ub=GRB.INFINITY, name="r_req")
p_rs = m.addVars(n_gen, n_t, lb=0, ub=GRB.INFINITY, name="p_rs") 
p_rns = m.addVars(n_gen, n_t, lb=0, ub=GRB.INFINITY, name="p_rns") # 向模型中添加约束,这些约束包括:
pkey, pval = multidict(p)
# 1. 供需平衡约束
m.addConstrs((gp.quicksum(p[key] for key in pkey.select('*', t)) + p_wind[t] + p_pv[t] == load[t] for t in range(n_t)), name="energy_balance")for t in range(n_t):for i in range(n_gen):# 2. (传统能源)发电机容量约束m.addConstr(p[i,t] + p_rs[i,t] <= Pmax[i]*u[i,t]) # spinning reserve can be provided only from "on" generatorsm.addConstr(p[i,t] + p_rs[i,t] + p_rns[i,t] <= Pmax[i]) # non-spiining reserve can be provided also from "off" generatorsm.addConstr(p[i,t] >= Pmin[i]*u[i,t])# 3. 只有满足启动可靠性的那些(传统能源)发电机可以提供旋转容量if sr_elig[i]==0:m.addConstr(p_rs[i,t] == 0)# 4. 爬坡约束if t > 0:m.addConstr(p[i,t] - p[i,t-1] <= R60[i] + v[i,t]*Pmin[i])m.addConstr(p[i,t-1] - p[i,t] <= R60[i] + w[i,t]*Pmin[i])# 5. 5.1 机组启停状态受最小启停时间影响的约束ut = max(t-(math.ceil(min_uptime[i])-1), 0) dt = max(t-(math.ceil(min_downtime[i])-1), 0)m.addConstr(sum(v[i, s] for s in range(ut,t)) <= u[i,t])m.addConstr(sum(w[i, s] for s in range(dt,t)) <= 1 - u[i,t])# 5.2 描述机组启停状态的关系约束if t>0:m.addConstr(v[i,t] - w[i,t] == u[i,t] - u[i,t-1])else:m.addConstr(v[t,i] - w[t,i] == u[t,i])# 6. (新能源)发电机的容量约束
for t in range(n_t):m.addConstr(p_wind[t] <= wind[t])m.addConstr(p_pv[t] <= pv[t])# 7. 备用容量要求约束
for t in range(n_t):# 能够提供的总备用容量是决策变量,最少也要大于最大单机容量m.addConstrs(r_req[t] >= p[i,t] for i in range(n_gen))m.addConstr(gp.quicksum(p_rs[i,t] + p_rns[i,t] for i in range(n_gen)) >= r_req[t])# 要求总的备用容量中至少有一半是通过旋转备用容量实现的m.addConstr(gp.quicksum(p_rs[i,t] for i in range(n_gen)) >= 0.5 * r_req[t])# 此优化模型的目标函数包括几部分:
# 1. (传统能源)发电机在发电过程中产生的成本
gen_cost = gp.quicksum(LinExpr(mc, [p[key] for key in pkey.select('*', t)]) for t in range(n_t))
# 2. (新能源)发电机的机会成本
curt_cost = gp.quicksum((pv[t]-p_pv[t])*pv_curt_pen + (wind[t]-p_wind[t])*wind_curt_pen for t in range(n_t))
# 3. (传统能源)发电机在启动时产生的成本
startup_cost = gp.quicksum(LinExpr(su_cost, [v[key] for key in pkey.select('*', t)]) for t in range(n_t))# 利用 Gurobi 求解,并打印最优值
m.setObjective(gen_cost + curt_cost + startup_cost, GRB.MINIMIZE)
m.optimize()
print_gp_status(m)
objective = m.ObjVal
print(f"Objective value {objective/1e3:.2f} k$.\n")# 结果可视化,展示风、光、传统能源发电机在不同时段的发电量
# 其中传统能源发电机分为几种,也将打印其随时间变化的曲线
p_res = {type: np.array([m.getVarByName(f"p[{i},{t}]").X for t in range(n_t)]) for (i,type) in enumerate(gen_id)}
p_res['Wind'] = np.array([m.getVarByName(f"p_wind[{t}]").X for t in range(n_t)])
p_res['PV'] = np.array([m.getVarByName(f"p_pv[{t}]").X for t in range(n_t)])# 分别打印成本风、光电机的总机会成本
wind_curt_res = wind - np.array(p_res['Wind'])
pv_curt_res = pv - np.array(p_res['PV'])
print(f"A total of {sum(wind_curt_res):.2f} MWh wind were curtailed.")
print(f"A total of {sum(pv_curt_res):.2f} MWh PV were curtailed.")# 将不同种类的传统能源发电机发电量进行整合后可视化
gen_type_unique = np.array(list(dict.fromkeys(gen_type)))
gens_per_type = {}
for i, gt in enumerate(gen_type):if gt not in gens_per_type:gens_per_type[gt] = []gens_per_type[gt].append(i)p_res_type = {gt : sum([p_res[gen_id[sub]] for sub in sublist]) for gt, sublist in gens_per_type.items()}
p_res_type['Wind'] = np.array([m.getVarByName(f"p_wind[{t}]").X for t in range(n_t)])
p_res_type['PV'] = np.array([m.getVarByName(f"p_pv[{t}]").X for t in range(n_t)])

上述程序的运行结果如下:

The model is optimal.
Objective value 188.18 k$.
A total of 1475.71 MWh wind were curtailed.
A total of 2866.40 MWh PV were curtailed.
请添加图片描述

\hspace{1.6em} 现在我们想分别得到每个时段的电价,可以通过对偶问题的最优解这种供需平衡这个等式约束的对偶乘子的取值得到,这也被称为拉格朗日松弛方法(Lagrangian relaxation method),关于如何通过 Gurobi 求优化问题的影子价格,我已经在我的其他博客link中进行了阐述,有兴趣的可以看看。
\hspace{1.6em} 但是机组组合问题的对偶函数是难以直接列写的,我们可以考虑与机组组合问题紧密联系的另一个问题:经济调度问题。这种转化只是为了得到电价,作为一种 “捷径”,必须承认在数学上并不严谨,没有直面机组组合这一 MIP 问题,只是为了和这个系列博客之前的内容进行联系。
\hspace{1.6em} 经济调度问题就是已经确定必开机组,设计一个优化问题来确定这些必开机组如何调度这些机组的发电来降低成本,下面就把上面求UC问题求出来的机组开关状态固定,以此去掉离散决策变量,在此之前,不妨来看看我们在之前的模型中,不同时段下都打开了哪些些机组,

# plot of aggregated production
fig, ax = plt.subplots(1,1)
fig.set_size_inches(10,6)
x = np.arange(24)
color_list = [gen_colors[g] for g in list(p_res_type.keys())]
ax.stackplot(x, list(p_res_type.values()), labels=list(p_res_type.keys()), colors=color_list);
ax.plot(load, linewidth=3, color='black', label='Load')
ax.set_xlabel("Hour")
ax.set_ylabel("Generation [MW]")
ax.legend(ncols=5, loc="lower center", bbox_to_anchor=(0.5, -0.23));

运行结果
请添加图片描述

\hspace{1.6em} Gurobi 中为优化面模型提供了一个 fixed() 方法,这个方法将在模型中把每个整数变量固定为它在MIP解或MIP起始值中取的值。这一方法将会去掉模型中的整数变量及其相关的约束,模型就退化成了 经济调度模型,关于经济调度模型,我在本系列博客link中已经说明。
\hspace{1.6em} 固定机组组合后,让我们重新求解模型并可视化结果

m_fixed = m.fixed() 
m_fixed.optimize()print_gp_status(m)
objective = m_fixed.ObjVal
print(f"Objective value {objective/1e3:.2f} k$.\n")
p_res = {type: np.array([m_fixed.getVarByName(f"p[{i},{t}]").X for t in range(n_t)]) for (i,type) in enumerate(gen_id)}
p_res['Wind'] = np.array([m_fixed.getVarByName(f"p_wind[{t}]").X for t in range(n_t)])
p_res['PV'] = np.array([m_fixed.getVarByName(f"p_pv[{t}]").X for t in range(n_t)])# 之后的代码就是在可视化p_res,上面已经写过,不再赘述

上述程序的运行结果如下:

The model is optimal.
Objective value 188.18 k$.
A total of 1870.84 MWh wind were curtailed.
A total of 2471.27 MWh PV were curtailed.请添加图片描述

\hspace{1.6em} 那么现在就可以获得每个时段的对偶价格了,将其求出来之后放到原图中呈现

system_price = [m_fixed.getConstrByName(f"energy_balance[{t}]").Pi for t in range(n_t)]
print(system_price)
fig, ax = plt.subplots(1,1)
fig.set_size_inches(10,6)
x = np.arange(24)
color_list = [gen_colors[g] for g in list(p_res_type.keys())]
ax.stackplot(x, list(p_res_type.values()), labels=list(p_res_type.keys()), colors=color_list);
ax.plot(load, linewidth=3, color='black', label='Load')
ax2 = ax.twinx() 
ax2.plot(system_price, color='blue', linewidth=3, ls="--", label="Price")
ax2.set_ylim(0)
ax2.set_ylabel("System price [$]", color="blue")
ax.set_xlabel("Hour")
ax.set_ylabel("Generation [MW]")
ax.legend(ncols=5, loc="lower center", bbox_to_anchor=(0.5, -0.23));

上述程序的运行结果如下:

[25.0, 14.0, 14.0, 14.0, 16.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 10.0, 14.0, 14.0, 12.0, 10.0, 10.0, 10.0]请添加图片描述

更多内容,请见我的其他博客

相关文章:

Electricity Market Optimization(VI) - 机组组合模型以及 Gurobi 求解

本文参考链接&#xff1a;link \hspace{1.6em} 机组组合问题在电力系统中非常重要&#xff0c;这个问题也是一个优化问题&#xff0c;研究的就是如何调度现有的机组&#xff0c;调度的对象是以煤炭、石油、天然气为燃料的火力发电机以及水力发电机等可预测处理的发电机组&#…...

LoRA个关键超参数:`LoRA_rank`(通常简称为 `rank` 或 `r`)和 `LoRA_alpha`(通常简称为 `alpha`)

LoRA (Low-Rank Adaptation) 中的两个关键超参数&#xff1a;LoRA_rank&#xff08;通常简称为 rank 或 r&#xff09;和 LoRA_alpha&#xff08;通常简称为 alpha&#xff09;。 LoRA 的核心思想是&#xff0c;在对大型预训练模型&#xff08;如 LLM 或 Stable Diffusion&…...

Sql刷题日志(day3)

一、笔试 1、min(date_time)&#xff1a;求最早日期 2、mysql中distinct不能与order by 连用&#xff0c;可以用group by去重 二、面试 1、SQL中如何利用replace函数统计给定重复字段在字符串中的出现次数 (length(all_string)-length(all_string,目标字符串,))/length(ta…...

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言 之前的文章已经介绍实现了AI对话窗口&#xff0c;但只有个空壳&#xff0c;没有实现功能。本次将集中完成对话窗口的功能&#xff0c;主要内容为&#xff1a; 模型动态切换&#xff1a;支持运行时加载配置的AI模型列表交互式输入处理&#xff1a;实现多行文本输入与Ctrl…...

[GESP202409 二级] 小杨的 N 字矩阵 题解

#include<bits/stdc.h> #define int long long using namespace std; int m, a[55][55], sum; signed main(){cin >> m;for(int i 1; i < m; i ){a[i][1] 1;//第一列a[i][m] 1;//第m列sum ;a[i][sum] 1;//斜着的}for(int i 1; i < m; i ){for(int j 1;…...

第八章:探索新兴趋势:Agent 框架、产品与开源力量

引言 在前两章的实战中&#xff0c;我们已经掌握了如何使用 LangChain、LlamaIndex、AutoGen 和 CrewAI 这些主流框架来构建 AI Agent&#xff0c;无论是单个智能体还是协作的多 Agent 系统。然而&#xff0c;AI Agent 领域的发展日新月异&#xff0c;如同奔腾的河流&#xff…...

条款05:了解C++默默编写并调用哪些函数

目录 1.默认生成的函数 2.无法生成的情况 2.1当成员函数有引用 或者 被const修饰 2.2.operator在基类被私有 1.默认生成的函数 class empty {};//相当于class empty { public:empty(){ ... } // 构造函数empty(const empty& rhs) { ... }// 拷贝构造~empty(){ ... } //…...

Vue3 中封装函数实现加载图片加载失败兜底方案。

文章目录 Vue3 中使用动态加载图片并处理加载失败的情况实现思路代码实现代码解析注意事项扩展功能总结 Vue3 中使用动态加载图片并处理加载失败的情况 在开发 Vue3 应用时&#xff0c;我们经常会遇到需要动态加载图片的场景。例如&#xff0c;图片资源可能从后端获取&#xf…...

微机控制电液伺服汽车减震器动态试验系统

微机控制电液伺服汽车减震器动态试验系统&#xff0c;用于对汽车筒式减震器、减震器台架、驾驶室减震装置、发动机悬置软垫总成、发动机前置楔形支撑总成等的示功图试验、速度特性试验。 主要的技术参数&#xff1a; 1、最大试验力&#xff1a;5kN&#xff1b; 2、试验力测量精…...

如何简单几步使用 FFmpeg 将任何音频转为 MP3?

在多媒体处理领域&#xff0c;FFmpeg 以其强大的功能和灵活性而闻名。无论是视频编辑、音频转换还是流媒体处理&#xff0c;它都是专业人士和技术爱好者的首选工具之一。在这篇文章中简鹿办公将重点介绍如何使用 FFmpeg 进行音频格式转换&#xff0c;提供一些常用的转换方式&am…...

【软考-系统架构设计师】ATAM方法及效用树

软件架构设计中ATAM方法及效用树深度解析 一、ATAM方法核心框架与流程 ATAM&#xff08;架构权衡分析方法&#xff09;是由卡耐基梅隆大学提出的系统性架构评估方法&#xff0c;旨在通过多维度质量属性分析识别架构风险、敏感点与权衡点。其实施流程分为四阶段九步骤&#xf…...

2025第十七届“华中杯”大学生数学建模挑战赛题目B 题 校园共享单车的调度与维护问题完整成品正文33页(不含附录)文章思路 模型 代码 结果分享

校园共享单车运营优化与调度模型研究 摘 要 本研究聚焦校园共享单车点位布局、供需平衡、运营效率及故障车辆回收四大核心问题&#xff0c;通过构建一系列数学模型&#xff0c;系统分析与优化共享单车的运维体系。 针对问题一&#xff0c;我们建立了基于多时段观测的库存估算…...

React Native 0.79 稳定版发布,更快的工具、更多改进

React Native 0.79 已发布。此版本在多个方面进行了性能改进&#xff0c;并修复了一些漏洞。首先&#xff0c;得益于延迟哈希技术&#xff0c;Metro 的启动速度变快了&#xff0c;并且对包导出提供了稳定支持。由于 JS 包压缩方式的改变等原因&#xff0c;Android 的启动时间也…...

中国AI应用革命开启新纪元:从DeepSeek燎原到全栈生态崛起

当生成式AI的星火点燃华夏大地&#xff0c;一场由DeepSeek引发的智能革命正在重构中国产业版图。在这场算力与智慧的角逐中&#xff0c;全产业链的协同创新正在书写中国式AI进化的新范式。 一、全栈突围&#xff1a;AI基础设施生态全面升维 云端启航&#xff1a;头部云服务商…...

生物系统中的随机性及AI拓展

生物系统远非确定性的机器&#xff0c;而是本质上充满噪声的。这种随机性&#xff0c;或称偶然性&#xff0c;在塑造细胞行为和结果方面起着至关重要的作用。从基因表达到细胞命运决定&#xff0c;波动和不可预测的事件可以显著影响生物过程。理解和建模这种固有的变异性对于全…...

智能交响:EtherCAT转Profinet网关开启汽车自动化通信新纪元

在汽车制造行业&#xff0c;随着自动化程度的不断提升&#xff0c;设备之间的高效通信显得尤为重要。以吉利汽车西安制造基地为例&#xff0c;生产线中广泛应用了西门子PLC与机器人手臂等设备&#xff0c;这些设备分别采用了Profinet和EtherCAT通信协议。为实现不同协议设备之间…...

【2025“华中杯”大学生数学建模挑战赛】选题分析 A题 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛选题分析A题&#xff1a;晶硅片产销策略优化B题&#xff1a;校园共享单车的调度与维护问题C题&#xff1a;就业状态分析与预测D题&#xff1a;患者院内转运不良事件的分析与预测 A 题 晶硅片产销策略优化问题 1&#xff1a;月利润计算模…...

springboot整合阿里云百炼DeepSeek,实现sse流式打印

1.开通阿里云百炼,获取到key 官方文档地址 https://bailian.console.aliyun.com/?tabapi#/api/?typemodel&urlhttps%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2868565.html 2.新建SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?&g…...

JMeter中设置HTTPS请求

在JMeter中设置HTTPS请求&#xff0c;你可以按照以下步骤进行操作&#xff1a; 步骤一&#xff1a;添加线程组 打开JMeter后&#xff0c;右键点击“测试计划”&#xff0c;选择“添加” -> “线程&#xff08;用户&#xff09;” -> “线程组”。线程组用于定义虚拟用户…...

oracle数据库中,merge into 语句的功能与使用场景

oracle数据库中&#xff0c;merge into 语句的功能与使用场景 一、MERGE INTO 语句的作用 MERGE INTO 是ORACLE数据库 SQL 中的一种数据操作语句&#xff0c;它结合了 INSERT、UPDATE 和 DELETE 操作的功能&#xff0c;通常被称为"upsert"操作&#xff08;update …...

极狐GitLab 安全文件管理功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 安全文件管理 (BASIC SELF) 在极狐GitLab 15.6 中 GA&#xff0c;功能标志 ci_secure_files 被移除。 您可以将最多 100 个…...

极狐GitLab CI/CD 流水线计算分钟数如何管理?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 计算分钟管理 (PREMIUM SELF) 在极狐GitLab 16.1 中&#xff0c;从 CI/CD 分钟数重命名为计算配额或计算分钟数。 管理员可…...

XCZU4CG‑2SFVC784I 赛灵思 FPGA XilinxZynq UltraScale+ MPSoC

XCZU4CG‑2SFVC784I 是 AMD Xilinx Zynq UltraScale MPSoC CG 系列中的入门级高性能 SoC FPGA&#xff0c;集成了双核 Arm Cortex‑A53 通用处理器与双核 Arm Cortex‑R5F 实时处理器&#xff0c;以及可编程逻辑&#xff08;PL&#xff09;资源。 异构处理系统 (PS) 应用处理…...

软考 中级软件设计师 考点知识点笔记总结 day13 数据库系统基础知识 数据库模式映像 数据模型

文章目录 数据库系统基础知识6.1 基本概念6.1.1 DBMS的特征与分类 6.2 数据库三级模式两级映像6.3 数据库的分析与设计过程6.4 数据模型6.4.1 ER模型6.4.2 关系模型 数据库系统基础知识 基本概念 数据库三级模式两级映像 数据库的分析与设计过程 数据模型 关系代数 数据库完整…...

视频监控EasyCVR视频汇聚平台接入海康监控摄像头如何配置http监听功能?

一、方案概述 本方案主要通过EasyCVR视频管理平台&#xff0c;实现报警信息的高效传输与实时监控。海康监控设备能通过HTTP协议将报警信息发送至指定的目的IP或域名&#xff0c;而EasyCVR平台则可以接收并处理这些报警信息&#xff0c;同时提供丰富的监控与管理功能&#xff0…...

【八大排序】冒泡、直接选择、直接插入、希尔、堆、归并、快速、计数排序

目录 一、排序的介绍二、排序算法的实现2.1 直接插入排序2.2 希尔排序2.3 直接选择排序2.4 堆排序2.5 冒泡排序2.6 快速排序2.7 归并排序2.8 比较排序算法的性能展示2.9 计数排序 个人主页<— 数据结构专栏<— 一、排序的介绍 我们的生活中有很多排序&#xff0c;比如像…...

AI在市场营销分析中的核心应用及价值,分场景详细说明

以下是 AI在市场营销分析中的核心应用及价值&#xff0c;分场景详细说明&#xff1a; 1. 客户行为分析与细分 AI技术应用&#xff1a; 机器学习&#xff1a;分析用户点击、购买、浏览等行为数据&#xff0c;识别消费模式&#xff08;如高频购买时段、偏好品类&#xff09;。聚…...

本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程

目录 ⛳️推荐 前言 1.关于SigNoz 2.本地部署SigNoz 3.SigNoz简单使用 4. 安装内网穿透 5.配置SigNoz公网地址 6. 配置固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…...

解析检验平板:设备还是非设备?深入了解其功能与应用(北重铸铁平台厂家)

检验平板通常被归类为设备&#xff0c;因为它们具有特定的功能&#xff0c;并且被用于测试和评估其他设备或产品的性能和质量。检验平板通常具有平坦的表面&#xff0c;用于放置要进行测试或检验的物品。它们可以用于测量尺寸、形状、平整度、表面光洁度等参数。 检验平板的应…...

【创新实训个人博客】前端实现

一、 目标设定与初步改造 核心目标: 对 visualizer 的前端界面 (index.html, style.css) 进行现代化改造。 基础样式&#xff1a; 初始化页面整体风格&#xff0c;为 body 添加了动态渐变背景&#xff1b;初步调整了页面顶部导航按钮、信息提示块 (Log Visualizer) 及底部任务…...

vue3、原生html交互传值

1、引入原生html 将该文件放到public目录下&#xff0c;在vue项目里面使用iframe 引入该文件&#xff0c;监听load事件(load事件在<iframe>的内容完全加载完成之后触发) <iframeload"onIframeLoad"style"width: 454px; height: 480px"src".…...

于 Jupyter 天地,借 NumPy 之手编织数据锦缎

引言 NumPy是Python科学计算的核心库之一&#xff0c;提供了强大的多维数组对象和丰富的数学函数&#xff0c;是数据科学、机器学习等领域不可或缺的工具。结合Jupyter Notebook的交互式环境&#xff0c;NumPy的使用变得更加直观和高效。本文将介绍如何在Jupyter中充分利用NumP…...

Mac idea WordExcel等文件git modify 一直提示修改状态

CRLF LF CR 换行符自动转换问题 查看状态&#xff1a;git config --global --list Mac需要开启&#xff0c;window下需要关闭 关闭命令&#xff1a;git config --global core.autocrlf false 命令解释&#xff1a; autocrlf true 表示要求git在提交时将crlf转换为lf&a…...

代码学习总结(三)

代码学习总结(三) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C++ 语言,包括题目内容,代码实现,思路,并会注明题目难度,保证代码运行结果 1 判断并构造 eleme 型字符串 简单 eleme 型字符串 判断与构造 小红有一个长…...

Vue的Diff算法原理

Vue中的Diff算法&#xff08;差异算法&#xff09;是虚拟DOM的核心优化手段&#xff0c;用于对比新旧虚拟DOM树&#xff0c;找出最小变更&#xff0c;高效更新真实DOM&#xff0c;其设计目标是减少DOM操作次数&#xff0c;提升渲染性能 diff算法&#xff1a; 特点&#xff1a…...

CentOS系统-超详细的Kubernetes集群搭建教程(kubernetes:1.28.2)

小伙伴们&#xff0c;今天给大家带来一份超详细的Kubernetes集群搭建教程&#xff0c;保证让你从环境准备到安装验证&#xff0c;一路畅通无阻&#xff01;&#x1f680; &#x1f308; ‌一、环境准备‌ 首先&#xff0c;咱们得确保硬件和软件环境都达标哦&#xff01; &am…...

自动驾驶系列—GLane3D: Detecting Lanes with Graph of 3D Keypoints

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

【Amazon 工具】在MacOS本地安装 AWS CLI、kubectl、eksctl工具

文章目录 安装 AWS CLI安装 kubectl安装 eksctl参考链接 安装 AWS CLI 创建访问密钥安装或更新 AWS CLI curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target /要验证 Shell 是否可以在 $PAT…...

基于GTID的主从复制

MySQL主从复制实战指南&#xff08;基于二进制日志&#xff09;-CSDN博客 二、基于GTID的主从复制 基于 GTID 方式&#xff1a;全局事务标示符&#xff0c;自mysql5.6版本开启的新型复制方式。 GTID的组成&#xff1a;server_uuid&#xff1a;序列号 UUID&#xff1a;每个m…...

linux多线(进)程编程——(8)多进程的冲突问题

前言 随着时间的推移&#xff0c;共享内存已经在修真界已经沦为禁术。因为使用这种方式沟通的两人往往会陷入到走火入魔的状态&#xff0c;思维扭曲。进程君父子见到这种情况&#xff0c;连忙开始专研起来&#xff0c;终于它们发现了共享内存存在的问题&#xff1a; 进程间冲…...

数据结构——八大排序算法

排序在生活中应用很多&#xff0c;对数据排序有按成绩&#xff0c;商品价格&#xff0c;评论数量等标准来排序。 数据结构中有八大排序&#xff0c;插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…...

线性代数 | 知识点整理 Ref 1

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 1。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...

Docker 设置镜像源后仍无法拉取镜像问题排查

#记录工作 Windows系统 在使用 Docker 的过程中&#xff0c;许多用户会碰到设置了国内镜像源后&#xff0c;依旧无法拉取镜像的情况。接下来&#xff0c;记录了操作要点以及问题排查方法&#xff0c;帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…...

线性回归 (Linear Regression) 多项式回归 (Polynomial Regression)

目录 线性回归 (Linear Regression)单变量线性回归 (Univariate linear regression)代价函数 (Cost function)梯度下降 (gradient descent) 及公式由来梯度下降的变体Quiz多类特征 (Multiple features)多元线性回归 (Multiple linear regression)向量化 (Vectorization)正规方程…...

AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现

以下是 AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现&#xff0c;分领域详细说明&#xff1a; 1. 实时能源监测与异常检测 AI技术应用&#xff1a; 物联网&#xff08;IoT&#xff09; 传感器数据采集&#xff1a;实时收集设备、建筑或工厂的能耗数据&#xff…...

dumpsys--音频服务状态信息

Audio相关的信息获取指令&#xff1a; dumpsys media.audio_flinger dumpsys media.audio_policy dumpsys audio media.audio_flinger dumpsys media.audio_flinger 用于获取 AudioFlinger 服务的详细状态信息。 1. 命令作用 该命令输出当前系统的 音频设备状态、活跃音频流…...

JavaScript模块化开发:CommonJS、AMD到ES模块

引言 在Web开发的早期阶段&#xff0c;JavaScript代码通常被编写在一个庞大的文件中或分散在多个脚本标签里&#xff0c;这种方式导致了全局变量污染、依赖关系难以管理、代码复用困难等问题。随着Web应用日益复杂&#xff0c;模块化编程成为了解决这些问题的关键。本文将带您…...

面试情景题:企业内部系统如何做微前端拆分,如何通信?

在前端开发领域&#xff0c;技术的演进总是伴随着业务需求的复杂化与规模化而不断向前推进。近年来&#xff0c;微前端&#xff08;Micro Frontends&#xff09;作为一种全新的架构理念&#xff0c;逐渐成为解决大型前端应用复杂性的重要手段。与传统的单体前端应用不同&#x…...

OpenHarmony Camera开发指导(五):相机预览功能(ArkTS)

预览是在相机启动后实时显示场景画面&#xff0c;通常在拍照和录像前执行。 开发步骤 创建预览Surface 如果想在屏幕上显示预览画面&#xff0c;一般由XComponent组件为预览流提供Surface&#xff08;通过XComponent的getXcomponentSurfaceId方法获取surfaceid&#xff09;&…...

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中&#xff0c;鸿蒙操作系统以其独特的 “一多开发” 理念&#xff0c;为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”&#xff0c;即一次开发&#xff0c;多端部署 &#xff0c;旨在让开发者通过一套代码工程&#xff0c;就能高效…...