Этот пример показывает вам, как создать 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.javaPerformOptim.javaВвод:javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim.javaUnix®
Скомпилировать BananaFunction.javaВвод:
javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar BananaFunction.javaPerformOptim.javaВвод:javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar PerformOptim.java
Замените с путем к вашему MATLAB или папке установки MATLAB Runtime. Например, на Windows, путем может быть matlabrootC:\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