Этот пример показывает вам, как создать Java® приложение, которое находит локальный минимум целевой функции с помощью MATLAB® оптимизационная функция fminsearch
и MWJavaObjectRef
класс.
В этом примере вы выполняете следующие шаги:
Используйте MATLAB Compiler SDK™, чтобы создать пакет, который применяет стандартные программы оптимизации MATLAB к целевым функциям, реализованным, когда Java возражает.
Доступ к функциям MATLAB в приложении Java, включая использование MWJavaObjectRef
класс, чтобы создать ссылку на объект Java и передать его сгенерированным методам Java.
Создайте и запустите приложение.
OptimDemo
пакет находит локальный минимум целевой функции и возвращает минимальное местоположение и значение.
Пакет использует оптимизационную функцию MATLAB fminsearch
, и этот пример оптимизирует банановую функцию Розенброка, используемую в MATLAB fminsearch
документация.
Класс Оптимизатора выполняет неограниченную нелинейную оптимизацию на целевой функции, реализованной как объект Java. Метод этого класса, doOptim
, принимает исходное предположение и объект Java, который реализует целевую функцию и возвращает местоположение и значение локального минимума. Второй метод, displayObj
, средство отладки, которое перечисляет характеристики объекта Java.
Эти два метода, doOptim
и displayObj
, инкапсулируйте функции MATLAB. Код MATLAB для этих двух методов находится в doOptim.m
и displayObj.m
, который может быть найден в
.matlabroot
\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp
Функции MATLAB | doOptim.m
displayObj.m
|
Местоположение функции MATLAB |
|
Участок кода Java |
|
javabuilder.jar |
|
Скопируйте ObjectRefExample
папка, которая поставляется с MATLAB к вашей папке работы:
copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','ObjectRefExample'),'ObjectRefExample')
В командной строке MATLAB перейдите к новому ObjectRefExample\ObjectRefDemoComp
подпапка в вашей папке работы.
Исследуйте код MATLAB, к которому вы хотите получить доступ из Java. Этот пример использует doOptim.m
и displayObj.m
.
function [x,fval] = doOptim(h, x0)
directEval = h.evaluateFunction(x0)
wrapperEval = mWrapper(x0)
[x,fval] = fminsearch(mWrapper,x0)
function className = displayObj(h) h className = class(h) whos('h') methods(h)
Создайте пакет Java с приложением Library Compiler или compiler.build.javaPackage
использование следующей информации:
Поле | Значение |
---|---|
Имя библиотеки | OptimDemo |
ClassName | Optimizer |
Файлы, чтобы скомпилировать | doOptim.m
displayObj.m
|
Например, если вы используете compiler.build.javaPackage
Ввод:
buildResults = compiler.build.javaPackage(["doOptim.m","displayObj.m"], ... 'PackageName','OptimDemo', ... 'ClassName','Optimizer');
Для получения дополнительной информации смотрите, что инструкции в Генерируют приложение Java Пакета и Сборки Java.
Запишите исходный код для класса, который реализует объектную функцию, чтобы оптимизировать. Код для этого примера находится в файле BananaFunction.java
.
Класс реализует банановую функцию Розенброка, описанную в MATLAB fminsearch
документация.
Запишите исходный код для приложения, это получает доступ к функциям MATLAB. Код для этого примера находится в файле PerformOptim.java
.
Программа делает следующее:
Инстанцирует объекта BananaFunction
класс выше, чтобы быть оптимизированным.
Создает MWJavaObjectRef
это ссылается на BananaFunction
объект, как показано:
origRef = new MWJavaObjectRef(objectiveFunction);
Инстанцирует объекта Optimizer.
Вызывает displayObj
метод, чтобы проверить, что объект Java передается правильно.
Вызывает doOptim
метод, который использует fminsearch
найти локальный минимум целевой функции.
Использует try/catch
блокируйтесь, чтобы обработать исключения.
Освобождает нативные ресурсы с помощью MWArray
методы.
В MATLAB перейдите к ObjectRefDemoJavaApp
папка.
Скопируйте сгенерированный OptimDemo.jar
пакет в эту папку.
Если вы использовали compiler.build.javaPackage
Ввод:
copyfile(fullfile('..','ObjectRefDemoComp','OptimDemojavaPackage','OptimDemo.jar'))
Если вы использовали Library Compiler, введите:
copyfile(fullfile('..','ObjectRefDemoComp','OptimDemo','for_testing','OptimDemo.jar'))
Откройте окно командной строки и перейдите к ObjectRefDemoJavaApp
папка, где вы скопировали OptimDemo.jar
.
Скомпилируйте PerformOptim.java
приложение и BananaFunction.java
класс помощника с помощью javac
.
Windows®
Скомпилировать BananaFunction.java
Ввод:
javac -classpath "matlabroot
\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar BananaFunction.java
PerformOptim.java
Ввод:javac -classpath "matlabroot
\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim.java
Unix®
Скомпилировать BananaFunction.java
Ввод:
javac -classpath "matlabroot
/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar BananaFunction.java
PerformOptim.java
Ввод:javac -classpath "matlabroot
/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar PerformOptim.java
Замените
с путем к вашему MATLAB или папке установки MATLAB Runtime. Например, на Windows, путем может быть matlabroot
C:\Program Files\MATLAB\R2021b
.
Запустите PerformOptim
приложение.
На Windows введите:
java -classpath .;"matlabroot
\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim -1.2 1.0
На Linux®Ввод:
java -classpath .:"matlabroot
/toolbox/javabuilder/jar/javabuilder.jar":.\OptimDemo.jar PerformOptim -1.2 1.0
Примечание
Если при запуске приложение на Mac 64-битная платформа, необходимо добавить -d64
отметьте в команде Java.
PerformOptim
программа отображает следующий вывод:
Using x0 = -1.2000 1.0000 ***************************************************** ** Properties of Java object ** ***************************************************** h = BananaFunction@1766806 className = BananaFunction Name Size Bytes Class Attributes h 1x1 BananaFunction Methods for class BananaFunction: BananaFunction getClass notifyAll equals hashCode toString evaluateFunction notify wait ** Finished DISPLAYOBJ ****************************** ***************************************************** ** Performing unconstrained nonlinear optimization ** ***************************************************** directEval = 24.2000 wrapperEval = 24.2000 x = 1.0000 1.0000 fval = 8.1777e-10 Optimization successful ** Finished DOOPTIM ********************************* Location of minimum: 1.0000 1.0000 Function value at minimum: 8.1777e-10
libraryCompiler
| compiler.build.javaPackage