在GNUPLOT

时间:2016-04-12 07:28:27

标签: constraints gnuplot

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

因为我想为数千条曲线执行拟合。我想知道是否有类似于Fortran中的隐式do循环的东西;意思是对包含所有曲线的数据文件一个接一个地执行拟合?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

通常,要实现参数约束,可以使用变量更改。例如,将a >= amin替换为

a = amin + aa^2

其中-inf < aa < +inf是新的fit参数。或者,要拥有bmin < b <= bmax,您可以定义

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

同样,bb是您的新fit参数,不受限制。

使用您的示例来定义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)。但这是另一个话题。

答案 1 :(得分:0)

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

尽量预测您的参数,以防止它们在禁区内徘徊。在开头单独拟合参数,例如在一个更简单的函数中引入其中一个,只使用部分参数不相关的一小部分数据等。只有在最后一步中,才能使用所有参数和整个数据集来拟合整个函数。

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