abc = [2, 5, 3]; % note the true sum of these coeffs is 10!
y = fun(abc, x);
并为out优化设置一些约束条件:
abcMax = 9; % The max permitted sum of the coefficients abc
abc0 = [1 2 3]; % Initial guess for abc during optimisation
ub = [abcMax,abcMax,abcMax]; % Uppper bounds for abc, use the max sum of each
lb = [0,0,0]; % Lower bounds for abc, using 0 for each
使用lsqcurvefit,您只能确保abc的 each 元素在边界内,例如
abcLSQ = lsqcurvefit( fun, abc0, x, y, lb, ub );
然而,我们可以为fmincon构造一个附加的不等式约束,并使用它来代替:
% Minimise the absolute error F(abc) = ( fun(abc,x) - y ).^2
% For scalar minimisation, we minimise sum(F)
% such that A*abc.' <= B
% and lb <= abc <= ub
A = [1 1 1]; % 1a + 1b + 1c
B = abcMax; % a + b + c <= abcTotal
abcFMC = fmincon( @(abc) sum((fun(abc,x) - y).^2), abc0.', A, B, [], [], lb, ub );
我们可以进行一些绘图以确认结果-我已将输出系数数组添加到图例中
% Create an x vector for fitting which is slightly longer than x
xfit = linspace(x(1)-1,x(end)+1,2*numel(x));
% Fit using the two coefficient sets
yfitLSQ = fun( abcLSQ, xfit );
yfitFMC = fun( abcFMC, xfit );
% Plot
figure(1); clf;
hold on;
fstr = @(str, abc) sprintf( '%s, [%.2f, %.2f, %.2f]', str, abc(1), abc(2), abc(3) );
plot( x, y, 'ob', 'displayname', fstr('input data', abc), 'markersize', 5 );
plot( xfit, yfitLSQ, 'r', 'displayname', fstr('lsqcurvefit', abcLSQ), 'linewidth', 1 );
plot( xfit, yfitFMC, 'k--', 'displayname', fstr('fmincon', abcFMC), 'linewidth', 1 );
legend( 'location', 'northwest' ); grid on;
title( 'Fits for equation of form a*x^2 + b*x + c' );
1条答案
按热度按时间4si2a6ki1#
据我所知,
lsqcurvefit
函数没有优化参数之间约束的输入,因此您可能需要使用更通用的优化函数,如fmincon
。下面是一个比较,我取一个二次函数,它接受系数
abc
和轴点x
的3元素数组:我们可以在以下几点评估真实值:
并为out优化设置一些约束条件:
使用
lsqcurvefit
,您只能确保abc
的 each 元素在边界内,例如然而,我们可以为
fmincon
构造一个附加的不等式约束,并使用它来代替:我们可以进行一些绘图以确认结果-我已将输出系数数组添加到图例中