電價(jià)下電動(dòng)汽車有序充放電仿真建模與調(diào)度策略解析)
最近總有人問我“分時(shí)電價(jià)下電動(dòng)汽車有序充放電仿真”到底怎么入門今天就拿我自己做過的完整案例從原理到建模仿真一步步拆給你看。這個(gè)領(lǐng)域核心要解決的就是一件事在峰谷電價(jià)差面前如何制定每臺(tái)電動(dòng)汽車的充放電策略在保證車主用車需求的前提下把充電成本壓到最低甚至通過參與電網(wǎng)調(diào)度小賺一筆。文章面向電力專業(yè)學(xué)生、做智能電網(wǎng)項(xiàng)目的研究生以及想轉(zhuǎn)行做新能源調(diào)度的工程師也適合剛接觸仿真的新手——我會(huì)盡量把每個(gè)環(huán)節(jié)的操作邏輯講透配合可直接復(fù)現(xiàn)的參數(shù)設(shè)置看完就能在MATLAB或Python里跑出自己的版本。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 為什么偏要用分時(shí)電價(jià)做“有序充放電”先搞清楚你要仿真的對(duì)象到底是什么。分時(shí)電價(jià)就是把一天按負(fù)荷情況劃分成峰、平、谷幾個(gè)時(shí)段每個(gè)時(shí)段電價(jià)不同峰時(shí)段貴、谷時(shí)段便宜。電動(dòng)汽車有序充放電的邏輯就是利用這個(gè)價(jià)差在谷時(shí)段盡量充電在峰時(shí)段如果有富余電量和必要就向電網(wǎng)放電也就是V2G用低價(jià)電和放電收益去抵消峰時(shí)段用電成本。這個(gè)機(jī)制聽起來簡(jiǎn)單但實(shí)際建模時(shí)涉及到一個(gè)用戶底線不管怎么調(diào)節(jié)你不能讓車主第二天沒電可用也不能讓電池電量低于安全閾值。我把這個(gè)問題拆成三個(gè)層次來理解第一層是電價(jià)層輸入一天24小時(shí)的分時(shí)電價(jià)曲線第二層是車輛層每臺(tái)車有電池容量、起始SOC、目標(biāo)SOC、充放電功率限制第三層是策略層要設(shè)計(jì)一個(gè)目標(biāo)函數(shù)和約束條件讓調(diào)度算法自動(dòng)決定每一小時(shí)每臺(tái)車是充電、放電還是待機(jī)。仿真的難點(diǎn)不在單個(gè)層次而在三層耦合——電價(jià)峰谷和車輛充電選擇互相影響而多臺(tái)車同時(shí)調(diào)度又帶來計(jì)算復(fù)雜度。我在實(shí)際項(xiàng)目中采用的方式是把車輛劃分成若干組每組內(nèi)部統(tǒng)一調(diào)度這樣既保留了個(gè)性化用車需求又控制了求解時(shí)間。這個(gè)方案選型并不是拍腦袋想出來的。最開始我嘗試過讓每輛車獨(dú)立優(yōu)化再匯總到電網(wǎng)側(cè)結(jié)果遇到兩個(gè)問題一是多車在同一峰值時(shí)段集中充電形成的負(fù)荷尖峰反而被電網(wǎng)高峰疊加了二是多目標(biāo)沖突時(shí)每次都要反復(fù)調(diào)整權(quán)重才能收斂。最終我轉(zhuǎn)向聚合調(diào)度策略把所有可調(diào)度的電動(dòng)汽車看成一個(gè)虛擬儲(chǔ)能池按照用戶設(shè)置的“參與放電意愿”進(jìn)行排序優(yōu)先調(diào)度那幾個(gè)余電多、用車時(shí)間晚的車。這樣整個(gè)模型復(fù)雜度大幅下降而且邏輯上更貼近現(xiàn)實(shí)中充電運(yùn)營(yíng)商的做法。1.2 從“無序充電”到“有序調(diào)度”到底改了什么很多初學(xué)者以為有序充放電仿真就是給每輛車設(shè)一個(gè)固定充電時(shí)間跑一條曲線的區(qū)別。真不是這么回事。無序充電的場(chǎng)景是車子回到家插上槍就開始充一直充到滿或到設(shè)定目標(biāo)電量為止。這個(gè)模式下不需要任何智能決策仿真里只需要一條標(biāo)準(zhǔn)的充電功率曲線即可。但有序調(diào)度則要求你在充電過程里嵌入一個(gè)決策模塊每個(gè)時(shí)間步它都要回答三個(gè)問題當(dāng)前時(shí)段是峰還是谷、車輛當(dāng)前SOC是多少、目標(biāo)出發(fā)時(shí)間還剩幾小時(shí)。這個(gè)決策過程直接改變了仿真的數(shù)據(jù)結(jié)構(gòu)輸入不再是功率和時(shí)間的簡(jiǎn)單數(shù)組而是一個(gè)帶約束的最優(yōu)化問題。求解結(jié)果也不再是“充到滿為止”而是“在此電價(jià)時(shí)段內(nèi)充電或放電多少”。我在最初建模時(shí)候犯過一個(gè)經(jīng)典錯(cuò)誤直接拿無序充電的時(shí)序模型套用有序調(diào)度導(dǎo)致計(jì)算結(jié)果每天成本比無序充電還高。排查后發(fā)現(xiàn)問題在于我忽略了放電這個(gè)動(dòng)作本身的損耗代價(jià)。電池充放電有能量損耗約5%到10%如果你在每個(gè)峰谷切換點(diǎn)都頻繁放電損耗成本會(huì)吃掉大部分電價(jià)套利收益。所以后面我在模型中加入了“放電判定閾值”只有在峰谷價(jià)差超過一定比例時(shí)才允許V2G動(dòng)作這個(gè)細(xì)節(jié)對(duì)最終收益影響非常大建議每個(gè)人做的時(shí)候都認(rèn)真對(duì)待。1.3 仿真工具選型的經(jīng)驗(yàn)MATLAB還是Python做這塊仿真主流就兩條路線MATLAB/Simulink和Python。我的建議是新手優(yōu)先選MATLAB因?yàn)镾imulink里有現(xiàn)成的電池模型和電力電子模塊搭電路-控制聯(lián)合仿真最方便但如果你的目標(biāo)是驗(yàn)證調(diào)度算法本身比如考慮優(yōu)化策略、大量隨機(jī)場(chǎng)景那我更推薦Python它的生態(tài)里有成熟的優(yōu)化求解器寫代碼邏輯更靈活。如果你的仿真重點(diǎn)偏電網(wǎng)潮流或電池物理特性那可以用MATLAB/Simulink嵌套動(dòng)態(tài)模型如果重點(diǎn)是智能調(diào)度算法則用Python跑決策模型計(jì)算完成后再把結(jié)果拿回MATLAB繪制圖表。我自己在完整仿真實(shí)操里使用過兩種結(jié)合的方式核心調(diào)度算法用Python寫因?yàn)樾枰磸?fù)迭代調(diào)參電池充放電物理過程放到Simulink里驗(yàn)證確認(rèn)算法生成的功率序列不會(huì)觸發(fā)電氣約束。不過必須誠懇地說如果只是想入門直接用MATLAB腳本建一個(gè)簡(jiǎn)化模型就夠了先把主鏈條跑通后面再逐步增加復(fù)雜度千萬不要一步到位搭一個(gè)龐大的聯(lián)合仿真平臺(tái)否則排查問題時(shí)你根本不知道錯(cuò)在哪一層。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 分時(shí)電價(jià)曲線的設(shè)置邏輯電價(jià)曲線是整個(gè)仿真的輸入基礎(chǔ)。國(guó)內(nèi)常見的分時(shí)電價(jià)一般把一天劃分成峰、平、谷三段有些地區(qū)更進(jìn)一步劃分成尖峰、高峰、平段、低谷四段峰段通常是8:00-11:00和18:00-21:00平段是7:00-8:00、11:00-18:00谷段是23:00-次日7:00。每個(gè)區(qū)域、季節(jié)的具體時(shí)段不一樣有些地方甚至每個(gè)月調(diào)整一次。做仿真時(shí)不要用別人論文里的電價(jià)表直接套否則結(jié)果在你的場(chǎng)景下完全沒意義。正確做法是去本地電網(wǎng)公司的公示文件里抓最新的分時(shí)電價(jià)表然后再處理成仿真需要的逐時(shí)價(jià)格數(shù)組單位統(tǒng)一換算成元/kWh。我在實(shí)操中遇到過一個(gè)細(xì)節(jié)坑很多地區(qū)公布的電價(jià)表里居民用電和工商業(yè)用電的峰谷時(shí)段不同一般是錯(cuò)開的。仿真時(shí)你要先明確對(duì)象是居民區(qū)的私人充電樁還是公共充電站的運(yùn)營(yíng)車輛。不同對(duì)象決定了你該用哪張電價(jià)表也決定了放電收益計(jì)算的口徑。我做過的一個(gè)校園微電網(wǎng)案例里還牽扯到季節(jié)性電價(jià)夏季和冬季的峰段時(shí)段不一樣這需要你在仿真模型里預(yù)留一個(gè)電價(jià)配置接口不要把電價(jià)硬編碼在算法內(nèi)部。萬一后面要換月份或換區(qū)域你只需替換參數(shù)文件就行這個(gè)設(shè)計(jì)對(duì)后續(xù)測(cè)試幫助很大。2.2 電動(dòng)汽車相關(guān)的核心參數(shù)怎么定車輛參數(shù)分為三類電池物理參數(shù)、行駛需求參數(shù)、充放電控制參數(shù)。先說電池物理參數(shù)主要包括電池容量kWh、初始SOC、充放電功率上限kW、充放電效率。這個(gè)環(huán)節(jié)常見錯(cuò)誤是設(shè)置充放電效率為1即默認(rèn)無損耗這在長(zhǎng)期仿真里會(huì)導(dǎo)致收益虛高。真實(shí)鋰離子電池的充電效率約90%到95%放電效率約90%到96%綜合往返效率約85%到90%。我會(huì)建議在模型里分別設(shè)置充電效率和放電效率而不是合并成一個(gè)常數(shù)因?yàn)閮烧叩膿p耗差異會(huì)影響峰谷套利的判斷。行駛需求參數(shù)則直接決定調(diào)度自由程度。一個(gè)晚歸早走的上班族晚上11點(diǎn)回家、早上7點(diǎn)出門夜間窗口期足夠充滿電調(diào)度自由度反而小而一個(gè)白天停車、傍晚才走的網(wǎng)約車司機(jī)在中午屋頂光伏滿發(fā)或谷段時(shí)段有大量靈活充放電機(jī)會(huì)。做仿真時(shí)你要為每輛車定義接入電網(wǎng)的時(shí)間段、期望離開時(shí)間、離網(wǎng)時(shí)最低SOC、日行駛里程等信息。這些參數(shù)直接影響約束條件而不是僅僅作為背景字段??刂茀?shù)里最關(guān)鍵的是SOC范圍限制建議充放電都設(shè)置安全邊界比如充電不超95%放電不低于20%。這個(gè)下限我建議根據(jù)車型電池類型來設(shè)定磷酸鐵鋰可以稍微低一點(diǎn)三元鋰盡量保留在30%以上。原因在于電池壽命和放電能力的非線性衰退過度放電會(huì)顯著加速容量衰減。仿真模型里如果不設(shè)這個(gè)約束算法會(huì)在谷段瘋狂低價(jià)買入、峰段瘋狂放電表面收益數(shù)字很好實(shí)際不可行。2.3 有序充放電策略算法的核心結(jié)構(gòu)策略算法本質(zhì)上是一個(gè)帶約束的最優(yōu)化問題目標(biāo)函數(shù)通常是當(dāng)天總電費(fèi)最小化也可以再加一個(gè)電池?fù)p耗懲罰項(xiàng)。最簡(jiǎn)單也最容易理解的是線性規(guī)劃模型決策變量是每臺(tái)車在每個(gè)小時(shí)的充放電功率正值充電、負(fù)值放電。約束條件包括功率上下限、SOC動(dòng)態(tài)平衡、SOC安全范圍、用車需求保證。目標(biāo)是讓所有車輛一天的費(fèi)用總和最小。這里我放下自己寫過的一個(gè)簡(jiǎn)化版目標(biāo)函數(shù)結(jié)構(gòu)給參考注意重點(diǎn)關(guān)注建模思路而不是直接拿代碼跑因?yàn)閷?shí)際場(chǎng)景的約束項(xiàng)要比這個(gè)多很多。定義目標(biāo)費(fèi)用所有車所有時(shí)段的充電電量乘以充電價(jià)格之和減去所有放電電量乘以放電補(bǔ)償價(jià)之和。這里要注意放電時(shí)獲得的收益在模型中要算作負(fù)成本才能讓優(yōu)化器主動(dòng)選擇在峰段放電。同時(shí)電池能量損耗函數(shù)會(huì)形成非線性項(xiàng)如果直接用線性規(guī)劃需要把損耗近似為線性關(guān)系或者改用混合整數(shù)規(guī)劃來精確描述每輛車在某時(shí)段是否處于充電狀態(tài)。第二個(gè)關(guān)鍵點(diǎn)是時(shí)間粒度的選擇。我用過的幾種粒度包括15分鐘、30分鐘、1小時(shí)。粒度越小價(jià)格波動(dòng)信息越充分調(diào)度策略越靈敏但求解時(shí)間會(huì)急劇上升。我個(gè)人的建議入門階段用1小時(shí)粒度跑通邏輯后再嘗試30分鐘逐步對(duì)比同一策略在不同粒度下的差異。還有一個(gè)容易被忽略的問題就是時(shí)區(qū)偏移。部分地區(qū)夏季執(zhí)行夏令時(shí)或特殊尖峰時(shí)段顆粒度選15分鐘時(shí)時(shí)段邊界和電價(jià)尖峰可能錯(cuò)位要注意在你的數(shù)據(jù)索引里對(duì)齊時(shí)標(biāo)否則計(jì)算出來的費(fèi)用會(huì)偏到離譜。2.4 放電阻止機(jī)制、荷電狀態(tài)平衡與用車需求優(yōu)先級(jí)有序放電并不是“沒限制地隨便放”仿真里必須實(shí)現(xiàn)三組防線。第一組是SOC下限防線無論峰時(shí)電價(jià)多誘人都必須終止放電第二組是時(shí)間防線臨近離網(wǎng)時(shí)間前一定時(shí)間段內(nèi)禁止放電只允許充電或待機(jī)否則放電后來不及補(bǔ)電第三組是功率防線充電樁的額定功率限制與電網(wǎng)變壓器容量限制同時(shí)生效多臺(tái)車同時(shí)放電時(shí)還要考慮本地開關(guān)的容量上限。我仿真時(shí)踩過一個(gè)很典型的坑沒有加入“臨近出發(fā)禁止放電”的約束。結(jié)果算法為了讓電費(fèi)最小化在早上7點(diǎn)離網(wǎng)前一個(gè)時(shí)段安排車輛放電雖然那時(shí)電價(jià)處于峰段但放電后SOC不夠到達(dá)目標(biāo)值違反了用車需求約束。如果你用的是標(biāo)準(zhǔn)的優(yōu)化求解器這個(gè)違反約束的情況一般會(huì)被發(fā)現(xiàn)并警告如果你用的是自寫貪婪規(guī)則函數(shù)那就可能悄悄放掉了最終結(jié)果根本不滿足現(xiàn)實(shí)約束。排查很久才發(fā)現(xiàn)原因。所以我建模型時(shí)養(yǎng)成了一個(gè)習(xí)慣每個(gè)優(yōu)化完成之后立刻做一次約束校驗(yàn)?zāi)_本專門檢查所有車輛在每個(gè)時(shí)段的SOC是否落在安全區(qū)間內(nèi)發(fā)現(xiàn)違規(guī)節(jié)點(diǎn)馬上定位是哪個(gè)約束被突破了。3. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 基礎(chǔ)數(shù)據(jù)準(zhǔn)備構(gòu)建一天的場(chǎng)景以我最近做的一個(gè)小區(qū)充電站場(chǎng)景為例我用下表定義基礎(chǔ)的場(chǎng)景參數(shù)供參考時(shí)段編號(hào)時(shí)段名稱時(shí)間范圍電價(jià)元/kWh1谷段23:00-07:000.322平段07:00-08:00、11:00-18:000.703峰段08:00-11:00、18:00-21:001.104尖峰21:00-23:001.30再定義4輛車作為初始測(cè)試集車輛A電池容量40kWh初始SOC為50%18:00接入、次日07:00離網(wǎng)目標(biāo)離網(wǎng)SOC為80%車輛B電池容量60kWh初始SOC為80%08:00接入、17:00離網(wǎng)目標(biāo)離網(wǎng)SOC為90%車輛C電池容量40kWh初始SOC為30%全天僅在谷段前接入22:00接入、06:00離網(wǎng)目標(biāo)離網(wǎng)SOC為100%車輛D電池容量80kWh初始SOC為60%10:00接入、16:00離網(wǎng)目標(biāo)離網(wǎng)SOC為70%。這四輛車的接入時(shí)間和初始SOC都不同可以覆蓋多種調(diào)度場(chǎng)景。構(gòu)建這些數(shù)據(jù)的目的就是要讓每臺(tái)車在電價(jià)峰谷中的可調(diào)度窗口差異足夠大才能體現(xiàn)有序調(diào)度算法的價(jià)值。我在這一步驟的實(shí)操心得是所有參數(shù)最好寫成一個(gè)JSON文件或CSV表格而不是在代碼里逐個(gè)賦值。因?yàn)楹竺孀雒舾行苑治鰰r(shí)你需要批量修改電池容量、初始SOC等參數(shù)用配置文件比改代碼快得多也避免改錯(cuò)變量。我的習(xí)慣是數(shù)據(jù)、策略、求解三層分離數(shù)據(jù)文件只負(fù)責(zé)輸入策略層負(fù)責(zé)定義優(yōu)化規(guī)則求解層負(fù)責(zé)調(diào)用優(yōu)化器最后再單獨(dú)做一個(gè)結(jié)果可視化模塊。這樣的工程結(jié)構(gòu)雖然前期搭建稍慢但后期調(diào)試效率提升極其明顯。3.2 構(gòu)建優(yōu)化調(diào)度核心模型接下來寫核心調(diào)度模型的代碼。我用Python生態(tài)來做演示因?yàn)樗那蠼馄鹘涌诒容^統(tǒng)一。以下代碼是我在項(xiàng)目中使用的簡(jiǎn)化版本核心框架可以直接復(fù)用。import numpy as np import pandas as pd from scipy.optimize import linprog # 場(chǎng)景參數(shù) T 24 # 24個(gè)時(shí)段粒度為1小時(shí) price np.array([0.32]*8 [0.70, 0.70, 1.10, 1.10, 1.10, 0.70, 0.70, 0.70, 0.70, 0.70, 1.10]*3 [0.70, 1.10, 1.30, 1.30]) # 注意這個(gè)price數(shù)組需要和實(shí)際時(shí)段對(duì)齊 # 我這里簡(jiǎn)化處理實(shí)際使用時(shí)請(qǐng)逐時(shí)段核對(duì)。 # 車輛參數(shù) vehicles [ {capacity: 40, init_soc: 0.50, target_soc: 0.80, t_in: 18, t_out: 7, p_max: 7, eta_ch: 0.92, eta_dis: 0.92}, {capacity: 60, init_soc: 0.80, target_soc: 0.90, t_in: 8, t_out: 17, p_max: 7, eta_ch: 0.92, eta_dis: 0.92}, {capacity: 40, init_soc: 0.30, target_soc: 1.00, t_in: 22, t_out: 6, p_max: 7, eta_ch: 0.92, eta_dis: 0.92}, {capacity: 80, init_soc: 0.60, target_soc: 0.70, t_in: 10, t_out: 16, p_max: 7, eta_ch: 0.92, eta_dis: 0.92}, ] n_v len(vehicles) # 決策變量每個(gè)時(shí)段、每輛車的充放電功率 # 變量排列方式先所有車的充電功率(T*n_v個(gè))再所有車的放電功率(T*n_v個(gè)) n_var T * n_v * 2 # 目標(biāo)函數(shù)系數(shù)充電時(shí)為正成本放電時(shí)為負(fù)收益 c np.zeros(n_var) for t in range(T): for v in range(n_v): c[t*n_v v] price[t] # 充電成本 c[T*n_v t*n_v v] -price[t] * 0.9 # 放電收益打九折考慮放電損耗 # 約束矩陣和邊界 A_ub [] b_ub [] # 約束1充放電功率上下限 for t in range(T): for v in range(n_v): row np.zeros(n_var) row[t*n_v v] 1 A_ub.append(row) b_ub.append(vehicles[v][p_max]) row np.zeros(n_var) row[T*n_v t*n_v v] 1 A_ub.append(row) b_ub.append(vehicles[v][p_max]) # 約束2任意時(shí)段不能同時(shí)充放電簡(jiǎn)化處理成疊加不超上限 # 更嚴(yán)謹(jǐn)應(yīng)該用整數(shù)變量這里用功率和上限近似 for t in range(T): for v in range(n_v): row np.zeros(n_var) row[t*n_v v] 1 row[T*n_v t*n_v v] 1 A_ub.append(row) b_ub.append(vehicles[v][p_max]) # 約束3SOC動(dòng)態(tài)變化與安全范圍通過線性不等式近似 # 這里用等式的線性近似SOC_time init_soc cumsum(eta_ch*P_ch/ cap - P_dis/(eta_dis*cap)) # 為簡(jiǎn)化我們構(gòu)建每個(gè)時(shí)段結(jié)束時(shí)的SOC約束。 A_eq [] b_eq [] for v in range(n_v): soc vehicles[v][init_soc] for t in range(vehicles[v][t_in], T): row np.zeros(n_var) # 充電增加SOC row[t*n_v v] vehicles[v][eta_ch] / vehicles[v][capacity] # 放電減少SOC row[T*n_v t*n_v v] -1 / (vehicles[v][eta_dis] * vehicles[v][capacity]) # 這里為了簡(jiǎn)化直接采用每個(gè)時(shí)段結(jié)束后的累計(jì)SOC約束實(shí)際應(yīng)構(gòu)建前綴和矩陣這里必須說明上述代碼只是最粗糙的骨架實(shí)際運(yùn)行時(shí)你還需要把約束矩陣構(gòu)造完整、加上每個(gè)時(shí)段的SOC累計(jì)前綴約束最終交接給linprog求解。我特別提醒一點(diǎn)用線性規(guī)劃近似SOC動(dòng)態(tài)時(shí)如果初始SOC與目標(biāo)SOC差距較大你需要在每個(gè)時(shí)間段都添加不等式約束而不能只在最終時(shí)段加約束。因?yàn)閮?yōu)化器如果只看最終值它會(huì)在前幾個(gè)時(shí)段瘋狂放電賺收益最后一小時(shí)再猛充電完成任務(wù)這顯然不符合電池和電網(wǎng)的實(shí)際運(yùn)行約束。3.3 在MATLAB/Simulink中驗(yàn)證電池物理模型當(dāng)你用Python算出每小時(shí)的功率序列后下一步是在Simulink里驗(yàn)證這套序列能否被底層電池-充電樁系統(tǒng)執(zhí)行。我在Simulink里搭過一個(gè)相對(duì)完整的驗(yàn)證框架包含鋰電池等效電路模型、充電樁功率控制環(huán)節(jié)、變壓器容量監(jiān)控三個(gè)模塊。鋰電池模型我用的是Simscape Electrical庫里的預(yù)設(shè)電池塊設(shè)置成與Python端相同的容量、初始SOC和充放電效率。功率控制環(huán)節(jié)接收來自Python端的功率指令轉(zhuǎn)換為PWM信號(hào)控制DC-DC變換器。變壓器容量監(jiān)控檢測(cè)所有充電樁的總功率是否超過配變額定容量。這個(gè)聯(lián)合驗(yàn)證過程幫我發(fā)現(xiàn)了一個(gè)Python端沒注意的問題功率序列的時(shí)間粒度為1小時(shí)但Simulink里的電池模型是連續(xù)時(shí)間系統(tǒng)功率突變會(huì)造成電壓跌落或電流沖擊。解決方法是在功率序列到達(dá)Simulink之前加一個(gè)一階慣性環(huán)節(jié)設(shè)定時(shí)間常數(shù)約5分鐘平滑功率階躍。這個(gè)平滑處理其實(shí)就是模擬真實(shí)充電樁的功率爬坡限制現(xiàn)實(shí)中充電樁不可能瞬間從0kW跳到7kW。如果你跳過這一步Simulink仿真很可能會(huì)因?yàn)殡娏骼擞繄?bào)錯(cuò)或者結(jié)果看不出但實(shí)際并不物理。我在實(shí)際操作中發(fā)現(xiàn)最好把Python端算出的功率序列導(dǎo)出為CSV再用Simulink的From Workspace模塊導(dǎo)入而不是手動(dòng)在Simulink里生成功率信號(hào)這樣可以避免兩邊的數(shù)據(jù)格式不一致。另外在Simulink中仿真運(yùn)行前建議把求解器步長(zhǎng)設(shè)小一些默認(rèn)的ode45在某些電池模型里容易產(chǎn)生數(shù)值震蕩我通常改成ode23t或ode15s收斂速度和穩(wěn)定性都更好。3.4 完整運(yùn)行流程與結(jié)果輸出按我通常的操作順序一次完整仿真跑下來分五步。第一步讀取配置文件載入電價(jià)、車輛參數(shù)和網(wǎng)格參數(shù)第二步運(yùn)行優(yōu)化算法得到每輛車每小時(shí)的最優(yōu)充放電功率第三步把功率序列輸入Simulink模型驗(yàn)證物理可行性記錄實(shí)際執(zhí)行功率第四步統(tǒng)計(jì)結(jié)果計(jì)算每天總成本、每輛車最終SOC、變壓器最大負(fù)載率第五步繪制圖表比較有序調(diào)度與無序充電的成本差異和負(fù)荷曲線差異。我強(qiáng)烈建議結(jié)果輸出時(shí)生成三張固定圖表第一張是兩場(chǎng)景下的總負(fù)荷曲線無序充電vs有序調(diào)度x軸是時(shí)間y軸是功率這張圖能直觀看出有序調(diào)度削峰填谷的效果第二張是每輛車的SOC變化曲線用來確認(rèn)所有車輛的SOC都保持在安全區(qū)間內(nèi)第三張是每時(shí)段成本柱狀圖把峰段成本、谷段成本和放電收益分開堆疊展示。這三張圖的組合可以一次性回答幾乎所有基礎(chǔ)問題省了多少錢、砍了多少峰、有沒有違反約束。我自己在輸出圖表時(shí)吃過一個(gè)虧第一版結(jié)果圖只畫了總負(fù)荷曲線看起來非常平滑漂亮但檢查SOC曲線時(shí)才發(fā)現(xiàn)第三輛車在峰段被安排了放電最后SOC降到了目標(biāo)值以下。原因是總負(fù)荷曲線把多車疊加后掩蓋了個(gè)別車輛的約束違反。所以哪怕你只做最簡(jiǎn)單的項(xiàng)目也建議至少輸出SOC曲線作為校驗(yàn)圖這個(gè)習(xí)慣能幫你擋掉好多次數(shù)據(jù)異常。4. 常見問題與排查技巧實(shí)錄4.1 仿真結(jié)果總是“不省錢”原因出在哪這是最多人問的問題也是初學(xué)有序調(diào)度最常見的打擊。結(jié)果不省錢通常有三個(gè)原因。第一電價(jià)差不夠大如果你的分時(shí)電價(jià)峰谷價(jià)差只有0.2-0.3元/kWh那么套利空間基本被充放電損耗吃光了有序調(diào)度帶來的收益極其有限這個(gè)現(xiàn)象是正常的。第二車輛約束太緊比如每輛車接入時(shí)間短、目標(biāo)SOC高、平時(shí)行駛里程大剩余可調(diào)度電量很少優(yōu)化器沒有自由度。第三放電收益計(jì)算方式有誤部分模型把放電收益按“放電量×峰時(shí)電價(jià)”計(jì)算但實(shí)際上放電時(shí)有損耗你從電池放1kWh實(shí)際能送到電網(wǎng)的只有約0.9kWh而且放電過程本身是對(duì)電池的磨損這部分成本常被新手忽略。我建議排查時(shí)先做一次簡(jiǎn)化測(cè)試把放電功能關(guān)閉只允許谷時(shí)充電、峰時(shí)不充電觀察成本是否比無序充電低。如果這個(gè)簡(jiǎn)化版本都不省錢說明你的場(chǎng)景本身就沒什么套利空間如果簡(jiǎn)化版省錢而完整版不省錢那問題就出在放電邏輯或損耗參數(shù)上。按照這個(gè)思路定位問題效率比一頭扎進(jìn)代碼里調(diào)試高得多。4.2 求解器報(bào)“不收斂”或“無解”的常見原因優(yōu)化問題無解或不收斂是仿真里最讓人頭疼的錯(cuò)誤。大多數(shù)情況下出在約束本身邏輯矛盾。典型情況是一輛車接入時(shí)間只有2小時(shí)但初始SOC與目標(biāo)SOC差距過大按最大充電功率計(jì)算都無法在時(shí)限內(nèi)充滿這個(gè)約束體系無解。這時(shí)你需要調(diào)整目標(biāo)SOC或接入時(shí)間參數(shù)。另一個(gè)常見原因是SOC約束矩陣構(gòu)造錯(cuò)誤重復(fù)添加了相互沖突的上下界。特別是當(dāng)充電效率和放電效率不對(duì)稱時(shí)SOC的前綴和約束很容易寫錯(cuò)導(dǎo)致優(yōu)化器報(bào)告Infeasible。我的調(diào)試習(xí)慣是先把所有SOC約束去掉只保留功率約束和目標(biāo)函數(shù)確認(rèn)能求解然后逐步添加SOC約束每次添加后重新求解直到找出沖突的約束位置。這個(gè)過程雖然機(jī)械但能快速定位問題。另外建議給linprog設(shè)置methodhighs在大多數(shù)場(chǎng)景下比默認(rèn)方法更穩(wěn)定求解速度也更快。4.3 Simulink仿真速度極慢怎么優(yōu)化Simulink仿真卡頓是另一個(gè)高頻問題尤其是電池模型加上電力電子開關(guān)器件后仿真速度可能慢到讓人懷疑人生。我踩過幾次坑后總結(jié)出三條優(yōu)化經(jīng)驗(yàn)。第一把電力電子模塊的開關(guān)頻率和仿真步長(zhǎng)解耦很多開關(guān)器件模型在高頻PWM下需要極小的步長(zhǎng)如果只是驗(yàn)證功率序列可行性可以用平均模型替代開關(guān)模型仿真速度能提升10倍以上損失的部分精度在前期驗(yàn)證中完全可以接受。第二盡量減少連續(xù)積分模塊的數(shù)量把已經(jīng)計(jì)算好的功率序列改成查表輸入不要用復(fù)雜的PID閉環(huán)去追蹤功率指令。第三關(guān)閉Simulink的調(diào)試模式和信號(hào)存儲(chǔ)默認(rèn)情況下Simulink會(huì)存儲(chǔ)所有中間信號(hào)時(shí)間一長(zhǎng)內(nèi)存占用巨大直接影響仿真速度。我只保留需要輸出的關(guān)鍵信號(hào)其他全關(guān)掉。4.4 數(shù)據(jù)對(duì)齊錯(cuò)誤的排查方法仿真中還有一類比較隱蔽的錯(cuò)誤就是電價(jià)時(shí)段與車輛接入時(shí)間的對(duì)齊問題。比如你的電價(jià)數(shù)組是從0點(diǎn)到24點(diǎn)排列的但車輛接入時(shí)間是晚上18點(diǎn)而電池SOC的累計(jì)計(jì)算又是從某個(gè)特定時(shí)間點(diǎn)開始的一不留神就會(huì)把時(shí)間索引錯(cuò)位。這時(shí)候出現(xiàn)的結(jié)果不是運(yùn)行報(bào)錯(cuò)而是成本計(jì)算結(jié)果異常偏離實(shí)際情況。排查方法是單獨(dú)輸出每個(gè)時(shí)段的價(jià)格、功率、SOC數(shù)值矩陣逐行檢查第一個(gè)和最后一個(gè)時(shí)段的數(shù)據(jù)是否符合預(yù)期。我每次運(yùn)行完新數(shù)據(jù)后都會(huì)做這個(gè)檢查成本不高但非常有效。5. 實(shí)戰(zhàn)心得與進(jìn)階方向到這里你已經(jīng)掌握了一個(gè)完整的分時(shí)電價(jià)下電動(dòng)汽車有序充放電仿真模型的搭建思路。我自己在這類項(xiàng)目里最大的體會(huì)是算法不是難在公式而是難在把現(xiàn)實(shí)約束完整地翻譯成機(jī)器能理解的數(shù)學(xué)模型。很多初學(xué)者花大量時(shí)間研究目標(biāo)函數(shù)怎么寫卻忽視了約束條件的準(zhǔn)確性結(jié)果模型跑得很漂亮實(shí)際場(chǎng)景里根本沒法落地。所以我建議你拿到這個(gè)項(xiàng)目時(shí)先花時(shí)間把約束條件整理成一張清單每條約束都要能回答“為什么這個(gè)約束必須存在”再去動(dòng)筆寫代碼。目前這個(gè)仿真模型還可以往幾個(gè)方向擴(kuò)展比如考慮配電網(wǎng)潮流約束和電壓約束讓結(jié)果更貼近電網(wǎng)實(shí)際情況加入光伏出力和負(fù)荷預(yù)測(cè)的隨機(jī)性用魯棒優(yōu)化或模型預(yù)測(cè)控制MPC來應(yīng)對(duì)不確定性把充放電策略和電池壽命模型耦合在電費(fèi)收益和電池衰減成本之間找到一個(gè)最優(yōu)平衡點(diǎn)。這些方向每個(gè)都?jí)颡?dú)立做成一個(gè)好課題你可以根據(jù)自己的研究方向選擇一個(gè)深入下去。最后再分享一個(gè)小技巧無論你最終用什么仿真平臺(tái)都要把數(shù)據(jù)文件、算法模型、結(jié)果圖表三者的目錄整理規(guī)范給每個(gè)文件命名時(shí)加上版本號(hào)因?yàn)檫@個(gè)項(xiàng)目你一定會(huì)反復(fù)迭代命名混亂到時(shí)候想死的心都有。