在GA中调用时,matlab ode15s不起作用

时间:2012-06-30 21:00:18

标签: genetic-algorithm matlab ode differential-equations

我有套管的数学(参数)模型。模型的输入是位移(正弦波),以力为输出(在相应的时间步长)。

使用GA识别模型的参数,使用ode15s求解器求解力方程。

当假设一组参数时(不使用GA),求解器给出输出,但是当从GA调用时,我得到以下错误n no.of次:

  

警告:矩阵是单数,接近单数或严重缩放。   结果可能不准确。 RCOND = NaN。

最后

  

警告:t = 1.570796e + 000时失败。无法满足整合   公差而不会将步长减小到最小值以下   允许(3.552714e-015)在时间t。

我有点困惑,因为代码工作正常而不使用GA而不使用GA。我非常感谢您的投入。

提前多多感谢。

代码: 主要电话

ga_custom={@GA_test,measurement_data,excitation};
[x,fval,exitflag,output,population,scores]=ga(ga_custom,no_of_vars,[],[],[],[],lb,ub,[],options);

GA_test功能:

function error_fnc = GA_test(x,measurement_data,excitation)
error_fnc=0;   
F=my_force_Curve(excitation,x);    
for q=1:100  
    temp=(F(q)-measurement_data(q))^2;  
    error_fnc=error_fnc+temp;   
end   
end

my_force_Curve计算单个模型的力:

[T,y]=ode15s(@(T,y)differential_BW(T,y,x),tspan,[0 0 0 0]);

differential_BW解决方程:

function dy=differential_BW(t,y,initial_guess)   
dy=zeros(4,1);
dy(1)=..
dy(2)=.. 
dy(3)=..
dy(4)=..

道歉,如果它太长了。

再次感谢。

1 个答案:

答案 0 :(得分:1)

嗯,在我看来,对于某些参数,ODE求解器无法求解方程式。

我可以看到两个可能的原因:

  1. 您的GA可以并行评估不同的人口成员。如果使用可能根据参数或运行而更改的全局值或持久值,则会导致不确定行为,这可能导致不收敛。您可以通过重构那些global / persistent变量并以另一种方式传递这些值来解决这个问题。另一个解决方案是确保GA以串行方式运行所有内容。这可以通过将UseParallel设置为'never'gaoptimset(这是默认选项)来完成。

  2. 您的ODE不会收敛某些参数值。这与GA本身无关。如果您尝试GA在某个时刻选择的参数值并手动重复运行,您应该会遇到同样的问题。我试着做的是,在你的ODE求解器周围放一个try ... catch并检查收敛问题。如果它没有收敛,你可以做几件事:

    • 只需报告参数值或将其保存在某处。这样,您可以通过手动运行目标/ ODE来自行检查当时发生的情况。这应该给出同样的问题,但你至少可以尝试调试一切。如果您发现例如某些参数不兼容,您可以检查并为您的目标返回一个不利的值(0NaN)。
    • 直接返回目标函数的不利值。这样,搜索可以继续,并且在突变期间不会选择该点。但是,如果您不知道为什么这些参数值不能正确收敛,那么它就是一个黑客攻击。