ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

电动汽车充电负荷模拟与有序充电调控:基于Python和蒙特卡洛的配电网解决方案

电动汽车充电负荷模拟与有序充电调控:基于Python和蒙特卡洛的配电网解决方案 简介一款基于Python开发的电动汽车充电负荷模拟与调控系统源码包面向本科毕业论文研究、充电设施规划人员及电动车仿真开发者用于解决交通网与充电负荷耦合建模、负荷预测及调控策略设计等关键问题。压缩包共76个文件以32个Python源码文件为核心覆盖负荷行为建模、数据处理、模拟算法与调控策略25个CSV文件提供电网状态、SOC分布、停驻时长等输入数据其余XML、sumocfg及txt等文件用于配置仿真参数与场景。包体仅1.29MB结构清晰已有274人学习下载。通过该系统可直接运行多节点路网案例调整参数或更换数据模拟不同场景结合交通网精细化建模思路支撑充电站布点、错峰调度、功率分配等调控方案的实验验证为论文研究提供扎实的代码基础与扩展空间。1. 电动汽车充电负荷模拟与调控一套源码解决配电网里最难算的一笔账小区配电房报装充电桩时物业最常问的一句话是“这桩到底会不会把变压器打爆”。电动汽车充电负荷模拟与调控系统就是用来回答这个问题的工具先用蒙特卡洛方法把成百上千台电动汽车的充电行为叠成一条总负荷曲线再在这条曲线上跑有序充电策略算出削峰填谷能压掉多少容量。基于Python做这套系统好处是随机过程、优化求解、数据可视化三件事都能用一套生态解决源码改起来也快。这篇笔记面向两类读者做配电网规划或充电桩运营的工程人员以及拿电气方向课程设计、毕业设计练手的学生。你会从单台车的充电行为建模一直走到带约束的调控算法中间每一步都附代码和参数边界。2. 用蒙特卡洛模拟单车充电负荷从行驶数据到功率曲线2.1 为什么选蒙特卡洛而不直接给一个负荷均值充电负荷和普通居民负荷最大的区别是它不是一个“平均不变”的量。同样是晚上七点回到家有人跑了三十公里、有人跑了一百公里有人插枪就充、有人第二天早上才充。如果你直接拿“每台车3.5kW、充四小时”去算总负荷得出来的曲线是一条方波既高估了峰值又低估了低谷对变压器容量的判断完全失真。蒙特卡洛方法的核心思想是把每台车的充电行为拆成几个随机变量——到达时间、日行驶里程、起始SOC、充电功率——各自按统计分布抽样然后模拟一千次、一万次把所有单台车功率曲线叠加。这样得到的负荷曲线天然带有随机性和波动性反而更接近真实配电网里发生的事情。在量化交易里讲究“回测要跑足够多样本”充电负荷模拟也一样样本量上不去曲线尾部就稳不住。用Python做这件事numpy负责抽样pandas负责时间轴对齐matplotlib负责看曲线形态一个脚本就能把这件事跑完。2.2 单台车辆的充电过程仿真代码与参数表先写最小可用的单体仿真。下面这段代码模拟一台私家车晚上回家后的慢充过程时间粒度为15分钟一天划分为96个时隙。import numpy as np import pandas as pd def simulate_one_ev(day_idx0): 模拟一台电动汽车的充电功率曲线返回长度为96的功率序列单位kW # 随机参数抽样 capacity_kwh 60.0 # 电池容量常见家用纯电在 50~80 kWh charge_power 7.0 # 交流慢充功率家充桩常见 3.5kW/7kW efficiency 0.9 # 充电效率交流桩一般在 0.88~0.92 # 到达时刻假设工作日回家集中在 17:00~23:00均值 19:30 arrive_minute int(np.random.normal(loc19*6030, scale60)) arrive_minute np.clip(arrive_minute, 17*60, 23*60) # 截断到合理区间 # 日行驶里程对数正态分布均值约 30km方差偏大 daily_mile_km np.random.lognormal(mean3.3, sigma0.9) daily_mile_km np.clip(daily_mile_km, 5, 150) # 起始SOC由行驶里程反推并加上一个小的随机扰动 range_km 400.0 # 标称续航 soc_start 1.0 - daily_mile_km / range_km soc_start np.clip(soc_start, 0.1, 0.95) soc_start np.random.normal(0, 0.02) # 考虑表显SOC误差 # 目标SOC绝大多数家用场景充到 90%不充到 100% 是电池保护习惯 soc_target 0.9 energy_needed_kwh capacity_kwh * (soc_target - soc_start) / efficiency energy_needed_kwh max(energy_needed_kwh, 0) # 如果SOC高于目标就不充 charge_hours energy_needed_kwh / charge_power charge_slots int(np.ceil(charge_hours * 4)) # 换算成15分钟时隙数 # 把充电功率落到96点时隙上 load_profile np.zeros(96) start_slot int(arrive_minute // 15) for i in range(charge_slots): idx start_slot i if idx 96: break # 跨天部分先忽略后面聚合时再处理 load_profile[idx] charge_power return load_profile # 测试单台车 np.random.seed(42) profile simulate_one_ev() print(单台车总充电量(kWh):, profile.sum() * 0.25) print(最大功率(kW):, profile.max())这段代码里最值得关注的是参数字段soc_target设成0.9而不是1.0是因为大多数家用场景的默认充电策略就是充到90%。如果你在仿真里把这个参数设成1.0总负荷会高估约10%在调控容量测算时会造成变压器容量的浪费。charge_power对结果影响更大——3.5kW的桩和7kW的桩相比同样需求量下充电时长差一倍峰值负荷形态完全不同。arrive_minute的截断区间也需要注意。我见过有人不加np.clip蒙特卡洛抽样出来的到达时间出现凌晨两三点这在私家车场景里极罕见会直接拉低晚间高峰段的负荷密度。宁可让分布略偏保守也不要让极端样本污染曲线形态。2.3 关键分布的选取与校准对数正态不是万能钥匙蒙特卡洛仿真的质量不取决于代码写得多漂亮而取决于分布参数是否贴合你的目标场景。日行驶里程用np.random.lognormal(mean3.3, sigma0.9)是一个经验值mean3.3 意味着对数期望约27kmsigma0.9 保证有10%的车日行驶里程超过70km。这组参数来自国内几份城市私家车出行调查报告如果你要做的是出租车或网约车场景这个分布完全不适用——网约车的日行驶里程均值在200km以上充电行为也从“晚上回家充”变成了“白天快充补电”。另一个容易翻车的点是到达时间的分布。工作日和周末的到达时间相差很大周末晚归的概率明显更高。常见做法是把工作日和周末拆成两套参数分别仿镇再按比例加权合成一周负荷而不是用一个正态分布硬套七天。到达时间分布我一般用混合高斯17点到20点一个峰21点到23点一个矮峰模拟“下班直接回家”和“饭后回家”两种行为。最后是起始SOC与行驶里程的关系。代码里的soc_start 1.0 - daily_mile_km / range_km是线性假设实际上电池放电不是完全线性尤其是低温工况下实际SOC会偏低。如果做的是冬季场景仿真建议在这个公式后面再乘一个0.85~0.9的温度修正系数否则模拟出来的充电需求量偏小削峰填谷的效果会被高估。3. 从单车到车队按场景聚合出城市级充电负荷曲线3.1 分车型、分季节的仿真参数矩阵单台车的仿真跑通之后下一步就是把几百上千台车叠起来。但聚合之前要先建一个参数矩阵因为私家车、出租车、公交车三种车型的充电行为差异大到不能共用同一套参数。参数项私家车家用慢充网约车/出租车快充为主电动公交夜间集中充充电功率3.5~7 kW30~60 kW快充桩60~120 kW专用充电站到达时间分布17:00~23:00晚峰明显全天两个峰午间和凌晨21:00~01:00统一回场日行驶里程对数正态均值30km均值200~300km固定线路150~250km起始SOC范围30%~90%10%~50%30%~60%充电目标SOC90%95%赶时间需要95%~100%季节的影响也不容忽视。冬天电池活性下降、开空调制热实际每公里耗电量比夏天高15%到20%。常见的做法是给日行驶里程加一个季节修正系数冬季乘1.2夏季乘1.0春秋乘0.95。另外冬季电池低温保护会导致充电功率下降尤其是快充桩冬天最大功率可能只有标称的60%。如果不做这个修正冬季负荷曲线会偏矮变压器容量规划就会偏保守。3.2 聚合算法把几百条曲线叠成一条日负荷曲线聚合的代码逻辑不复杂核心是把每台车的96点功率序列逐时隙相加然后除以车数得到平均负荷再乘以总数得到总功率。关键点是跨天充电的处理——很多车晚上11点开始充电要充到凌晨3点才结束这部分功率必须算到第二天的凌晨时段。import numpy as np def simulate_fleet(num_cars500, car_typesNone, seed42): 模拟一个车队的充电负荷曲线 car_types: 数组每个元素是 private / taxi / bus np.random.seed(seed) n len(car_types) if car_types is not None else num_cars # 初始化两天的负荷累加器用于处理跨天充电 profile_total np.zeros(96 * 2) # 前24小时后24小时 for i in range(n): # 按车型选参数 if car_types is None or car_types[i] private: power 7.0 arrive_mean 19*60 30 mile_mean, mile_sigma 3.3, 0.9 range_km 400 soc_target 0.9 capacity 60 elif car_types[i] taxi: power 60.0 # 快充 arrive_mean 14*60 # 午间补电 mile_mean, mile_sigma 5.2, 0.6 # 均值约250km range_km 400 soc_target 0.95 capacity 60 else: # bus power 80.0 arrive_mean 22*60 mile_mean, mile_sigma 4.9, 0.3 # 均值约180km range_km 250 soc_target 0.95 capacity 200 # 抽样到达时间 arrive_minute int(np.random.normal(locarrive_mean, scale60)) arrive_minute np.clip(arrive_minute, 0, 23*6059) # 抽样日行驶里程计算起始SOC和充电需求 daily_mile np.random.lognormal(meanmile_mean, sigmamile_sigma) daily_mile np.clip(daily_mile, 3, 400) soc_start 1.0 - daily_mile / range_km soc_start np.clip(soc_start, 0.05, 0.95) energy_needed capacity * (soc_target - soc_start) / 0.9 charge_slots int(np.ceil(energy_needed / power * 4)) # 15min时隙数 start_slot int(arrive_minute // 15) for j in range(charge_slots): idx start_slot j if idx 192: profile_total[idx] power # 取前一天的96点时间为当天00:00~24:00 return profile_total[:96]这段代码里用了一个长度为192点的缓冲区来处理跨天问题——24小时内的充电可以落到当天0到96号时隙但前一天23点开始的充电会落到96以后的位置。取profile_total[:96]作为当天的负荷等于把跨天充电的功率完整算到了凌晨时段。这个细节没有的话你会在凌晨2点到6点的负荷段看到一个不正常的凹陷后面做调控时低谷时段容量调度就会出错。聚合完之后建议加一个筛选逻辑如果某天仿真的总充电量折合到车均低于5kWh说明抽样分布可能有问题或者soc_start普遍偏高需要检查分布参数。用pandas做统计汇总比直接打印numpy数组直观得多这也是我建议在仿真脚本里顺手引入pandas的原因。3.3 叠加基础负荷评估配变压力车队的充电负荷曲线本身只是“新增负荷”真正要看的是叠加在原有居民基础负荷之上后的总曲线。居民基础负荷可以从配变台账或负控系统里拉典型日曲线没有数据时也可以用负荷率0.35~0.5的典型曲线代替。叠加后的评估指标有三个最大负荷、峰谷差、变压器负载率。对应代码很简单base_load np.array([...]) # 96点基础负荷单位kW ev_load simulate_fleet(num_cars300) total_load base_load ev_load peak_load total_load.max() valley_load total_load.min() peak_valley_diff peak_load - valley_load transformer_capacity 630 # kVA小区常见配变容量 load_rate peak_load / transformer_capacity * 100 print(f峰值负荷:{peak_load:.1f} kW, 谷值负荷:{valley_load:.1f} kW) print(f峰谷差:{peak_valley_diff:.1f} kW, 变压器负载率:{load_rate:.1f}%)负载率超过80%就要警惕了配变短时过载可以到120%但持续运行超过两小时会显著缩短寿命。这个阈值就是后面调控系统的约束边界——调控的目标就是让充电负荷尽量避开基础负荷的晚峰把变压器负载率压回安全线以内。评估这一步跑完你就有了“改调控参数前”的基线曲线之后的每版调控算法效果对比都拿这条曲线当参照否则你根本说不清数据改善是算法起作用了还是仿真随机波动造成的。4. 调控系统设计分时电价与有序充电的控制逻辑4.1 无序充电的痛点与调控目标怎么定义无序充电的意思很简单车到家就插枪插枪就按最大功率充完全不做任何延时或功率限制。从配电网角度看这就成了“晚峰叠晚峰”——居民用电高峰在19点到21点电动汽车恰恰在这个时段扎堆接入充电桩。两条峰叠在一起结果就是变压器负载率瞬间拉高小区熔断器跳闸。调控制系统的思路就是给充电过程加两个约束时间上的迁移——把充电从晚峰挪到凌晨低谷功率上的限制——在变压器容量紧张时降低单台桩的充电功率。这两个约束在代码实现上可以分开做也可以合并进一个优化模型里。调控目标需要写成可量化的指标常见三个指标定义用于什么场景削峰率(无序峰值-调控后峰值)/无序峰值衡量峰值削减效果峰谷差缩小率(无序峰谷差-调控后峰谷差)/无序峰谷差衡量曲线平坦度改善充电费用节省率(无序电费-调控后电费)/无序电费衡量用户侧经济性这三个指标在代码里都要算因为配电网侧关心削峰率用户侧关心电费节省率运营商关心峰谷差。一个成功的调控策略必须三者兼顾只顾削峰会让用户电费反而上涨这种方案推到现场没人接受。4.2 用贪心算法实现一个可落地的削峰填谷调度器完整的充电调度是一个带约束的优化问题但对大多数小区场景贪心算法已经够用而且天然适合做日内滚动调度。核心思路是每辆车的充电截止时间不同在满足“明天出发前充满”的前提下优先把充电功率安排在电价低谷和非高峰时段。def greedy_schedule(ev_list, base_load, price_curve, trans_capacity): ev_list: 每辆车的信息 {id, arrive_slot, energy_kwh, power_kw} base_load: 96点基础负荷 price_curve: 96点电价序列 trans_capacity: 变压器安全运行容量 返回: 调度后的96点充电总负荷 total_load base_load.copy() ev_load np.zeros(96) # 按可调度时限升序排列截止早的优先 ev_list_sorted sorted(ev_list, keylambda x: x.get(deadline_slot, 95)) for ev in ev_list_sorted: arr ev[arrive_slot] energy_needed ev[energy_kwh] power ev[power_kw] slots_needed int(np.ceil(energy_needed / power * 4)) # 候选时隙从到达时间到早上8点(第32时隙)按电价从低到高排序 candidate_slots [t for t in range(arr, 96) if t % 96 32] candidate_slots.sort(keylambda t: price_curve[t]) scheduled [] for t in candidate_slots: if len(scheduled) slots_needed: break # 容量约束基础负荷已有EV负荷本车功率 变压器容量 if total_load[t] power trans_capacity: total_load[t] power ev_load[t] power scheduled.append(t) # 如果容量不够允许在变压器的短时过载余量内充电 if len(scheduled) slots_needed: for t in candidate_slots: if len(scheduled) slots_needed: break if total_load[t] power trans_capacity * 1.2: total_load[t] power ev_load[t] power scheduled.append(t) return ev_load这段代码的关键逻辑是candidate_slots的构造和排序——每个时隙按电价从低到高排贪心策略总是先把充电需求塞进最便宜、最没容量压力的时段。第二个循环里允许短时过载到120%这是实际工程里的常见妥协变压器在环境温度不高时可以临时过载但不允许长时间满负荷运行。把“硬约束”放到1.0倍把“软约束”放到1.2倍是现场可落地的关键。这里有个容易被忽略的细节slots_needed的计算必须用充电功率而不是电池容量去除。有同行在写调度器时直接用energy_needed // power得到小时数再乘以4得到时隙数忽略了np.ceil——这会导致充电时长少算一个时隙所有车都少充15分钟累计下来电量缺口接近5%。宁可多分配一个时隙然后计算出实际充电量时截断也不能少算。4.3 用线性规划做更精细的调控把费用和容量写进目标函数贪心算法的局限在于它不是全局最优。电价低谷集中在凌晨1点到5点如果所有车都扎堆在这个时段充电变压器容量在凌晨也可能过载。想做全局最优调度可以用scipy.optimize.linprog或PuLP建线性规划模型。下面用scipy写一个最简单版本每辆车在每个时隙的充电功率为决策变量目标是最小化总电费约束是变压器容量和车辆充电量。from scipy.optimize import linprog def lp_schedule(ev_list, base_load, price_curve, trans_capacity): n_ev len(ev_list) n_slots 96 # 决策变量: x[i*96 t] 表示第i辆车在t时隙的充电功率 c np.tile(price_curve, n_ev) # 目标函数系数总电费 # 等式约束每辆车充电量 需求电量 A_eq [] b_eq [] for i in range(n_ev): row np.zeros(n_ev * n_slots) row[i*n_slots : (i1)*n_slots] 0.25 # 15分钟时隙乘0.25得到kWh A_eq.append(row) b_eq.append(ev_list[i][energy_kwh]) # 不等式约束每个时隙基础负荷充电负荷 变压器容量 A_ub [] b_ub [] for t in range(n_slots): row np.zeros(n_ev * n_slots) for i in range(n_ev): row[i*n_slots t] 1.0 A_ub.append(row) b_ub.append(trans_capacity - base_load[t]) # 变量边界每时隙充电功率在0到该车最大功率之间 bounds [] for ev in ev_list: bounds [(0, ev[power_kw])] * n_slots result linprog(c, A_ubA_ub, b_ubb_ub, A_eqA_eq, b_eqb_eq, boundsbounds, methodhighs) if not result.success: print(求解失败:, result.message) return None x result.x.reshape(n_ev, n_slots) ev_load x.sum(axis0) return ev_load这段线性规划的规模是500辆车乘以96个时隙等于48000个决策变量对scipy来说毫无压力几百毫秒就能出结果。但要注意methodhighs是必须指定的——scipy默认方法在变量超过两万时容易报内存错误HiGHS 求解器对大规模稀疏问题更稳定。实际工程中我一般把线性规划和贪心算法结合着用先用LP求离线最优解得到一个“理论上限”再用贪心算法做日内滚动调度。如果贪心算法的削峰率能达到LP最优解的90%以上就不需要上重型优化框架如果差距太大再考虑把LP嵌入滚动调度。这样做的好处是系统复杂度可控现场跑得稳。5. 避坑与排查仿真结果失真和调控失效的6个常见原因5.1 随机种子不固定两次仿真结果对不上现象昨天跑出来的峰值负荷是680kW今天重新运行同一个脚本变成720kW没有人改动任何代码。原因蒙特卡洛仿真没有固定整条链路的随机种子。你的simulate_fleet里分了三个车型分别抽样但只要有一个np.random调用没有走全局种子整个新车队的抽样序列就会偏移。更隐蔽的是如果dict的遍历顺序在不同Python版本间改变3.7之前不保证顺序同一台车分到的参数也会漂移。解决在每个仿真入口的最顶部调用np.random.seed(42)并且把种子作为函数参数传进去而不是写成全局变量。需要对比不同渗透率场景时记得场景A和场景B要用同一个种子序列只在车辆数量或分布参数上做差分否则曲线差异里混入了随机波动归因会非常困难。5.2 充电效率设成1.0总负荷被低估现象仿真出来的总充电量明显小于充电桩系统实际计量的电量差幅在10%~15%。原因真实充电过程从交流侧到电池的能量转换效率大约在0.88到0.92之间。有人嫌麻烦直接写energy capacity * (target_soc - start_soc)把效率项忽略了。这个10%的误差在单车时看不见但车队规模到500台以上时相当于日均少算了300多度电折合变压器容量约50kW。解决在单体仿真和调度器的等式约束里都保留efficiency参数默认0.9。做敏感性分析时把0.85和0.92各跑一遍看目标指标波动范围。如果峰谷差的变化幅度超过10%说明调控策略对效率参数敏感需要进一步校准。5.3 跨天充电被截断凌晨负荷出现假谷值现象凌晨1点到5点的负荷曲线几乎贴到零轴和实际充电站凌晨排队充电的情况明显不符。原因单体仿真里写了if idx 96: break凌晨时段的充电功率被截断丢弃。单台车丢弃的功率看起来不多但几百台车在23点到1点之间开始充电被截断的能量积累起来就是一个很大的负荷缺口。解决把单台车功率写入长度为192的缓冲区或者直接在聚合时用profile_total[i % 96] power做环绕叠加。调度器和负荷模拟器共用同一套跨天处理逻辑否则模拟出来的曲线和实际调度后的曲线就对不上。5.4 快充桩功率设成恒值低温场景完全失真现象冬季仿真曲线的快充部分出现一个超过200kW的尖峰而实际充电站冬天根本跑不出这个功率。原因市面上几乎所有快充桩都遵循“功率温度曲线”——电池温度低于15度时充电功率会被BMS限制在最大功率的50%到70%。仿真代码里把充电功率写成一个固定常数低温场景下就严重高估了单桩瞬时功率。解决给快充车型增加温度修正系数冬季0.6、春秋0.85、夏季1.0。如果你有电池热管理系统的数据可以用一个分段函数SOC在0到80%时满功率80%以上功率逐步线性降到30%。这个SOC段的功率降额比温度更普遍——快充桩在电池80%以后降功率是为了保护电池寿命这个边界不写进仿真峰值负荷形态就会失真。5.5 调控算法无约束跑容量校核时直接崩掉现象贪心调度器在变压器容量设置为630kVA时结果正常改成500kVA后大量车冲不进candidate_slots最终返回的充电量不足需求量的80%但脚本没有报错。原因第一个贪心循环的硬约束在容量较小时筛掉了太多时隙第二个软约束循环的候选列表又已经空了车辆需求没能被满足但代码没有校验每个车最终安排了几个时隙。解决在每个循环结束后加assert len(scheduled) slots_needed * 0.9之类的检查或者返回每个车的实际充电量匹配表。调度器的输出不能只有一条总负荷曲线必须带每辆车的电量缺口明细。用户侧最反感的就是“充了一晚上没充满”这个再现场景必须在仿真阶段就暴露出来。5.6 用sum当标量算曲线被各种小bug带偏现象仿真结果在某个时隙点出现孤立尖峰排查发现是某辆车的行驶里程抽样出了负数被clip拉回3km后起始SOC算出来超过0.95充电需求变成负值max(energy_needed, 0)吞掉了负数但功率残留在了某个时隙。原因负里程在lognormal抽样中理论上不会出现但如果你把分布换成正态分布就会遇到。问题不在抽样函数而在代码的各个阶段缺少合理性校验。解决在仿真主循环尾部加一个汇总校验函数检查每天的总充电量/车数是否在常识区间、最大单车充电功率是否超过充电桩额定功率、每个时隙的总负荷是否是有限值。这三条检查能拦掉80%的数据异常。执行一万次蒙特卡洛只需要几秒钟但检查逻辑就能帮你省下好几个小时的查虫时间。6. 进阶把调控从离线仿真推向日内滚动验证前面写的调控调度器是“拿到全天车辆信息后离线算一次”但真实充电站根本不知道明天会有多少车来、每辆车几点走。要做成能落地的系统必须改成滚动调度。常见做法是每个小时跑一次调度器只对未来4到6小时做决策每小时滚动刷新一次。滚动调度的核心改动有三个。第一把车辆信息从“全量已知”改成“窗口已知”每台车到达时写入一个待调度队列调度器只看到截止时间在当前时间窗口内的车。第二已经安排给某辆车的充电功率如果车辆提前离开要把时间片释放回容量池——这一步在代码里需要一个release_power(ev_id)函数回收已分配但未使用的功率。第三目标函数的权重随窗口滚动变化离现在越近的时隙权重越高因为近时段的预测误差最小远时隙的权重打折给后续滚动修正留出余地。还有一个在仿真脚本里容易忽略但现场非常关键的验证维度调控后的充电曲线要和充电桩平台的真实数据做比对而不是只和仿真基线比。常见做法是把充电桩的实时数据按15分钟粒度拉下来和调度器的计划值算均方根误差。误差低于8%说明调参到位高于15%就要检查是不是车辆实际到达时间分布和仿真假设相差太大。以我自己的习惯跑完一个充电负荷模拟项目后至少会固守一条纪律仿真脚本和调度器必须共用同一个配置文件里面放车型参数、分布参数、电价曲线和变压器容量。任何一次实验改参数都走配置文件不直接在代码里改数字——否则一周以后你翻回来看脚本根本不知道当前的曲线是哪种参数组合跑出来的这才是最大的坑。希望这份笔记里的代码和参数边界能帮你在自己的项目里少绕几次弯。本文还有配套的精品资源点击获取
返回列表