在 GNUPLOT 中对参数函数的参数施加约束

Putting constraints on parameters of a parametric function in GNUPLOT

我正在尝试使模型适合某些数据。到目前为止一切正常。但是,我想对方程的参数应用一些约束。例如假设以下函数:f(x)=a*sin(x)+b*cos(x*a/b)。假设 "a" 和 "b" 是参数;并假设您想将此等式拟合到某些数据,并且 "a" 和 "b" 的估计值必须落在特定的不同区间内。例如假设约束:a >= 2.0 和 0.1 < b <= 1.0 那么,如何通过考虑上述对参数 "a" 和 "b" 的限制来告诉 gnuplot 适合?

因为我要对几千条曲线进行拟合。我想知道在 Fortran 中是否有类似于隐式 do 循环的东西;意思是在包含所有曲线的数据文件上依次执行拟合?

非常感谢您的帮助。

无法限制拟合范围。您可以使用三元运算符(例如 'a>2?a:1e300')修改函数,但很有可能您的拟合变得不稳定,而且这种风格非常糟糕。 ;)

尽量预测您的参数,以防止它们偏离禁区。在开始时分别拟合参数,例如在一个更简单的函数中引入其中一个,只使用一小部分数据,其中部分参数是不相关的,等等。只有在最后一步才能用所有参数和整个数据集拟合你的完整函数。

并且 gnuplot 确实有 do for [] {}while () {} 循环,您可以使用它们迭代数据集。在你问之前:用于保存拟合参数的数组变量最近才在开发版本 5.1 中引入。

一般情况下,实现参数约束可以使用变量的改变。例如有 a >= amin 你可以用

替换它
a = amin + aa^2

其中 -inf < aa < +inf 是您的新拟合参数。或者,要获得 bmin < b <= bmax,您可以定义

b = bmin + (bmax - bmin)/(1 + bb^2)

其中,bb 是您新的无约束拟合参数。

使用你的例子,让a >= 2.0定义

a = 2.0 + aa^2

并得到 0.1 < b <= 1.0 定义

b = 0.1 + 0.9/(1+bb^2)

可能有无数种方法可以定义变量的变化;您应该选择一种可靠且计算效率高的形式。它还将取决于您希望函数在何处快速变化或具有渐近行为。例如,我在上面用于 b 的形式接近 bmin,因为 bb 接近 +inf。这意味着如果 b 的目标值非常接近 bmin,则 bb 必须变得非常大,并且拟合过程可能会失败。在这种情况下,另一种形式可能更有用,例如:

b = bmax - (bmax - bmin) /(1 + bb^2)

另一个有趣且常见的函数类别是指数函数。假设你的拟合函数是 f(x) = a*exp(-b*(x-c)^2) 并且你想确保 b > 0a > 0。直接重写会更自然:

f(x) = exp(aa - (bb*(x-c))^2)

然后使用结果aabb计算a = exp(aa)b = bb^2

请注意,通常使用此方法,aa(或bb)中的不确定性估计必须正确传播到a(或b)。但那是另一个话题了。