0

我在为无法正常运行的拟合找到良好的初始条件时遇到了一些问题。所以我想通过将它插入一个循环中来蛮力它,告诉 gnuplot 继续拟合,直到他得到小于 100% 的相对偏差,同时在每次他重新运行循环时随机更改初始值,我写了类似的东西那:

while(abs(m_err/m) > 1){
    m = rand(0)*0.3
    k = rand(0)
    x_0 = 15 + rand(0)*10 
    fit logi(x) 'data.csv' u 1:8 via m,k,x_0
}   

我将 rand 函数相乘,以便得到接近我期望适合拟合的值的值。

这种方法显然会导致很多不收敛和停止脚本中间循环的拟合。如果拟合不收敛或给出奇异矩阵,我如何告诉 gnuplot 简单地忽略这一点并重新运行随机化和拟合循环?

4

1 回答 1

1

了解您使用的 gnuplot 版本可能会有所帮助。据我所知,不收敛并不是当前 gnuplot 中的致命错误。它会打印一条错误消息,但无论如何都应该继续。如果不是这种情况,您可以尝试设置最大迭代次数,然后在拟合恢复时自行测试收敛性。例如

set fit maxiter 100   # no limit by default
set fit limit 1.e-5   # this is the default convergence criterion
do for [i=1:100] {
  a = something + i*0.01
  b = something_else
  fit f(x) 'datafile' using 1:2 via a, b
  if (FIT_ITER < 100) break;   # It converged!
}
if (FIT_ITER >= 100) {
  print "No starting point led to convergence."
  exit
}
于 2020-03-09T04:06:36.180 回答