对于仅为数值的约束条件,例如 b > 0
,您可以使用'Lower'
和 'Upper'
边界参数来指定它们。对于更复杂的关系,例如 c+b>a/2
,您需要采用类似James建议的方法,将函数输出设置为高值,例如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);
接下来拟合一个曲线(请注意,您必须使用匿名函数,因为某些原因函数句柄不起作用):
params = fit(x, y, @(a, b, c, x) my_fcn(a, b, c, x), ...
'StartPoint', [1 1 1], ...
'Lower', [-Inf 0 -Inf]);
params =
General model:
params(x) = my_fcn(a,b,c,x)
Coefficients (with 95
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](https://istack.dev59.com/keiPL.webp)