【问题标题】:Add the constraint of normalization coefficient for matlab curve fitting为matlab曲线拟合添加归一化系数的约束
【发布时间】:2021-11-10 14:53:05
【问题描述】:

我想使用自定义模型来拟合一些数据。我使用的语法是fit()。我使用的数学模型是这样的:

a*exp(-x*b)+c*exp(-y*d)+e*exp(-z*f)

a,b,c,d,e,f 是我将估计的参数,x,y,z 是自变量。 (实际的数学公式更复杂,但像这样非线性。)

如何在拟合曲线时添加a+c+e=1 的约束(并且a,c,e 必须为正或0)?我知道如何设置下限和上限,但不知道如何将此归一化系数约束添加到拟合中。使用fit()方法时可以这样做吗?

【问题讨论】:

  • 你不能用a*exp(-x*b)+c*exp(-y*d)+(1-a-c)*exp(-z*f)吗?
  • 在这种情况下 a+c 可能大于 1?
  • 1-a-c代替e相当于限制a+c+e+1,就是这样
  • 我刚刚编辑了这个问题,以明确 a c e 也应该是积极的。实际上 a c e 具有物理意义。所以 1-a-c 可能会导致负数?
  • @BigBO。请在您的问题中加入一个具有代表性的数据示例(数字,而不是图表)。

标签: matlab curve-fitting


【解决方案1】:

我想我已经在某个地方发布了这个,但现在找不到。

由于它是非线性拟合,因此转换参数没有什么大不了的。假设我们选择了连续可微单调函数:

a = f(s) = 1/2 ( 1 + s / sqrt( 1 + s^2 ) )

所以对于s in (-inf, inf) on 得到a in (0,1)。实际上,通过一些简单的移位和缩放,我们可以在( u, v ) 中得到任何a

现在我们可以对b 做同样的事情,但是有了额外的限制a + b + c = 1,我们知道c = 0 b 最多肯定小于1 - f(s) = 1/2 ( 1 - s / sqrt( 1 + s^2 ) )。因此,现在是缩放时间,我们可以设置:

b = g(t, s) = 1/2 ( 1 - s / sqrt( 1 + s^2 ) ) 1/2 ( 1 + t / sqrt( 1 + t^2 ) )

再次在(-inf, inf) 中使用t。第一部分是由于 a 的已设置值而进行的缩放,第二部分从上面重复该过程。

最后,c就是1- f(s) - g(t, s)

最终,带有参数st 的拟合函数看起来像:

+ 0.50 * ( 1 + s / sqrt( 1 + s^2 ) ) * exp( -x * b )
+ 0.25 * ( 1 - s / sqrt( 1 + s^2 ) ) * ( 1 + t / sqrt( 1 + t^2 ) ) * exp( -y * d )
+ (
    +1.00 
    -0.50 * ( 1 + s / sqrt( 1 + s^2 ) 
    -0.25 * ( 1 - s / sqrt( 1 + s^2 ) ) * ( 1 + t / sqrt( 1 + t^2 ) )
) * exp( -z * f )

通过错误传播获取st 的结果提供abc

【讨论】:

  • 谢谢。这是使用映射来解决这个问题的一种非常聪明的方法。它给了我很大的启发并解决了这个特殊的问题。我不知道这将如何影响我的验配处理时间,但它非常好。你知道使用一些简单的语法来解决这个问题的任何方法吗?我的意思是也许在未来我可能仍然会遇到一些合适的约束问题。有没有更简单和通用的方法来做到这一点?无论如何,参数化方法给了我很多启发!
  • 嗨,我一直在想一些概括,但还没有想出什么。很多时候,你的概括被新问题中的一些小“插件”破坏了,无论如何,你之前没有想到。所以大多数时候,我选择铅笔和纸,然后像这样算出来。不过,“工具集”非常通用且简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2021-08-07
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多