Создайте структуру задачи

Сведения о структурах задачи

Как использовать GlobalSearch или MultiStart решатели, сначала необходимо создать структуру задачи. Рекомендуемый способ создать структуру задачи - использовать createOptimProblem функция. Вы можете создать структуру вручную, но это подвержено ошибкам.

Используйте createOptimProblem Функция

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

  1. Определите свою целевую функцию как файл или анонимную функцию. Для получения дополнительной информации смотрите Вычисление целевых функций. Если ваш решатель lsqcurvefit или lsqnonlin, убедитесь, что целевая функция возвращает вектор, а не скаляр.

  2. При необходимости создайте ограничения, такие как ограничения и нелинейные функции ограничений. Для получения дополнительной информации смотрите Запись ограничений.

  3. Создайте начальную точку. Например, чтобы создать трехмерную случайную начальную точку xstart:

    xstart = randn(3,1);
  4. (Необязательно) Создать опции используя optimoptions. Для примера,

    options = optimoptions(@fmincon,'Algorithm','interior-point');
  5. Войти

    problem = createOptimProblem(solver,

    где solver - имя локального решателя:

  6. Установите начальную точку с помощью 'x0' параметр. Если ваша начальная точка xstart, и ваш решатель fmincon, ваша запись сейчас

    problem = createOptimProblem('fmincon','x0',xstart,
  7. Включите указатель на функцию для вашей целевой функции в objective:

    problem = createOptimProblem('fmincon','x0',xstart, ...
        'objective',@objfun,
  8. Установите ограничения и другие ограничения, как применимо.

    ОграничениеИмя
    нижние границы'lb'
    верхние границы'ub'
    матрица Aineq для линейных неравенств  Aineq x ≤ bineq'Aineq'
    векторная bineq для линейных неравенств  Aineq x ≤ bineq'bineq'
    матрица Aeq для линейных равенств  Aeq x = beq'Aeq'
    векторная beq для линейных равенств  Aeq x = beq'beq'
    нелинейная функция ограничения'nonlcon'
  9. При использовании lsqcurvefit локальный решатель, включать векторы входных данных и данных отклика, названный 'xdata' и 'ydata' соответственно.

  10. Лучшая практика: проверьте структуру задачи, запустив решатель в структуре. Для примера, если ваш локальный решатель fmincon:

    [x,fval,eflag,output] = fmincon(problem);

Пример: Создайте структуру задачи с createOptimProblem

Этот пример минимизирует функцию из Run the Solver, удовлетворяющую ограничению x 1 + 2  x 2 ≥ 4. Цель состоит в том, чтобы

sixmin = 4 x2 – 2.1 x4 + x6/3 + xy – 4 y2 + 4 y4.(1)

Используйте interior-point алгоритм fmincon, и установите начальную точку равной [2;3].

  1. Напишите указатель на функцию для целевой функции.

    sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
        + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
  2. Запишите линейные матрицы ограничений. Измените ограничение на форму «меньше»:

    A = [-1,-2];
    b = -4;
  3. Создайте локальные опции для использования interior-point алгоритм:

    opts = optimoptions(@fmincon,'Algorithm','interior-point');
  4. Создайте структуру задачи с createOptimProblem:

    problem = createOptimProblem('fmincon', ...
        'x0',[2;3],'objective',sixmin, ...
        'Aineq',A,'bineq',b,'options',opts)
  5. Получившаяся структура:

    problem = 
    
      struct with fields:
    
        objective: @(x)(4*x(1)^2-2.1*x(1)^4+x(1)^6/3+x(1)*x(2)-4*x(2)^2+4*x(2)^4)
               x0: [2x1 double]
            Aineq: [-1 -2]
            bineq: -4
              Aeq: []
              beq: []
               lb: []
               ub: []
          nonlcon: []
           solver: 'fmincon'
          options: [1x1 optim.options.Fmincon]
  6. Лучшая практика: проверьте структуру задачи, запустив решатель в структуре:

    [x,fval,eflag,output] = fmincon(problem);

Похожие темы