Как создать Mathematica Notebook на Java? - PullRequest
3 голосов
/ 07 ноября 2011

Я ищу прототип "Hello World", которая создает файл Mathematica Notebook.

У меня есть эта рабочая программа.

 package graphica;

 import com.wolfram.jlink.*;

 /**
  *
  * @author Nilo
  */
public class MathematicaTester {

public static void main(String[] args) {

    KernelLink ml = null; 
    String jLinkDir = "C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\SystemFiles\\Links\\JLink";
    System.setProperty("com.wolfram.jlink.libdir", jLinkDir);

    try { 
        ml = MathLinkFactory.createKernelLink("-linkmode launch -linkname 'C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\MathKernel.exe'");

        ml.discardAnswer();
        String expr = "Sum[k^2,{k,1,11}]";
        ml.evaluate(expr);
        ml.waitForAnswer();
        String x = ml.getString();
        System.out.println("Result = " + x);

    } catch (MathLinkException e) { 
        System.out.println("Fatal error opening link: " + 
        e.getMessage()); 
        return; 
    }
}
}

При запуске я получаю следующее- ожидаемый - вывод.

запуск:
Результат = 506
СОЗДАТЬ УСПЕШНО (общее время: 2 секунды)

ВОПРОС:

Я хочу изменить эту программу, чтобы Mathematica Notebook была создана.Программа (в конце концов) добавит строку за строкой командных строк mma.Было бы хорошо, если бы одновременно запускался интерфейс Mathematica и чтобы код mma оценивался по запросу из Java-программы.Essential - это создание Блокнота, который позже может быть открыт интерфейсом mma.

Ответы [ 3 ]

6 голосов
/ 07 ноября 2011

Метод создания отформатированного файла блокнота показан здесь:

Как создать блокнот с правильно отформатированным выражением

Вы можете отформатировать код Mathematica в поле(mathCommand) с использованием вызова ядра, например

String mathCommand = "Plot[Sin[x], {x, 0, 6}]";
mathCommand = "FullForm[ToBoxes[Defer[" + mathCommand + "]]]";
MathKernel kernel = new MathKernel();
kernel.Compute(mathCommand);
mathCommand = kernel.Result.ToString();

Затем инкапсулируйте его следующим образом и сохраните с расширением .nb.

Notebook[{Cell[BoxData[
... ( inserted box-formatted output ) ...
], "Input"]
},
WindowSize->{615, 750},
WindowMargins->{{328, Automatic}, {Automatic, 76}},
StyleDefinitions->"Default.nb"
]
3 голосов
/ 07 ноября 2011

Записные книжки Mathematica представляют собой простые текстовые файлы со структурами, такими как

Notebook[{Cell[],Cell[]}]

. Вы можете получить необходимую структуру, просматривая их в текстовом редакторе.Предполагая, что вы можете заставить Java создать текстовый файл, сохранить его с окончанием имени .nb и вызвать версию Mathematica для командной строки, тогда то, что вы хотите, должно быть выполнимым.Возможно, вы захотите установить для ячеек ввода тип инициализации.

2 голосов
/ 26 ноября 2011

Потребовалось некоторое исследование, но мне удалось ответить на вопрос самостоятельно.

 package graphica;

 import com.wolfram.jlink.*;

 /**
  *
  * @author Nilo
  */
 public class MathematicaTester {

     public static void main(String[] args) {

         KernelLink ml = null; 
         String jLinkDir = "C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\    \SystemFiles\\Links\\JLink";
         System.setProperty("com.wolfram.jlink.libdir", jLinkDir);

         try { 
             ml = MathLinkFactory.createKernelLink("-linkmode launch -linkname 'C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\MathKernel.exe'");
        //test-1
             ml.discardAnswer();
             String expr = "Sum[k,{k,1,11}]";
             ml.evaluate(expr);
             ml.waitForAnswer();
             String x = ml.getString();
             System.out.println("Result = " + x);
       //test-2
             expr = "UsingFrontEnd[nb=NotebookPut[Notebook[{Cell[\"Graphics3D[Cuboid[]]\", \"Input\"]}]]]";
             System.out.println("Result = " + ml.evaluateToOutputForm(expr, 40) );
             expr = "UsingFrontEnd[NotebookSave[nb,\"TERRANOVA1\"]]";
             System.out.println("Result = " + ml.evaluateToOutputForm(expr, 40) );

         } catch (MathLinkException e) { 
             System.out.println("Fatal error opening link: " + 
             e.getMessage()); 
             return; 
         }
     }
 }
...