pybamm库学习-tutorial

1. 电化学模型简单调用

import pybamm
model = pybamm.lithium_ion.DFN()#调用Doyle-Fuller-Newman (DFN) model
sim = pybamm.Simulation(model) # 仿真
sim.solve([0, 3600]) #求解
sim.plot()
model.variable_names() #模型变量列表
model.variables.search("electrolyte") #模型指定单词变量查找

2. 绘图

sim.plot() #绘出主要变量随时间变化图

端电压

output_variables = ["Terminal voltage [V]"]
sim.plot(output_variables)

画两个子图(均是时间为自变量)

output_variables = ["Electrolyte concentration [mol.m-3]", "Terminal voltage [V]"]
sim.plot(output_variables=output_variables)

两个子图:第一个图同时绘制两个变量

sim.plot([["Electrode current density", "Electrolyte current density"], "Terminal voltage [V]"])

3. 模型参数修改

import pybamm
import os

chemistry = pybamm.parameter_sets.Chen2020#参数集This variable is a dictionary with the corresponding parameter subsets for each component.
parameter_values = pybamm.ParameterValues(chemistry=chemistry)#将参数集转化为变量字典(变量:值)
#修改具体参数值
parameter_values["Current function [A]"] = 10   # change individual parameters
#运行
model = pybamm.lithium_ion.DFN()
sim = pybamm.Simulation(model, parameter_values=parameter_values)
sim.solve([0, 3600])#设定1小时仿真,实际提前达到下截止电压终止
sim.plot()

可以对基于默认参数进行简单修改:

parameter_values = model.default_parameter_values
parameter_values["Current function [A]"] = 3   

参数可用search查找

parameter_values.search("electrolyte")

answer:

EC initial concentration in electrolyte [mol.m-3]	4541.0
Electrolyte conductivity [S.m-1]	<function electrolyte_conductivity_Nyman2008 at 0x7f24ae784158>
Electrolyte diffusivity [m2.s-1]	<function electrolyte_diffusivity_Nyman2008 at 0x7f24ae7840d0>
Initial concentration in electrolyte [mol.m-3]	1000.0
Negative electrode Bruggeman coefficient (electrolyte)	1.5
Positive electrode Bruggeman coefficient (electrolyte)	1.5
Separator Bruggeman coefficient (electrolyte)	1.5
Typical electrolyte concentration [mol.m-3]	1000.0

4. 工况加载

- 工况文件加载电流
使用.csv文件加载电流,插值处理

import pandas as pd    # needed to read the csv data file
os.chdir(pybamm.__path__[0]+'/..')#改变目录至pybamm上级目录
# Import drive cycle from file
drive_cycle = pd.read_csv("pybamm/input/drive_cycles/US06.csv", comment="#", header=None).to_numpy()

# Create interpolant
timescale = parameter_values.evaluate(model.timescale)
current_interpolant = pybamm.Interpolant(drive_cycle, timescale * pybamm.t)

# Set drive cycle
parameter_values["Current function [A]"] = current_interpolant

说明:使用了model类,需要先建立model
timescale和current_interpolant没看懂

- 自定义电流函数
定义电流函数形式,注意要加pybamm

import numpy as np

def my_current(t):
    return pybamm.sin(2 * np.pi * t / 60)

parameter_values["Current function [A]"] = my_current

model = pybamm.lithium_ion.SPMe()
sim = pybamm.Simulation(model, parameter_values=parameter_values)
t_eval = np.arange(0, 121, 1)# 时间序列
sim.solve(t_eval=t_eval)#自定义步长
sim.plot(["Current [A]", "Terminal voltage [V]"])

仿真时,设定时间序列,保证足够的自定义函数有足够的采样点

5. 设计仿真试验

上文学习了如何改变模型参数、负载电流,但某些时候需要我们设计给定电压、功率或者多个不同工况的电池试验,我们可以试验Experiment class进行定义。

  1. 定义试验步骤
import pybamm
experiment = pybamm.Experiment(
    [
        "Discharge at C/10 for 10 hours or until 3.3 V",
        "Rest for 1 hour",
        "Charge at 1 A until 4.1 V",
        "Hold at 4.1 V until 50 mA",
        "Rest for 1 hour",
    ] * 3
)
  1. 进行仿真
model = pybamm.lithium_ion.DFN()
sim = pybamm.Simulation(model, experiment=experiment)
sim.solve()
sim.plot()

3. 语法形式
充放电、静置、恒压过程均有标准格式。
充放电:(Dis)charge at x A/C/W
静置:Rest
恒压:Hold at x V
时间可以使用“seconds, minutes, hours”,搭配for。如:for 10 seconds, for 20 minutes, for 0.5 hours, for 1 hour
终止条件为电路状态, 如 “1 A”, “C/50” or “3 V”,搭配until。如:until 4.1 V。
此外,采样周期语法为:“(X minute period)”, 可放于任意指令末尾,表示仿真过程结果输出的周期。注意:此处minute无复数。

一些实例:

“Discharge at 1C for 0.5 hours”,
“Discharge at C/20 for 0.5 hours”,
“Charge at 0.5 C for 45 minutes”,
“Discharge at 1 A for 90 seconds”,
“Charge at 200mA for 45 minutes (1 minute period)”,
“Discharge at 1 W for 0.5 hours”,
“Charge at 200 mW for 45 minutes”,
“Rest for 10 minutes (5 minute period)”,
“Hold at 1 V for 20 seconds”,
“Charge at 1 C until 4.1V”,
“Hold at 4.1 V until 50 mA”,
“Hold at 3V until C/50”,

此外,试验步骤以列表形式组织,可以用“+”和“ * ”实现拼接和重复。

["Discharge at 1C for 0.5 hours", "Discharge at C/20 for 0.5 hours"] * 3 + ["Charge at 0.5 C for 45 minutes"]

