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

О структурах задачи

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

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

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

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

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

  3. Создайте стартовую точку. Например, чтобы создать 3D случайную стартовую точку 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

Этот пример минимизирует функцию от Запущенного Решатель согласно ограничению x 1 + 2x2  ≥ 4. Цель

sixmin = 4x2 – 2.1x4 + x6/3 + xy – 4y2 + 4y4.(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);

Похожие темы