我尝试复制以下链接的脚本:Parameters estimation on Lotka Volterra model with Scilab
我在结果中得到了与其中描述的类似的错误。您可以引导我正确地运行该脚本。谢谢爱马仕
发布于 2017-08-25 21:15:37
Scilab 5.5.1或更低版本的解决方案
问题是,求解器不知何故到达了一个点,它不能解决每个t上的ode,并在某个点上停止。因此,您的y_calc在大小上比y_exp小。
如果这对您来说不是问题,请将Differences函数第6行上的diffmat更改为
diffmat = y_calc' - y_exp(1:size(y_calc',1),:)Scilab 6.0.0或更高版本的解决方案
现在,当ode函数在Scilab 6.X.X中计算失败时会引发错误。
使用try ... catch ... end语句,我们可以让程序处理它。
因此,一个错误的(我将在后面解释为什么)解决方案是将Differences函数的第5行改为
try // test if ode works normally
[y_calc,odew,odeiw]=ode(y0',t0,t,list(LotkaVolterra,c,n,m,e))
catch // if an error is raised
y_calc = y_exp' // Put a value when the computations fails
end
diffmat = y_calc' - y_exp(1:size(y_calc',1),:)你仍然会收到ode的警告。
为什么它是糟糕的
既然您要求一个正在运行的程序,我已经使用try catch语句丢弃了这个错误,让程序继续运行。你不应该这样做。这意味着您的问题定义不明确:参数选择不当,或者无法在数值上求解。我建议对程序背后的数学进行研究,找出为什么某些参数可能会破坏ode算法。
还有另一个原因,你不应该听从我的回答。如您所见,当我捕捉到一个错误时,我会给y_calc一些值。但这在数学上是荒谬的,因为优化问题依赖于这样一个事实,即解决方案充其量近似于初始问题。我99%确定y_calc = y_exp'语句会给出不可用的结果。
https://stackoverflow.com/questions/45861364
复制相似问题