我有套管的数学(参数)模型。模型的输入是位移(正弦波),以力为输出(在相应的时间步长)。
使用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)=..
道歉,如果它太长了。
再次感谢。
答案 0 :(得分:1)
嗯,在我看来,对于某些参数,ODE求解器无法求解方程式。
我可以看到两个可能的原因:
您的GA可以并行评估不同的人口成员。如果使用可能根据参数或运行而更改的全局值或持久值,则会导致不确定行为,这可能导致不收敛。您可以通过重构那些global
/ persistent
变量并以另一种方式传递这些值来解决这个问题。另一个解决方案是确保GA以串行方式运行所有内容。这可以通过将UseParallel
设置为'never'
并gaoptimset
(这是默认选项)来完成。
您的ODE不会收敛某些参数值。这与GA本身无关。如果您尝试GA在某个时刻选择的参数值并手动重复运行,您应该会遇到同样的问题。我试着做的是,在你的ODE求解器周围放一个try ... catch
并检查收敛问题。如果它没有收敛,你可以做几件事:
0
或NaN
)。