没有约束,这个问题可以写成一个简单的线性系统来解决:
% Your design matrix ([4 2 0] are the powers of the polynomial)
A = bsxfun(@power, your_X_data(:), [4 2 0]);
% Best estimate for the coefficients, [a b c], found by
% solving A*[a b c]' = y in a least-squares sense
abc = A\your_Y_data(:)
这些约束当然会自动满足iff约束模型确实是您的数据的基础。例如,
% some example factors
a = +23.9;
b = -15.75;
c = 4;
% Your model
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3);
% generate some noisy XY data
x = -1:0.01:1;
y = f(x, [a b c]) + randn(size(x));
% Best unconstrained estimate a, b and c from the data
A = bsxfun(@power, x(:), [4 2 0]);
abc = A\y(:);
% Plot results
plot(x,y, 'b'), hold on
plot(x, f(x, abc), 'r')
xlabel('x (nodes)'), ylabel('y (data)')
但是,如果您对受约束模型未准确描述的数据施加约束,事情可能会出错:
% Note: same data, but flipped signs
a = -23.9;
b = +15.75;
c = 4;
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3);
% generate some noisy XY data
x = -1:0.01:1;
y = f(x, [a b c]) + randn(size(x));
% Estimate a, b and c from the data, Forcing a>0 and b<0
abc = fmincon(@(Y) sum((f(x,Y)-y).^2), [0 0 0], [-1 0 0; 0 +1 0; 0 0 0], zeros(3,1));
% Plot results
plot(x,y, 'b'), hold on
plot(x, f(x, abc), 'r')
xlabel('x (nodes)'), ylabel('y (data)')
(此解决方案有a == 0,表示模型选择不正确)。
如果a == 0 的完全相等是一个问题:如果你设置a == eps(0) 当然没有区别。从数值上讲,这对于真实世界的数据不会很明显,但它仍然是非零的。
无论如何,我怀疑您的模型选择不当,并且约束是使一切正常工作的“修复”,或者您的数据实际上应该在尝试进行任何拟合之前是无偏/重新调整的,或者类似的先决条件适用(我经常看到人们做这种事情,所以是的,我在这方面有点偏见:)。
那么...这些限制背后的真正原因是什么?