Цель этого примера состоит в том, чтобы показать вам, как:
Используйте MATLAB® Compiler SDK™ продукт для создания пакета, который применяет стандартные программы оптимизации MATLAB к целевым функциям, реализованным как Java® объекты.
Доступ к функциям MATLAB в приложении Java, включая использование MWJavaObjectRef
класс, чтобы создать ссылку на объект Java и передать его сгенерированным методам Java.
Примечание
Полная справочная информация о MWArray
иерархия классов, см. com.mathworks.toolbox.javabuilder
Пакет Javadoc в
.matlabroot
/ help/toolbox/javabuilder/MWArrayAPI
Создайте и запустите приложение.
The OptimDemo
пакет находит локальный минимум целевой функции и возвращает минимальное местоположение и значение.
В пакете используется оптимизационная функция MATLAB fminsearch
и этот пример оптимизирует функцию банана Розенбрка, используемую в MATLAB fminsearch
документация.
Класс, Optimizer, выполняет нелинейную оптимизацию без ограничений на целевой функции, реализованной как объект Java.
Метод этого класса, doOptim
, принимает начальное предположение и объект Java, который реализует целевую функцию и возвращает местоположение и значение локального минимума.
Второй метод, displayObj
, - инструмент отладки, в котором перечислены характеристики объекта Java.
Два метода, doOptim
и displayObj
, инкапсулируйте функции MATLAB. Код MATLAB для этих двух методов в doOptim.m
и displayObj.m
, который можно найти в
.matlabroot
\ toolbox\javabuilder\Примеры\Object Ref Example\Object Ref Demo Comp
Начните этот пример, создав новую рабочую папку, которая видна по путь поиска файлов MATLAB. В этом примере мы будем использовать следующие папки:
Windows®: c:\matlab\work
Linux®: ~/matlab/work
Если вы еще не сделали этого, задайте переменные окружения, которые требуются на машине разработки. Дополнительные сведения см. в разделе Настройка окружении Java.
Скопируйте следующие файлы в work
папка:
Файлы (файлы ) | От | Кому |
---|---|---|
|
| Окна: Linux: |
|
| Окна: Linux: |
|
| Окна: 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 |
Имя класса: | Optimizer |
Экспортированные функции (файлы для компиляции): | doOptim.m и displayObj.m |
Классы Java, созданные приложением Library Compiler, служат оберткой вокруг кода MATLAB.
Приложение Library Compiler создаст папку по имени OptimDemo
в c:\matlab\work
директория. The OptimDemo
папка содержит следующие подпапки:
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; } } |
Класс реализует функцию банана Розенбрка, описанную в MATLAB fminsearch
документация.
Запись исходного кода для приложения, которое обращается к функциям 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
класс с помощью командной javac
Java. При вводе этой команды убедитесь, что между именами путей нет пространств, разделенных точкой с запятой (
;
).
Откройте окно Командная строка или Терминал и 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
Примечание
Если вы работаете на 64-битной платформе Mac, необходимо добавить -d64
флаг в команде Java. Дополнительные сведения см. в разделе Ограничения MATLAB Compiler SDK Java Target.
При успешном запуске 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