2

我正在尝试使用 lsqcurvefit 进行一些拟合。我有这样的功能:

function F = cdf_3p_model(a,data)
F=1-((1-a(5)-a(6)).*(exp(-abs(data)./a(1)))+((1-a(4)-a(6)).*(exp(-abs(data)./a(2))))+((1-a(4)-a(5)).*(exp(-abs(data)./a(3)))));

function [a residual] = cdf_fit_3p(x,y)
a0 = [10 1 0.1 0.3 0.3 0.3];
lb = [0 0 0 0 0 0];
ub = [];
curvefitoptions = optimset('Display','final','MaxFunEvals',100000,'MaxIter',50000);
[a, residual] = fmincon(@cdf_3p_model,a0,x,y,lb,ub,curvefitoptions);
end

我设置了初始参数 ub, lb 但我还如何声明:

a(1) > a(2) > a(3)
a(5) + a(6) +a(7) = 1
4

3 回答 3

3

我认为您有更好的机会使用诸如fmincon之类的最小化例程之一,它允许您指定否则可能无法执行的约束。您可以通过采用模型和数据之间差异的 L2 范数轻松合并最小二乘

于 2011-11-23T17:03:45.780 回答
0

您必须从一组对 MatLab 更有用的参数中计算出您“想要”的参数。

例如,您可以重写

a(1) > a(2) > a(3)
a(5) + a(6) + a(7) = 1

作为

a(3) = p(1)
a(2) = p(1) + p(2)
a(1) = p(1) + p(2) + p(3)
a(4) = p(4)
a(5) = p(5)
a(6) = p(6)
a(7) = 1 - p(5) - p(6)

lb = [0 0 0 0 0 0]
ub = [Inf Inf Inf Inf 1 1]

好吧,它并不完美,因为它允许 a(7) 低至 -1 而不是 0。但它包括您的其他约束。

于 2012-02-27T23:24:56.453 回答
0

通常我会说,“在你的函数中创建子句,当不满足这些条件时,它会给出非常糟糕的'分数'。” 但是,您的条件使允许参数的范围成为可能数字范围的一个很小很小的子集,我认为如果这样做,您将导致 lsqcurvefit 永远不会收敛。我会说 lsqcurvefit 不是适合您的解决方案。

于 2011-11-23T16:26:31.880 回答