【问题标题】:Passing additional parameters to fmincon将附加参数传递给 fmincon
【发布时间】:2013-01-09 07:28:35
【问题描述】:

我想使用fmincon 在方程上拟合两个参数。我用lsqnonlin 做到了这一点,但我想利用fmincon 的不等式约束。

问题是我无法传递测量数据的两个向量,例如y(x),以我在 lsqnonlin 中所做的相同方式进入函数。

我应该怎么做?

estim = lsqnonlin(@fit_simp,X0,lb,ub,options,X,Y) %X,Y are the measured data in vectors, y(x)

estim = fmincon(@fit_simp,X0,[],[],[],[],[],[],nonlcon,options); 

我将如何传递测量的向量?

【问题讨论】:

  • 那么,您已经测量了数据并且想要拟合一个已知模型?那么你想要遵守的不等式约束是什么,它们代表什么?
  • 可能带有匿名函数 - 你能把你在 lsqnonlin 上使用的代码贴出来
  • 是的,我确实有测量数据,例如 y(x)。我的问题不是如何定义约束,而是如何为 fmincon 提供测量数据 [向量]。
  • @user2010599:我问是因为这听起来像XY problem;也许有了更多细节,我们可能会看到一种完全避免使用 fmincon 的方法。

标签: matlab constraints curve-fitting data-fitting


【解决方案1】:

使用这样的匿名函数:

estim = fmincon(@(y)fit_simp(y),X0,[],[],[],[],[],[],nonlcon,options); 

显然你必须调整你的目标函数来接受参数,即fit_simp变成fit_simp(y)

这个直接来自文档,在这个页面搜索anonymous:

http://www.mathworks.com/help/optim/ug/fmincon.htmlhttp://www.mathworks.com/help/optim/pass-extra-parameters.html

我刚刚在您的代码中看到您想要传递两个额外的参数 X 和 Y。您可能必须将它们封装在一个变量中以用于匿名函数(但也许您可以发送两个我不确定)

试试

options.Y = Y;
options.X = X;

然后使用@(options)fit_simp(options)

【讨论】:

  • 据我了解 fmincon 最小化了返回标量的函数,但 fit_simp 返回向量。这就是错误的原因。 (Lsqnonlin 解决了同样的问题)“用户提供的目标函数必须返回一个标量值。”你知道我该如何解决这个问题吗?提前致谢
  • 是的,我建议您开始一个新问题,在其中显示您的目标函数并描述实际的优化/曲线拟合,我相信将其转换为输出标量不会太难.它通常只是平方误差的总和:scalar = sum((x - y).^2)
  • 我想我解决了这个问题。目标函数返回一个向量,它应该是一个标量,所以我将目标函数转为返回 sum(element*.element),即向量元素的平方和。
  • 元素是 X - Y 的向量吗?此外,您的代码与 sum(element.^2) 相同,可能更易于阅读。由你决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2011-07-10
相关资源
最近更新 更多