Передача дополнительных параметров в подходе, основанном на проблеме

В задаче оптимизации цель или ограничительные функции иногда имеют параметры в дополнение к независимой переменной. Дополнительные параметры могут быть данными или могут представлять переменные, которые не изменяются во время оптимизации.

Чтобы включать эти параметры в подход, основанный на проблеме, просто обратитесь к переменным рабочей области в своей цели или ограничительных функциях.

Задача наименьших квадратов с пройден данными

Например, предположите, что у вас есть матрицы 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 элементами и aB, и 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

Смотрите также

Похожие темы