Python和MATLAB锂电铅蓄电化学微分模型和等效电路

🎯要点

  1. 对比三种电化学颗粒模型:电化学的锂离子电池模型、单粒子模型和带电解质的单粒子模型。
  2. 求解粒子域内边界通量与局部电流密度有关的扩散方程。
  3. 扩展为两个相的负或正电极复合电极粒子模型。
  4. 模拟四种耦合机制下活性物质损失情况。
  5. 模拟锂离子电池三参数模型等效电路。

🍁电池解析模型

在这里插入图片描述

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python和MATLAB符号微分

计算导数的常用方法有 3 种:

  • 数值微分
  • 符号微分
  • 自动微分

数值微分依赖于导数的定义:
f ′ ( x ) = lim ⁡ h → 0 f ( x + h ) − f ( x ) h f^{\prime}(x)=\lim _{h \rightarrow 0} \frac{f(x+h)-f(x)}{h} f(x)=h0limhf(x+h)f(x)
其中,你把一个非常小的 h h h 和评估函数放在两个地方。这是最基本的公式,在实践中,人们使用其他公式,这些公式给出的估计误差更小。这种计算导数的方法主要适用于你不知道你的函数并且只能对其进行采样的情况。此外,对于高维函数,它需要大量的计算。

符号微分操纵数学表达式。如果你曾经使用过 matlab 或 mathematica,那么你会看到类似这样的内容

d d x ( x 2 cos ⁡ ( x − 7 ) sin ⁡ ( x ) ) = x 2 sin ⁡ ( 7 − x ) csc ⁡ ( x ) + x 2 ( − cos ⁡ ( 7 − x ) ) cot ⁡ ( x ) csc ⁡ ( x ) + 2 x cos ⁡ ( 7 − x ) csc ⁡ ( x ) \begin{aligned} & \frac{d}{d x}\left(\frac{x^2 \cos (x-7)}{\sin (x)}\right)= \\ & x^2 \sin (7-x) \csc (x)+x^2(-\cos (7-x)) \cot (x) \csc (x)+2 x \cos (7-x) \csc (x) \end{aligned} dxd(sin(x)x2cos(x7))=x2sin(7x)csc(x)+x2(cos(7x))cot(x)csc(x)+2xcos(7x)csc(x)
在这里,他们知道每个数学表达式的导数,并使用各种规则(乘积规则、链式规则)来计算最终的导数。然后他们简化表达式以获得最终表达式。

自动微分可操纵计算机程序块。微分器具有对程序的每个元素求导的规则。它还使用链式法则将复杂表达式分解为更简单的表达式。

Python符号微分

导数规则要求一个项有 2 个子项,即二元运算(例如 *),以及一个一元运算(例如 sin)。

term.py:

from functools import reduce

class Term:

    def __init__(self, label: str or int, children=None):
        self.label = label
        self.children = children if children else []

    def __repr__(self):
        if self.children:
            return f"({self.label} " + reduce(lambda str1, str2: str1+" "+str2, (repr(child) for child in self.children)) + ")"
        else:
            return f"{self.label}"

    @classmethod
    def copy(cls, obj):
        """makes a copy of obj"""
        return cls(obj.label, [cls.copy(child) for child in obj.children])

symbols_table:

MUL = '*'
ADD = '+'
SUB = '-'
DIV = '/'
POW = '^'
LOG = 'log'
SIN = 'sin'
COS = 'cos'
TAN = 'tan'
OPEN_BR = '('
CLOSE_BR = ')'
VAR = 'x'

symbols = {LOG, SIN, COS, TAN, MUL, ADD, SUB, DIV, POW, OPEN_BR, CLOSE_BR, VAR}
from term import Term
from symbols_table import *
import numbers

def calculate_derivative(term1: Term, rules: dict) -> Term:
    if isinstance(term1.label, numbers.Number):
        return Term(0)
    elif term1.label == VAR:
        return Term(1)
    else:
        return rules[term1.label](term1, rules)


def mul_derivative(term1: Term, rules) -> Term:
    child1, child2 = term1.children  
    return Term(ADD, [Term(MUL, [calculate_derivative(child1, rules), child2]), Term(MUL, [child1, calculate_derivative(child2, rules)])])


def div_derivative(term1: Term, rules) -> Term:
    child1, child2 = term1.children  
    return Term(DIV, [Term(SUB, [Term(MUL, [calculate_derivative(child1, rules), child2]), Term(MUL, [child1, calculate_derivative(child2, rules)])]),
                      Term(POW, [child2, Term(2)])])


def sum_derivative(term1: Term, rules) -> Term:
    child1, child2 = term1.children  
    return Term(term1.label, [calculate_derivative(child1, rules), calculate_derivative(child2, rules)])


def power_derivative(term1: Term, rules) -> Term:
    child1, child2 = term1.children  
    return Term(ADD,
                [Term(MUL, [calculate_derivative(child2, rules), Term(LOG, [child1]), Term(POW, [child1, child2])]),
                 Term(MUL, [calculate_derivative(child1, rules), child2, Term(POW, [child1, Term(SUB, [child2, Term(1)])])])])


def sin_derivative(term1: Term, rules) -> Term:
    return Term(MUL, [Term(COS, [term1.children[0]]), calculate_derivative(term1.children[0], rules)])


def cos_derivative(term1: Term, rules) -> Term:
    return Term(MUL, [Term(-1), Term(SIN, [term1.children[0]]), calculate_derivative(term1.children[0], rules)])


def tan_derivative(term1: Term, rules) -> Term:
    arg = Term.copy(term1.children[0])
    return Term(ADD, [calculate_derivative(arg, rules), Term(MUL, [calculate_derivative(arg, rules), Term(POW, [term1, Term(2)])])])