6 解的保存

试验的仿真过程和输出可以保存,导出至其他软件。

1. 获取解
提取solution对象

solution = sim.solution

创建后处理变量

t = solution["Time [s]"]
V = solution["Terminal voltage [V]"]

这些变量的调用有两种方式:

a. 直接输出

使用如下指令输出变量。

V.entries

array([3.77057104, 3.75314461, 3.74576311, 3.74048117, 3.73590496,
3.73162686, 3.72751691, 3.72353235, 3.71965942, 3.71589494,
3.71223915, 3.70869332, 3.70525855, 3.70193545, 3.69872414,
3.69562413, 3.69263434, 3.68975318, 3.68697862, 3.68430825,
3.68173935, 3.67926889, 3.67689358, 3.67460986, 3.67241392,
3.67030168, 3.6682687 , 3.66631015, 3.66442061, 3.66259389,
3.66082272, 3.65909835, 3.6574099 , 3.65574365, 3.65408194,
3.65240196, 3.65067434, 3.64886178, 3.64691843, 3.64479094,
3.64242262, 3.63976266, 3.63678089, 3.63348596, 3.62994003,
3.62625983, 3.62259742, 3.61910534, 3.61590162, 3.61305016,
3.61056143, 3.60840702, 3.60653781, 3.60489893, 3.60343905,
3.60211465, 3.6008912 , 3.59974248, 3.59864935, 3.59759829,
3.59658021, 3.59558935, 3.59462252, 3.59367839, 3.59275703,
3.59185944, 3.59098715, 3.59014183, 3.5893249 , 3.58853704,
3.58777775, 3.58704477, 3.58633355, 3.5856367 , 3.58494342,
3.58423909, 3.58350484, 3.58271739, 3.58184885, 3.58086676,
3.57973396, 3.57840835, 3.57684218, 3.57498043, 3.57275802,
3.57009488, 3.56688821, 3.56300064, 3.55824248, 3.55234574,
3.54492659, 3.53543151, 3.52306093, 3.50666266, 3.48458575,
3.45448664, 3.4130848 , 3.35588169, 3.27689371, 3.16851934])

t.entries

array([ 0. , 36.36363636, 72.72727273, 109.09090909,
145.45454545, 181.81818182, 218.18181818, 254.54545455,
290.90909091, 327.27272727, 363.63636364, 400. ,
436.36363636, 472.72727273, 509.09090909, 545.45454545,
581.81818182, 618.18181818, 654.54545455, 690.90909091,
727.27272727, 763.63636364, 800. , 836.36363636,
872.72727273, 909.09090909, 945.45454545, 981.81818182,
1018.18181818, 1054.54545455, 1090.90909091, 1127.27272727,
1163.63636364, 1200. , 1236.36363636, 1272.72727273,
1309.09090909, 1345.45454545, 1381.81818182, 1418.18181818,
1454.54545455, 1490.90909091, 1527.27272727, 1563.63636364,
1600. , 1636.36363636, 1672.72727273, 1709.09090909,
1745.45454545, 1781.81818182, 1818.18181818, 1854.54545455,
1890.90909091, 1927.27272727, 1963.63636364, 2000. ,
2036.36363636, 2072.72727273, 2109.09090909, 2145.45454545,
2181.81818182, 2218.18181818, 2254.54545455, 2290.90909091,
2327.27272727, 2363.63636364, 2400. , 2436.36363636,
2472.72727273, 2509.09090909, 2545.45454545, 2581.81818182,
2618.18181818, 2654.54545455, 2690.90909091, 2727.27272727,
2763.63636364, 2800. , 2836.36363636, 2872.72727273,
2909.09090909, 2945.45454545, 2981.81818182, 3018.18181818,
3054.54545455, 3090.90909091, 3127.27272727, 3163.63636364,
3200. , 3236.36363636, 3272.72727273, 3309.09090909,
3345.45454545, 3381.81818182, 3418.18181818, 3454.54545455,
3490.90909091, 3527.27272727, 3563.63636364, 3600. ])

b. 指定时间输出
指定时间点,输出对应变量值。

V([200, 400, 780, 1236])  # times in seconds

结果如下:

array([3.72957189, 3.70869332, 3.6782 , 3.65409855])

2. 保存仿真过程和输出数据

  • 仿真过程的保存及调用
sim.save("SPMe.pkl")  #模型保存
sim2 = pybamm.load("SPMe.pkl")  #模型文件加载
sim2.plot()  #绘图
  • 仅保存模型的解
sol = sim.solution
sol.save("SPMe_sol.pkl")

同样的方式调入:

sol2 = pybamm.load("SPMe_sol.pkl")
pybamm.dynamic_plot(sol2)
  • 保存部分变量
sol.save_data("sol_data.pkl", ["Current [A]", "Terminal voltage [V]"])

可以保存为csv和mat格式。

sol.save_data("sol_data.csv", ["Current [A]", "Terminal voltage [V]"], to_format="csv")
sol.save_data("sol_data.mat", ["Current [A]", "Terminal voltage [V]"], to_format="matlab")

7. Model options

模型的options有多种,可以查阅相关文档设定。本例将SPMe与热模型耦合。

# add the full thermal model for SPMe
import pybamm

options = {"thermal": "x-full"}
model = pybamm.lithium_ion.SPMe(options=options)    # loading in options

parameter_values = model.default_parameter_values
parameter_values["Current function [A]"] = 3    # increase the current to amplify the thermal effects

sim = pybamm.Simulation(model, parameter_values=parameter_values)
sim.solve([0, 3600])
sim.plot(["Cell temperature [K]", "Total heating [W.m-3]", "Current [A]", "Terminal voltage [V]"]) 
  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值