在 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 > 0
和 a > 0
。直接重写会更自然:
f(x) = exp(aa - (bb*(x-c))^2)
然后使用结果aa
和bb
计算a = exp(aa)
和b = bb^2
。
请注意,通常使用此方法,aa
(或bb
)中的不确定性估计必须正确传播到a
(或b
)。但那是另一个话题了。
我正在尝试使模型适合某些数据。到目前为止一切正常。但是,我想对方程的参数应用一些约束。例如假设以下函数: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 > 0
和 a > 0
。直接重写会更自然:
f(x) = exp(aa - (bb*(x-c))^2)
然后使用结果aa
和bb
计算a = exp(aa)
和b = bb^2
。
请注意,通常使用此方法,aa
(或bb
)中的不确定性估计必须正确传播到a
(或b
)。但那是另一个话题了。