Simscape自定义模型中的初始方程

3次浏览(过去30天)
你好,
我正在使用自定义组件在Simscape中建模电池。这个模型允许我输入一个根据电池容量、电流和充电状态的电压查找表,并模拟电池的电压、电流和热响应。我的Simscape组件的方程部分如下所示:
方程
assert(SOC >= 0,'电荷状态不能小于0');
assert(SOC <= 1,“电荷状态不能大于1”);
开路电压%
voc = tablelookup(IData, SOCData, VData, {0,“一个”}, SOC,插值=平滑,外推=平滑);
%装药状态
SOC.der == -i/C;
节点电压定义
V == p.v - n.v;
节点电压查找
v == tablelookup(IData, SOCData, VData, abs(i), SOC,插值=平滑,外推=平滑);
电流相关容量%
C == tablelookup(IData, CData, abs(i),插值=光滑,外推=光滑);
%的温度
T == h.t;
产生热量%
Qg == abs(i)*(voc - v);
%热流
0 == Q + qg;
结束
结束
这个模型的测试工作得很好,并且能够匹配我的测试数据,但是模型的初始化一直是我试图规避的问题。
当我对模型施加恒定电流时,模型无法适当地初始化。例如,如果我试图从模型中画出一个常数2a,求解器会抱怨无法初始化,说明初始条件无法收敛。我相信这背后的问题是因为,如果我从一个充满电的电池开始,使充电状态为100%,从技术上讲,这将是电池有一个0a电流的draw。然而,当我对电池施加2a的电流时,这与充电状态的初始条件相结合,迫使求解器无法收敛于一个解,因为它不存在。
我认为我的猜测是有效的,因为如果我用最终值为2a的Step响应替换恒定电流绘制,模型就会适当地初始化并向前移动。这是正确的,即使我将Step block的Step Time设置为eps = 2.2204e-16,这迫使求解器接受0 A作为初始条件,然后应用适当的2 A电流。
这样做的问题是,我不想不断地利用一个步骤块以恒定的电流驱动模型。我认为我可以通过使用将这种行为引入模型代码中
方程(初始= true)
I == 0;
结束
但无论驱动输入是什么,这总是会导致模型失败。
是否有其他方法来完成这个行为并得到我需要的东西,或者我必须对所有的驱动输入进行阶跃响应?

答案(2)

哈维尔Gazzarri
哈维尔Gazzarri 2020年3月14日
你好Christpher,
谢谢你方询价。
我不确定我是否理解你的方法,所以我有几个澄清的问题:
  1. 在第一个表查找函数中,将VOC定义为电流的函数。你能解释一下为什么开路电压取决于电流吗?
  2. 电压是每个节点定义的跨变量。这是否与之后将它定义为查找表一致?
你是否可以共享区块本身,这样我就可以试着运行它,看看我是否能发现问题?
Simscape Electrical中有一个电池块,您可能还需要考虑这个模型,它包括SOC和T依赖性,以及老化影响。
最好的问候,
哈维尔
jgazzarr@mathworks.com
1评论
克里斯托弗·麦克纳马拉
嘿,哈维尔,
谢谢你的回复。
  1. 对于VOC,我并没有把它定义为电流的函数。我的电压查找表是电流和电荷状态的函数,对于VOC,我使用相同的表,但使用零电流作为电流值,使用{0,' a '}作为电流。
  2. 我认为跨变量和定义为一个查找表是正确的。通常,这个定义跨变量行为的方程定义继承自“foundation.electrical.”分支“b”,但我只使用了域“foundation.electric .electrical”中的节点定义。第一行定义了交叉行为第二行定义了它与电流和电荷状态的关系。
我可以看看是否可以分享区块本身以获得更多反馈,但我认为最好通过电子邮件完成。我知道Simscape电气中的电池块,但我们不使用这个包,通常不需要它的大部分功能。

登录评论。


哈维尔Gazzarri
哈维尔Gazzarri 2020年3月16日
谢谢你,克里斯托弗。我明白你的意思。
初始化问题可能是这种定义VOC的方式造成的。有一个非常简单的替代方案,那就是定义为仅SOC和T的函数,而不是电流。在查找具有不同维度的表时没有问题。如果你需要帮助,请告诉我。
如果你确实可以分享区块,请放心这样做,我会在我这边调查这个问题。
最好的问候,
哈维尔

s manbetx 845


释放

R2019b

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的