没有限制条件,问题可以被写成和解决为一个简单的线性系统:
A = bsxfun(@power, your_X_data(:), [4 2 0]);
abc = A\your_Y_data(:)
如果受约束的模型确实支撑您的数据,那些限制当然会自动得到满足。例如,
iff指的是如果和仅当的逻辑运算符。
a = +23.9;
b = -15.75;
c = 4;
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3);
x = -1:0.01:1;
y = f(x, [a b c]) + randn(size(x));
A = bsxfun(@power, x(:), [4 2 0]);
abc = A\y(:);
plot(x,y, 'b'), hold on
plot(x, f(x, abc), 'r')
xlabel('x (nodes)'), ylabel('y (data)')
但是,如果您对数据进行的约束与那个受限制的模型描述不准确,可能会出现问题:
a = -23.9;
b = +15.75;
c = 4;
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3);
x = -1:0.01:1;
y = f(x, [a b c]) + randn(size(x));
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(x,y, 'b'), hold on
plot(x, f(x, abc), 'r')
xlabel('x (nodes)'), ylabel('y (data)')
这个解决方案中的a == 0
表明模型选择错误。
如果a == 0
的精确相等是一个问题:当然,如果您将a == eps(0)
,则没有区别。从数值上讲,对于现实世界的数据,这并不会被注意到,但它仍然是非零的。
总之,我怀疑你的模型选择不合适,约束条件只是为了让一切正常运行,或者在尝试任何拟合之前应将数据进行无偏/重新缩放,或者某些类似的前提条件适用(我经常看到人们做这种事情,所以是的,我有点有偏见 :)
那么...这些约束背后的真正原因是什么?
a>0
而不是a>=0
?假设你的优化结果为a=0
,那么将其设置为a=\epsilon
将会改变很少... - Shai