Цель этого примера - показать, как:
Продукт MATLAB ® Compiler SDK™ используется для создания пакета, который применяет процедуры оптимизации MATLAB к объективным функциям, реализованным в виде объектов Java ®.
Доступ к функциям MATLAB в приложении Java, включая использование MWJavaObjectRef для создания ссылки на объект Java и передачи ее созданным методам Java.
Примечание
Для получения полной справочной информации о MWArray иерархия классов, см. com.mathworks.toolbox.javabuilder Пакет Javadoc в .matlabroot/help/toolbox/javabuilder/MWArrayAPI
Создайте и запустите приложение.
OptimDemo пакет находит локальный минимум целевой функции и возвращает минимальное местоположение и значение.
Пакет использует функцию оптимизации MATLAB. fminsearch, и этот пример оптимизирует функцию банана Розенброка, используемую в MATLAB fminsearch документация.
Класс Optimizer выполняет неограниченную нелинейную оптимизацию целевой функции, реализованной как объект 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 папка:
| Файлы | От | Кому |
|---|---|---|
|
| Окна: 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 , чтобы открыть приложение Компилятор библиотеки.
Используйте приложение компилятора библиотеки для создания пакета Java из функций MATLAB doOptim.m и displayObj.m. Используйте следующие соглашения по присвоению имен для пакета:
Сохранение проекта в work с использованием имени: | OptimDemo |
| Имя библиотеки: | OptimDemo |
| Имя класса: | Optimizer |
| Экспортированные функции (файлы для компиляции): | doOptim.m и displayObj.m |
Классы Java, созданные приложением Library Compiler, служат оболочкой кода MATLAB.
Приложение компилятора библиотеки создаст папку по имени OptimDemo в c:\matlab\work каталог. OptimDemo содержит следующие подпапки:
for_redistribution for_redistribution_files_only for_testing
Файлы, которые потребуются для остального примера, находятся в for_testing папка.
Дополнительные сведения о работе с приложением компилятора библиотеки см. в разделах Создание пакета 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 helper class с помощью команды 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
Примечание
При работе на 64-разрядной платформе Mac необходимо добавить -d64 в команде Java. Более подробную информацию см. в разделе Ограничения целевого пакета SDK Java компилятора MATLAB.
При успешном запуске 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