matlab Lsqcurvefit,依赖于其他上限的上限

wfypjpf4  于 2023-03-13  发布在  Matlab
关注(0)|答案(1)|浏览(208)

为了使问题简单化,我使用MATLAB,试图为lsqcurvefit创建一个上限,其中参数的上限之和不能超过100。
就像
磅= [0,0,0];ub = [a,b,c];
其中a+B+c〈100
有没有一种简单而优雅的方法可以将这种类型的信息传递到lsqcurvefit命令中?
我试过用if语句在ode 45部分设置限制器,我试过在每个上限点设置100,看看lsqcurvefit是否会自然地遵循这个限制,我所期望的是我从lsqcurvefit得到的参数之和应该小于或等于100。

4si2a6ki

4si2a6ki1#

据我所知,lsqcurvefit函数没有优化参数之间约束的输入,因此您可能需要使用更通用的优化函数,如fmincon
下面是一个比较,我取一个二次函数,它接受系数abc和轴点x的3元素数组:

fun = @(abc, x) abc(1)*x.^2 + abc(2)*x + abc(3);

我们可以在以下几点评估真实值:

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,您只能确保abceach 元素在边界内,例如

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' );

相关问题