def log_derivative(term1: Term, rules) -> Term:
    return Term(DIV, [calculate_derivative(term1.children[0], rules), term1.children[0]])


rules_for_differentiation = {MUL: mul_derivative, ADD: sum_derivative, SUB: sum_derivative,
                             COS: cos_derivative, SIN: sin_derivative, TAN: tan_derivative,
                             POW: power_derivative, DIV: div_derivative, LOG: log_derivative}


def derivative(term1):
    return calculate_derivative(term1, rules_for_differentiation)

MATLAB符号微分

求函数 y = f ( x ) 2 d f d x y=f(x)^2 \frac{d f}{d x} y=f(x)2dxdf 关于 f ( x ) f(x) f(x) 的导数

syms f(x) y
y = f(x)^2*diff(f(x),x);
Dy = diff(y,f(x))

D y = 2 f ( x ) ∂ ∂ x f ( x ) \begin{aligned} & Dy = \\ & \qquad 2 f(x) \frac{\partial}{\partial x} f(x)\end{aligned} Dy=2f(x)xf(x)

找到描述质量弹簧系统运动的欧拉-拉格朗日方程。定义系统的动能和势能。

syms x(t) m k
T = m/2*diff(x(t),t)^2;
V = k/2*x(t)^2;

定义拉格朗日量。

L = T - V

L = m ( ∂ ∂ t x ( t ) ) 2 2 − k x ( t ) 2 2 \begin{aligned} & L = \\ & \frac{m\left(\frac{\partial}{\partial t} x(t)\right)^2}{2}-\frac{k x(t)^2}{2}\end{aligned} L=2m(tx(t))22kx(t)2

欧拉-拉格朗日方程如下

0 = d d t ∂ L ( t , x , x ˙ ) ∂ x ˙ − ∂ L ( t , x , x ˙ ) ∂ x 0=\frac{d}{d t} \frac{\partial L(t, x, \dot{x})}{\partial \dot{x}}-\frac{\partial L(t, x, \dot{x})}{\partial x} 0=dtdx˙L(t,x,x˙)xL(t,x,x˙)

计算项 ∂ L / ∂ x ˙ \partial L / \partial \dot{x} L/x˙

D1 = diff(L,diff(x(t),t))

D 1 = m ∂ ∂ t x ( t ) \begin{aligned} & D 1= \\ & m \frac{\partial}{\partial t} x(t)\end{aligned} D1=mtx(t)

计算第二项 ∂ L / ∂ x \partial L / \partial x L/x

D2 = diff(L,x)

D 2 ( t ) = − k x ( t ) D 2( t )=-k x(t) D2(t)=kx(t)

找到质量弹簧系统的欧拉-拉格朗日运动方程。

diff(D1,t) - D2 == 0

ans ⁡ ( t ) = m ∂ 2 ∂ t 2 x ( t ) + k x ( t ) = 0 \begin{aligned} & \operatorname{ans}(t)= \\ & m \frac{\partial^2}{\partial t^2} x(t)+k x(t)=0 \end{aligned} ans(t)=mt22x(t)+kx(t)=0

👉更新:亚图跨际

### Matlab 中构建仿真蓄电等效电路模型的方法 在 MATLAB Simulink 平台下,构建仿真的确是一个复杂而重要的过程。以下是关于如何利用 MATLAB 来完成这一任务的具体说明。 #### 定义模型参数与初始条件 为了建立一个完整的等效电路模型,首先需要定义电池的关键参数,例如开路电压 \( U_{\text{oc}} \)、内阻 \( R_0 \)、极化电阻 \( R_p \) 及其对应的电容 \( C_p \)[^1]。这些参数通常可以从实验数据或者制造商提供的技术手册中获取。此外,还需要设定初始状态变量,如初始荷电状态 (SOC) 或者起始温度。 #### 使用 ODE 解算器求解动态行为 MATLAB 提供了强大的数值积分工具箱,其中 ode45 是最常用的常微分方程组求解器之一。对于描述电池内部物理现象的非线性动力学系统来说,它可以高效地追踪随着时间推移发生的各种变化趋势[^3]。具体操作如下: - 将所选元件组合成整体网络; - 建立相应的数学表达式表示各部分之间的关系; - 应用 ode45 函数迭代计算节点处未知量的时间序列响应。 ```matlab function dydt = batteryODE(t,y,params) % 参数解析 U_oc = params.U_oc; % 开路电压[V] R0 = params.R0; % 内阻[Ω] Rp = params.Rp; % 极化电阻[Ω] Cp = params.Cp; % 极化电容[F] Vt = y(1); % 终端电压[V] i_load = ... % 加载电流[A], 用户自定义输入信号 dVtdt = (-i_load/R0 - (Vt-U_oc)/Rp)/(Cp); dydt = [dVtdt]; end ``` 上述代码片段展示了如何编写用于模拟简单 RC 网络型等效电路的核心算法框架。 #### 添加热效应影响 考虑到实际应用环境中不可避免存在热量积累情况,在基础电气特性之外还需引入额外子模块专门处理温升问题。这一步骤可通过扩展原有架构并加入新的状态向量来达成目的——即把局部升温速率也纳入到总的状态转移矩阵之中考虑进去。 #### 实现均衡管理系统 当涉及到多节串联配置下的大型储能装置时,则有必要进一步探讨针对个体间不一致性采取措施加以补偿的可能性。借助于 Simulink 的图形界面优势,我们可以轻松拖拽组建出复杂的拓扑连接图,并测试不同类型的平衡策略有效性[^4]。 综上所述,从理论分析到最后工程实践落地整个流程都离不开扎实的基础知识支撑以及灵活运用软件平台的能力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值