0

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

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

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

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

最后

警告:在 t=1.570796e+000 时失败。如果不将步长减小到低于时间 t 允许的最小值 (3.552714e-015),则无法满足积分容差。

我有点困惑,因为代码在不使用 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)=..

抱歉,如果它太长了。

再次感谢。

4

1 回答 1

1

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

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

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

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

    • 只需报告参数值或将它们保存在某处。这样,您可以通过手动运行目标/ODE 来检查此时发生的情况。这应该会出现同样的问题,但您至少可以尝试调试所有内容。例如,如果您发现某些参数不兼容,您可以检查并返回对您的目标(0或者可能NaN)不利的值。
    • 直接为目标函数返回一个不利的值。这样,搜索可以继续,并且在突变期间不会选择该点。但是,如果您不知道为什么这些参数值不能正确收敛,那就有点麻烦了。
于 2012-07-01T08:51:00.227 回答