matlab simulink 仿真时,将V_SET输入5.0以上时,没有问题 但是将V_SET输入5.0以下时,就会出现错误

Algebraic state in algebraic loop containing '*********/Algebraic Constraint/Sum' computed at time 0 is Inf or NaN. There may be a singularity in the solution. If the model is correct, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances).

因为会有代数环,所以用了Algebraic Constraint这个模块来解的
方程如下:
V_SET=V_Nerst-V_act(i)-V_ohm(i)-V_conc(i)
V_act(i),V_ohm(i),V_conc(i)是关于i的函数,V_SET,V_Nerst是常量。
http://pan.baidu.com/s/1pJPsB0Z模型链接 求助啊

这个问题题主发过一次,我在那个问题的回答总是提交不成功,改成在这里回答吧。

 

1、并非如你所说【将V_SET输入5.0以上时,没有问题 但是将V_SET输入5.0以下时,就会出现错误】,我用循环的方式逐步细分,大致可以把该参数的分界点确定在0.4790~0.4791之间(进一步的细分没有意义,因为稍后会说到,这个数只是对于具体的问题,由于取值不同经过复杂运算后导致不同结果而已,并没有什么神奇之处)。

 

2、有必要稍微说明一下Simulink处理代数环的方法:当Simulink检测到代数环之后,会在仿真的步进大循环的每一步中,都调用loop solver对代数环中的模块做一个小循环,也就是进行迭代,直到代数环中各模块的输出稳定为止。

 

3、这个模型错误的原因在于,经过代数环各环节的计算(把迭代的具体分析过程贴出来太麻烦,尤其是百度知道的这种排版,所以就直接给结论,不逐步分析了),最终导致模型中 current_and_voltage/V_conc/Fcn2 模块出现超出函数定义域的问题。说得再明确一点,该模块的函数为log(u(2)/(u(2)-u(1))),而u(2)为固定值8000,一旦u(1)的值超过8000,就会导致对负数取对数,得到类似于NaN的结果,从而导致计算失败。

 

4、你的MATLAB版本应该是2010a,不同版本对于上述问题的处理存在差异。例如,在2007b里面就不会报错,当然,得到的结果也是不靠谱的。

 

5、建议的解决方法:减小Algebraic Constraint模块的Initial guess参数。我不知道你为什么会选择5000这样一个值,但这个值刚好就是上面说到的u(1),初始估计太大更容易导致代数环的迭代发散。

追问

那请问下,我的初始值取多少可以,,我i(就是u(1)),应该是[0,8000)的一个数,我利用i求V时,就不用代数环了,可以解出来的。但是V求I涉及代数环,就没法了

追答

减小一些就行,比如1000、100之类的,或者直接取0也可以。

温馨提示:答案为网友推荐,仅供参考
相似回答