Генерация кода в нелинейном методе наименьших квадратов: Фон

Что такое генерация кода?

Генерация кода является преобразованием кода MATLAB® к коду С с помощью MATLAB Coder™. Генерация кода требует лицензии MATLAB Coder.

Как правило, вы используете генерацию кода, чтобы развернуть код по оборудованию, которое не запускает MATLAB. Например, можно развернуть код по роботу, с помощью lsqnonlin для оптимизации перемещения или планирования.

Для примера смотрите, Генерируют Код для lsqcurvefit или lsqnonlin. Для генерации кода в других решателях оптимизации смотрите, Генерируют Код для fmincon, Генерируют Код для quadprog, Генерируют Код для lsqlin или Генерируют Код для fsolve.

Требования для генерации кода

  • lsqcurvefit и lsqnonlin поддержите генерацию кода, использующую любого codegen (MATLAB Coder) функция или приложение MATLAB Coder. У вас должна быть лицензия MATLAB Coder, чтобы сгенерировать код.

  • Целевой компьютер должен поддержать стандартные расчеты с плавающей точкой с двойной точностью. Вы не можете сгенерировать код для расчетов или фиксированной точки с одинарной точностью.

  • Цели генерации кода не пользуются теми же математическими библиотеками ядра как решатели MATLAB. Поэтому решения генерации кода могут варьироваться из решений для решателя, особенно для плохо обусловленных проблем.

  • Всем кодом для генерации должен быть код MATLAB. В частности, вы не можете использовать пользовательскую функцию черного ящика в качестве целевой функции для lsqcurvefit или lsqnonlin. Можно использовать coder.ceval выполнять пользовательскую функцию, закодированную в C или C++. Однако пользовательская функция должна быть вызвана в функции MATLAB.

  • lsqcurvefit и lsqnonlin не поддерживайте problem аргумент для генерации кода.

    [x,fval] = lsqnonlin(problem) % Not supported
  • Необходимо задать целевую функцию при помощи указателей на функцию, не строк или имен персонажей.

    x = lsqnonlin(@fun,x0,lb,ub,options) % Supported
    % Not supported: lsqnonlin('fun',...) or lsqnonlin("fun",...)
  • Все входные матрицы lb и ub должно быть полным, не разреженным. Можно преобразовать разреженные матрицы в полный при помощи full функция.

  • lb и ub аргументы должны иметь то же количество записей как x0 аргументом или должен быть пустой [].

  • Для усовершенствованной оптимизации кода, включающей встраиваемые процессоры, вам также нужна лицензия Embedded Coder®.

  • Необходимо включать опции для lsqcurvefit или lsqnonlin и задайте их использование optimoptions. Опции должны включать Algorithm опция, набор к 'levenberg-marquardt'.

    options = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt');
    [x,fval,exitflag] = lsqnonlin(fun,x0,lb,ub,options);
  • Генерация кода поддерживает эти опции:

    • Algorithm — Должен быть 'levenberg-marquardt'

    • FiniteDifferenceStepSize

    • FiniteDifferenceType

    • FunctionTolerance

    • MaxFunctionEvaluations

    • MaxIterations

    • SpecifyObjectiveGradient

    • StepTolerance

    • TypicalX

  • Сгенерированный код ограничил проверку ошибок на опции. Рекомендуемый способ обновить опцию состоит в том, чтобы использовать optimoptions, не запись через точку.

    opts = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt');
    opts = optimoptions(opts,'MaxIterations',1e4); % Recommended
    opts.MaxIterations = 1e4; % Not recommended
  • Не загружайте опции из файла. Выполнение так может заставить генерацию кода перестать работать. Вместо этого создайте опции в своем коде.

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

  • Поскольку выходные функции и функции построения графика не поддерживаются, решатели не возвращаются, выход отмечают –1.

Сгенерированный код, не многопоточный

По умолчанию сгенерированный код для использования вне среды MATLAB пользуется библиотеками линейной алгебры, которые не многопоточны. Поэтому этот код может запуститься значительно медленнее, чем код в среде MATLAB.

Если ваш целевой компьютер имеет несколько ядер, можно достигнуть лучшей эффективности при помощи пользовательских многопоточных библиотек LAPACK и BLAS. Чтобы включить эти библиотеки в ваш сгенерированный код, смотрите, Ускоряют Линейную алгебру в Сгенерированном Автономном Коде при помощи Вызовов LAPACK (MATLAB Coder).

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

| | | (MATLAB Coder)

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте