В этом примере показано, как найти значения дополнительных параметров в функциях, сгенерированных prob2struct
.
Создайте нелинейную задачу и преобразуйте задачу в структуру с помощью prob2struct
. Назовите сгенерированную целевую функцию и нелинейную ограничительную функцию.
x = optimvar('x',2); fun = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; prob = optimproblem('Objective',fun); mycon = dot(x,x) <= 4; prob.Constraints.mycon = mycon; x0.x = [-1;1.5]; problem = prob2struct(prob,x0,'ObjectiveFunctionName','rosenbrock',... 'ConstraintFunctionName','circle2');
Исследуйте первую линию сгенерированной функции ограничения circle2
.
type circle2
function [cineq, ceq, cineqGrad, ceqGrad] = circle2(inputVariables, extraParams) %circle2 Compute constraint values and gradients % % [CINEQ, CEQ] = circle2(INPUTVARIABLES, EXTRAPARAMS) computes the % inequality constraint values CINEQ and the equality constraint values % CEQ at the point INPUTVARIABLES, using the extra parameters in % EXTRAPARAMS. % % [CINEQ, CEQ, CINEQGRAD, CEQGRAD] = circle2(INPUTVARIABLES, % EXTRAPARAMS) additionally computes the inequality constraint gradient % values CINEQGRAD and the equality constraint gradient values CEQGRAD % at the current point. % % Auto-generated by prob2struct on 22-Apr-2021 21:03:24 %% Compute inequality constraints. Hineq = extraParams{1}; fineq = extraParams{2}; rhsineq = extraParams{3}; Hineqmvec = Hineq*inputVariables(:); cineq = 0.5*dot(inputVariables(:), Hineqmvec) + dot(fineq, inputVariables(:)) + rhsineq; %% Compute equality constraints. ceq = []; %% Compute constraint gradients. % To call the gradient code, notify the solver by setting the % SpecifyConstraintGradient option to true. if nargout > 2 cineqGrad = Hineqmvec + fineq; ceqGrad = []; end end
The circle2
функция имеет второй вход с именем extraParams
. Чтобы найти значения этого входа, используйте functions
функция на указателе на функцию, хранящемся в problem.nonlcon
.
F = functions(problem.nonlcon)
F = struct with fields:
function: '@(x)circle2(x,extraParams)'
type: 'anonymous'
file: '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/optim/problemdef/+optim/+internal/+problemdef/+compile/compileQuadraticConstraints.p'
workspace: {[1x1 struct]}
within_file_path: ''
Чтобы получить доступ к дополнительным параметрам, просмотрите workspace
область F
.
ws = F.workspace
ws = 1x1 cell array
{1x1 struct}
Продолжайте извлекать информацию на более глубоких уровнях, пока не увидите все дополнительные параметры.
ws1 = ws{1}
ws1 = struct with fields:
extraParams: {[2x2 double] [2x1 double] [-4]}
ep = ws1.extraParams
ep=1×3 cell array
{2x2 double} {2x1 double} {[-4]}
ep{1}
ans = (1,1) 2 (2,2) 2
ep{2}
ans = All zero sparse: 2x1
ep{3}
ans = -4
Теперь вы можете прочитать circle2
Файл список и понять, что означают все переменные.
Hineq = 2*speye(2); fineq = sparse([0;0]); rhsineq = -4;