В задаче оптимизации цель или ограничительные функции иногда имеют параметры в дополнение к независимой переменной. Дополнительные параметры могут быть данными или могут представлять переменные, которые не изменяются во время оптимизации.
Чтобы включать эти параметры в подход, основанный на проблеме, просто обратитесь к переменным рабочей области в своей цели или ограничительных функциях.
Например, предположите, что у вас есть матрицы C
и d
в particle.mat
файл и эти матрицы представляют данные для вашей проблемы. Загрузите данные в свою рабочую область.
load particle
Просмотрите размеры матриц.
disp(size(C))
2000 400
disp(size(d))
2000 1
Создайте переменную x
оптимизации из размера, который подходит для формирования векторного
C*x
.
x = optimvar('x',size(C,2));
Создайте задачу оптимизации, чтобы минимизировать сумму квадратов условий в C*x – d
подвергните ограничению что x
является неотрицательным.
x.LowerBound = 0; prob = optimproblem; expr = sum((C*x - d).^2); prob.Objective = expr;
Вы включаете данные C
и d
в проблему просто путем обращения к ним в выражении целевой функции. Решите задачу.
[sol,fval,exitflag,output] = solve(prob)
Solving problem using lsqlin. Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
x: [400x1 double]
fval = 22.5795
exitflag = OptimalSolution
output = struct with fields:
message: '...'
algorithm: 'interior-point'
firstorderopt: 9.9673e-07
constrviolation: 0
iterations: 9
linearsolver: 'sparse'
cgiterations: []
solver: 'lsqlin'
Используйте тот же подход в нелинейных проблемах. Например, предположите, что у вас есть целевая функция нескольких переменных, некоторые из которых являются фиксированными данными для оптимизации.
type parameterfun
function y = parameterfun(x,a,b,c) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-c + c*x(2)^2)*x(2)^2;
Для этой целевой функции, x
вектор с 2 элементами и a
B
, и c
скалярные параметры. Создайте переменную оптимизации и присвойте значения параметров в своей рабочей области.
a = 4;
b = 2.1;
c = 4;
x = optimvar('x',2);
Создайте задачу оптимизации. Преобразуйте parameterfun
к выражению оптимизации и набору конвертированное выражение как цель.
prob = optimproblem; expr = fcn2optimexpr(@parameterfun,x,a,b,c); prob.Objective = expr;
Решите задачу, начинающую с точки x0.x = [1/2;1/2]
.
x0.x = [1/2;1/2]; [sol,fval] = solve(prob,x0)
Solving problem using fminunc. Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
sol = struct with fields:
x: [2x1 double]
fval = -1.0316
Поскольку эта целевая функция является рациональной функцией x
, можно задать цель в терминах переменной оптимизации, не используя fcn2optimexpr
. Так или иначе вы включаете дополнительные параметры просто путем обращения к ним в целевой функции.
prob.Objective = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2)...
+ (-c + c*x(2)^2)*x(2)^2;
[sol,fval] = solve(prob,x0)
Solving problem using fminunc. Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
sol = struct with fields:
x: [2x1 double]
fval = -1.0316