我正在尝试将模型与某些数据相匹配。到目前为止一切都好。但是我想对方程的参数应用一些约束。例如,假设以下函数:f(x)=a*sin(x)+b*cos(x*a/b)
。假设" a"和" b"是参数;并且假设你想要将这个等式与某些数据拟合,并且估计值为" a"和" b"必须以特定的不同间隔落下。例如,假设约束:a> = 2.0
和0.1 < b <= 1.0
那么如何通过考虑上述对参数的限制来告诉gnuplot适合#34; a&#34;和&#34; b&#34;?
因为我想为数千条曲线执行拟合。我想知道是否有类似于Fortran中的隐式do循环的东西;意思是对包含所有曲线的数据文件一个接一个地执行拟合?
非常感谢您的帮助。
答案 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 > 0
和a > 0
。改写会更自然:
f(x) = exp(aa - (bb*(x-c))^2)
然后使用生成的aa
和bb
计算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中引入。