Цель этого примера состоит в том, чтобы показать вам как:
Используйте продукт MATLAB® Compiler SDK™, чтобы создать пакет, который применяет стандартные программы оптимизации MATLAB к целевым функциям, реализованным, когда Java® возражает.
Доступ к функциям MATLAB в приложении Java, включая использование класса MWJavaObjectRef
, чтобы создать ссылку на объект Java и передать его сгенерированным методам Java.
Для полной справочной информации об иерархии классов MWArray
смотрите пакет Javadoc com.mathworks.toolbox.javabuilder
в
.matlabroot/help/toolbox/javabuilder/MWArrayAPI
Создайте и запустите приложение.
Пакет OptimDemo
находит локальный минимум целевой функции и возвращает минимальное местоположение и значение.
Пакет использует функцию оптимизации MATLAB fminsearch
, и этот пример оптимизирует банановую функцию Розенброка, используемую в документации fminsearch
MATLAB.
Класс, Оптимизатор, выполняет неограниченную нелинейную оптимизацию на целевой функции, реализованной как объект Java.
Метод этого класса, doOptim
, принимает исходное предположение и объект Java, который реализует целевую функцию и возвращает местоположение и значение локального минимума.
Второй метод, displayObj
, является средством отладки, которое перечисляет характеристики объекта Java.
Эти два метода, doOptim
и displayObj
, инкапсулируют функции MATLAB. Код MATLAB для этих двух методов находится в doOptim.m
и displayObj.m
, который может быть найден в
.matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp
Запустите этот пример путем создания новой папки работы, которая видима к пути поиска файлов MATLAB. В этом примере мы будем использовать следующие папки:
Windows®: c:\matlab\work
Linux®: ~/matlab/work
Если вы уже не сделали так, установил переменные окружения, которые требуются на машине разработки. Для получения дополнительной информации смотрите, Конфигурируют Вашу Среду Java.
Скопируйте следующие файлы в папку work
:
Файл (файлы) | От | К |
---|---|---|
|
| Windows: Linux: |
|
| Windows: Linux: |
|
| Windows: Linux: |
Ваша папка work
должна теперь иметь следующие пять файлов:
c:\matlab\work
javabuilder.jar doOptim.m displayObj.m BananaFunction.java PerformOptim.java
Откройте MATLAB и cd
к папке work
, которую вы создали в необходимом как условие разделе.
Запишите код MATLAB, к которому вы хотите получить доступ из Java. Этот пример использует doOptim.m
и displayObj.m
, которые уже находятся в вашей папке work
.
Для ссылки код от doOptim.m
отображен здесь:
function [x,fval] = doOptim(h, x0)
directEval = h.evaluateFunction(x0)
wrapperEval = mWrapper(x0)
[x,fval] = fminsearch(mWrapper,x0)
displayObj.m
отображен здесь:function className = displayObj(h) h className = class(h) whos('h') methods(h)
В подсказке команды MATLAB введите libraryCompiler
, чтобы открыть приложение Library Compiler.
Используйте приложение Library Compiler, чтобы создать пакет Java из функций MATLAB doOptim.m
и displayObj.m
. Используйте следующие соглашения о присвоении имен для своего пакета:
Сохраните проект в своей папке work с помощью имени: | OptimDemo |
Имя библиотеки: | OptimDemo |
ClassName : | Optimizer |
Экспортируемые Функции (файлы, чтобы скомпилировать): | doOptim.m и displayObj.m |
Классы Java, созданные приложением Library Compiler, служат оберткой вокруг кода MATLAB.
Приложение Library Compiler создаст папку именем OptimDemo
в директории c:\matlab\work
. Папка OptimDemo
содержит следующие sub папки:
for_redistribution for_redistribution_files_only for_testing
Файлы, в которых вы будете нуждаться для остальной части примера, расположены в папке for_testing
.
Для получения дополнительной информации о работе с приложением Library Compiler смотрите, Генерируют Пакет Java и Сборку приложение Java.
Запишите исходный код для класса, который реализует объектную функцию, чтобы оптимизировать. Код для этого примера находится в файле BananaFunction.java
. Распечатку программ показывают здесь:
public class BananaFunction { public BananaFunction() {} public double evaluateFunction(double[] x) { /* Implements the Rosenbrock banana function described in * the FMINSEARCH documentation */ double term1 = 100*java.lang.Math.pow((x[1]-Math.pow(x[0],2.0)),2.0); double term2 = Math.pow((1-x[0]),2.0); return term1 + term2; } } |
Класс реализует банановую функцию Розенброка, описанную в документации fminsearch
MATLAB.
Запишите исходный код для приложения, это получает доступ к функциям MATLAB. Код для этого примера находится в файле PerformOptim.java
. Распечатку программ показывают здесь:
/* Necessary package imports */ import com.mathworks.toolbox.javabuilder.*; import OptimDemo.*; /* * Demonstrates the use of the MWJavaObjectRef class * Takes initial point for optimization as two arguments: * PerformOptim -1.2 1.0 */ class PerformOptim { public static void main(String[] args) { Optimizer theOptimizer = null; /* Stores component instance */ MWJavaObjectRef origRef = null; /* Java object reference to be passed to component */ MWJavaObjectRef outputRef = null; /* Output data extracted from result */ MWNumericArray x0 = null; /* Initial point for optimization */ MWNumericArray x = null; /* Location of minimal value */ MWNumericArray fval = null; /* Minimal function value */ Object[] result = null; /* Stores the result */ try { /* If no input, exit */ if (args.length < 2) { System.out.println("Error: must input initial x0_1 and x0_2 position"); return; } /* Instantiate a new Java object */ /* This should only be done once per application instance */ theOptimizer = new Optimizer(); try { /* Initial point --- parse data from text fields */ double[] x0Data = new double[2]; x0Data[0] = Double.valueOf(args[0]).doubleValue(); x0Data[1] = Double.valueOf(args[1]).doubleValue(); x0 = new MWNumericArray(x0Data, MWClassID.DOUBLE); System.out.println("Using x0 ="); System.out.println(x0); /* Create object reference to objective function object */ BananaFunction objectiveFunction = new BananaFunction(); origRef = new MWJavaObjectRef(objectiveFunction); /* Pass Java object to a MATLAB function that lists its methods, etc */ System.out.println("*********************************"); System.out.println("** Properties of Java object **"); System.out.println("*********************************"); result = theOptimizer.displayObj(1, origRef); MWArray.disposeArray(result); System.out.println("** Finished DISPLAYOBJ **********"); /* Call the Java component to optimize the function */ /* using the MATLAB function FMINSEARCH */ System.out.println("**********************************"); System.out.println("** Unconstrained nonlinear optim**"); System.out.println("**********************************"); result = theOptimizer.doOptim(2, origRef, x0); try { System.out.println("** Finished DOOPTIM ****** *********"); x = (MWNumericArray)result[0]; fval = (MWNumericArray)result[1]; /* Display the results of the optimization */ System.out.println("Location of minimum: "); System.out.println(x); System.out.println("Function value at minimum: "); System.out.println(fval.toString()); } finally { MWArray.disposeArray(result); } } finally { /* Free native resources */ MWArray.disposeArray(origRef); MWArray.disposeArray(outputRef); MWArray.disposeArray(x0); } } catch (Exception e) { System.out.println("Exception: " + e.toString()); } finally { /* Free native resources */ if (theOptimizer != null) theOptimizer.dispose(); } } } |
Программа выполняет следующее:
Инстанцирует объекта класса BananaFunction
выше, чтобы быть оптимизированным.
Создает MWJavaObjectRef
, который ссылается на объект BananaFunction
, как показано: origRef = new MWJavaObjectRef(objectiveFunction);
.
Инстанцирует объекта Optimizer.
Вызывает метод displayObj
, чтобы проверить, что объект Java передается правильно.
Вызывает метод doOptim
, который использует fminsearch
, чтобы найти локальный минимум целевой функции.
Использует блок try/catch
, чтобы обработать исключения.
Освобождает нативные ресурсы с помощью методов MWArray
.
Скомпилируйте приложение PerformOptim.java
и класс помощника BananaFunction.java
с помощью команды Java javac
. При вводе этой команды гарантируйте, что нет никаких пробелов между путями, разделенными точкой с запятой (;
).
Откройте Командную строку или Окно терминала и cd
к папке work
.
Скомпилируйте приложение, согласно которой операционной системе вы работаете:
Windows
Чтобы скомпилировать BananaFunction.java
, введите:
javac -classpath .; c:\matlab\work\javabuilder.jar; c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar BananaFunction.java
PerformOptim.java
, введите:javac -classpath .; c:\matlab\work\javabuilder.jar; c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar PerformOptim.java
Linux
Чтобы скомпилировать BananaFunction.java
, введите:
javac -classpath .: ~/matlab/work/javabuilder.jar: ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar BananaFunction.java
PerformOptim.java
, введите:javac -classpath .: ~/matlab/work/javabuilder.jar: ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar PerformOptim.java
Выполните файл класса PerformOptim
можно следующим образом:
На Windows введите:
java -classpath .; c:\matlab\work\javabuilder.jar; c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar PerformOptim -1.2 1.0
На Linux введите:
java -classpath .: ~/matlab/work/javabuilder.jar: ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar PerformOptim -1.2 1.0
Необходимо использовать ту же основную версию Java, который поставляется с MATLAB. Чтобы узнать, что запускает версия Java MATLAB, введите следующую команду MATLAB:
version -java
Если вы работаете на Mac 64-битная платформа, необходимо добавить флаг -d64
в команде Java. Смотрите Ограничения Цели MATLAB Compiler SDK 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