2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

産業用PV+蓄電池(最適化あり)シミュレーターを作った

2
Last updated at Posted at 2026-03-28

産業用PV+蓄電池シミュレーターを作った

——高圧デマンドチャージ・充放電スケジュール最適化・最適容量探索まで

住宅用から産業用へ

以前の記事で住宅用PV需給シミュレーターを公開した。

住宅用を作り終えたとき、次にやるべきことは自明だった。
産業用だ。

住宅用と産業用では、電気料金の構造がまったく違う。
住宅用は使った量(kWh)だけで料金が決まる。
産業用(高圧・特別高圧)は違う。

産業用電気料金 = 基本料金 + 電力量料金

基本料金 = 基本料金単価(円/kW)× 契約電力(kW)× 力率割引
契約電力 = 過去12ヶ月の30分デマンド最大値(実量制)

つまり、1年に1回でも電力の使い方が集中した瞬間が、
12ヶ月分の基本料金を決定する。

東京電力EPの高圧Aなら基本料金単価は1,890円/kW。
契約電力が68kWなら基本料金だけで月12万円を超える。
これを下げることが産業用PVシミュレーターの核心だ。

何を作ったか

住宅用から引き継いだもの:

  • JIS C 8907準拠の発電計算(pvlib)
  • NEDO METPV-20(47都道府県)
  • 30分×365日=17,520コマのフレームワーク

産業用として新たに追加したもの:

  • 高圧・特別高圧の電気料金体系(デマンドチャージ)
  • 月別最大デマンド追跡グラフ(導入前後比較)
  • 複数施設合算UI(NREL ComStockベースの6建物タイプ)
  • 蓄電池の充放電スケジュール最適化(PuLP/CBC線形計画)
  • 蓄電池の最適容量探索(2段階アプローチ)
  • 産業用FIT売電・逆潮流禁止・CO2削減量

以下、PV100kW+蓄電池の条件で
デマンドがどう変化するかを順に見ていく。

① PV100kWだけ入れるとデマンドはどう変わるか

①PV100kWのみ(57kW).png

PV100kW導入後、契約電力は68kW→57kWに下がった。
昼間の需要をPV発電が肩代わりするため、
日中のピークデマンドが自然に抑制される。

ただし夏の夕方など、PV発電が落ちた後に需要が高い時間帯は
カットできない。7月の最大値68kWもそういうコマで発生している。

② 蓄電池15kWhを追加しても、ルールベース制御では変わらない

②PV100kWのみ+15kWh(57kW).png

蓄電池15kWhを追加した。
しかし契約電力は57kWのまま変わっていない。

理由はルールベース充放電制御の限界だ。
「昼間にPV余剰で充電し、夜間に放電する」という
単純なルールでは、デマンドピークが発生する時間帯に
蓄電池の残量がなくなっている場合がある。

デマンドを削るには、ピークが来る直前に蓄電池を温存し、
ピーク時間帯に集中して放電する
制御が必要だ。
それはルールベースでは実現できない。

③ 最適な充放電スケジュールを計算するとデマンドが下がる

③PV100kWのみ+15kWh最適充放電(53kW).png

同じ15kWhの蓄電池で、充放電スケジュールを
線形計画(LP)で最適化した。契約電力は57kW→53kWに下がった。

実装はPuLP+CBCソルバーで、17,520コマ(30分×365日)を
一括で最適化する。

# LP定式化のイメージ
# 決定変数: 各30分コマの充電量・放電量
# 目的関数: 年間電気代(基本料金+電力量料金−売電収入)を最小化
# 制約条件:
#   SOC範囲: SOC_min ≤ SOC(t) ≤ SOC_max
#   充放電レート上限
#   SOC遷移: SOC(t+1) = SOC(t) + charge(t)×η − discharge(t)/η
#   エネルギーバランス: 需要 = PV + 放電 + 系統購入 − 充電 − 売電
#   デマンド補助変数: peak_demand ≥ grid_import(t) + discharge(t) − PV(t)
#                    (線形化のためのピーク追跡)

ポイントはデマンドの最小化を目的関数に組み込む部分だ。
max(30分デマンド)はそのままでは非線形になるため、
補助変数を使って線形化している。

HF Spaces(CPU環境)での実行時間は約15〜30秒。

④ そもそも蓄電池は何kWh入れればいいのか

ここで新たな問いが生まれる。
15kWhは本当に適切な容量だったのか?

容量が大きければデマンドカット効果は上がるが、
投資額も増える。収益性(P-IRR)が最大になる容量は
どこかに存在するはずだ。

それを探すのが最適容量探索機能だ。

④PV100kWのみ+最適容量探索9.2kWhデマンド(57kW).png
④PV100kWのみ+最適容量探索9.2kWh最適化画面.png

結果は9.2kWhだった。15kWhより小さい。
4象限グラフの見方はこうだ。

  • 左上(緑): 年間コスト削減額は容量に応じて逓減カーブを描く
  • 右上(青): 投資額は容量に比例して直線的に増加する
  • 左下(赤): P-IRRは容量が増えるほど低下する山型カーブ
  • 右下(橙): 投資回収年数は容量が増えるほど長くなる

P-IRRが最大となる点、つまり「追加投資に見合うリターンが
最も高い容量」が9.2kWhだ。

実装は2段階アプローチを取っている。

段階1(約15秒): 蓄電池容量をLP変数に含めて一体最適化
  → 最適容量と最適充放電スケジュールを同時に求める

段階2(約2〜3分): 段階1の前後範囲をグリッドサーチ
  → 各容量でP-IRR・コスト削減・回収年数を計算して可視化

段階1のLP一体化が効いている理由は、
容量と充放電スケジュールが相互依存しているからだ。
容量が変われば最適な充放電パターンも変わる。
これを分離して解くと最適解を見逃す可能性がある。

⑤ 最適容量9.2kWhで改めて充放電最適化するとどうなるか

⑤PV100kWのみ+9最適充放電.2kWh(54kW).png

9.2kWhで最適化した結果、契約電力は68kW→54kWとなった。

整理するとこうなる。

構成 契約電力
導入前 68kW
①PV100kWのみ 57kW
②PV+蓄電池15kWh(ルールベース) 57kW(変化なし)
③PV+蓄電池15kWh(充放電最適化) 53kW
⑤PV+蓄電池9.2kWh(充放電最適化) 54kW

15kWhを入れて最適化した53kWと、
9.2kWhで最適化した54kWはほぼ同じだ。

(容量を6割近く削っても、デマンドカット効果はほとんど変わらない)

これがP-IRR最大化の意味するところだ。
「大きければいい」ではなく、
「費用対効果が最も高い容量がある」。

まとめ

  • PVのみでも昼間ピークは削れる
  • 蓄電池を入れただけ(ルールベース制御)ではデマンドカットに限界がある
  • 充放電スケジュールをLPで最適化すると初めてデマンドが下がる
  • 最適容量は「追加投資対効果が最大になる点」であり、
     大きければいいわけではない
  • 最適容量+最適充放電の組み合わせが最良の結果を出す

次の記事では、このシミュレーターに
マイクログリッド(特定送配電事業)モードを追加した話を書く。
複数施設を束ねることで生まれる「束ねメリット」と
P-IRR計算の話になる。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?