Matlab - 使用约束参数拟合曲线

时间:2017-09-12 13:34:29

标签: matlab curve-fitting

对于(xy)数据集,请让abc中的表达式给出曲线...等,例如f='a*exp(b*x)+c',适合cfit=fit(x,y,f)

假设我们有一组约束,例如b>0c+b>a/2。在这种情况下我应该如何使用fit命令?。

3 个答案:

答案 0 :(得分:4)

虽然您可以设置较低的边界来强制执行$("#button").on('click', show_function); function show_function() { $(".graph").fadeIn("slow"); $('.bar-container').addClass('slide-it'); } ,但我认为以b>0正确执行c+b>a/2是不可能的。但最终每个拟合问题也可以被视为“最小化从曲线到数据的距离”问题,因此可以使用fit()来实现您的目标:

fmincon()

答案 1 :(得分:3)

对于仅为数值的约束,例如b > 0,您可以使用'Lower''Upper'边界参数来指定这些约束。对于更复杂的关系,例如c+b>a/2,您必须采用类似James suggests的方法,将函数输出设置为类似flintmax的高值,以生成大错误。例如,让我们说我像这样定义我的函数:

function y = my_fcn(a, b, c, x)
  if (c+b > a/2)
    y = a.*exp(b.*x)+c;
  else
    y = flintmax().*ones(size(x));
  end
end

我可以创建一组嘈杂的测试数据,如下所示:

a = 4;
b = 2;
c = 1;
x = (0:0.01:2).';
y = my_fcn(a, b, c, x) + 40.*(rand(size(x))-0.5);

然后拟合曲线(请注意,您必须使用anonymous function,因为function handle由于某种原因而无法正常工作):

params = fit(x, y, @(a, b, c, x) my_fcn(a, b, c, x), ...
             'StartPoint', [1 1 1], ...  % Starting guesses for [a b c]
             'Lower', [-Inf 0 -Inf]);    % Set bound for 'b'

params = 

     General model:
     params(x) = my_fcn(a,b,c,x)
     Coefficients (with 95% confidence bounds):
       a =       4.297  (2.985, 5.609)
       b =       1.958  (1.802, 2.113)
       c =      0.1908  (-4.061, 4.442)

请注意,拟合值接近原始值,但由于噪音不完全匹配。我们可以像这样想象合适:

plot(x, y);
hold on;
plot(x, my_fcn(params.a, params.b, params.c, x), 'r');

enter image description here

答案 2 :(得分:2)

一种简单的方法是使拟合函数返回一个非常大的值,如果参数值超出约束条件,则会产生非常大的误差。这个"砖墙"方法不是最优的,并且当拟合参数值接近边界条件时将导致问题。值得一试,因为它可以快速实现,并且可以在简单的情况下工作。注意从边界限制内的初始参数值开始。