Цель этого примера состоит в том, чтобы показать вам как:
Используйте продукт 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