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