Используем возможности Wolfram Mathematica в .NET приложениях

в 10:18, , рубрики: .net, mathematica, Wolfram, компьютерная алгебра, математика, Программирование, метки: , , ,

Есть люди, которым нравится писать .NET приложения. Есть люди, которые любят системы компьютерной алгебры. В этой статье круги Эйлера пересекутся!

Используем возможности Wolfram Mathematica в .NET приложениях

Вместо вступления

Для научной работы понадобились сложные математические расчёты и рисование красивых графиков. Логичнее всего, обратится к таким математическим пакетам, как Mathematica, Matlab или к их бесплатным аналогам. Что, впрочем, и было сделано. Но возникла потребность в отдельном исполняемом файле для презентабельности и удобного изменения входных параметров.

Используем возможности Wolfram Mathematica в .NET приложениях

Знаю, что у выше озвученных пакетов есть свои способы компиляции и разработки интерфейса, но была выбрана связка .NET + Wolfram.NETLink. Что же это за зверь такой?

Wolfram .NET/Link

У Wolfram есть протокол для обмена данными между Mathematica и другими программами — MathLink. .NET/Link прячет низкоуровневые детали этого процесса и позволяет программисту писать высокоуровневый код под .NET. Если кратко, то этот набор библиотек позволяет с помощью одной команды отправить какой-либо запрос ядру Mathematica и получить ответ с помощью другой. Можно писать и под сам MathLink, но уже на Си.
Конечно, есть у этого чуда и недостатки. Точнее один. Хотя сама библиотека занимает всего один файл (Wolfram.NETLink.dll), программа без предустановленной среды Wolfram Mathematica работать отказывается. Конечно, с помощью некоторого шаманства можно таскать с программой ядро Mathematica, но вряд ли это будет легально.

Реализация

Акей. Для начала возьмём что-нибудь простенькое для примера. Например, нахождение максимума квадратичной функции. А затем отобразим его на графике функции. В принципе, этого хватит, чтобы понять почти все, что нужно при работе с библиотекой .NET/Link. Итак, на языке Wolfram Mathematica это будет выглядеть так:

Используем возможности Wolfram Mathematica в .NET приложениях

Думаю, тут и без объяснений всё ясно. Теперь можно и к реализации приступить. Создадим новый проект в Visual Studio и добавим ссылку на библиотеку «Wolfram.NETLink.dll» (зависит от версии, у меня лежит в Mathematica8.0SystemFilesLinksNETLink):

Используем возможности Wolfram Mathematica в .NET приложениях

Добавим на панель инструментов компонент «MathKernel» из пространства имён Wolfram.NETLink:

Используем возможности Wolfram Mathematica в .NET приложениях

Если его не будет в списке, нужно так же указать ссылку на библиотеку (через «Обзор»).
Хорошо, теперь нам нужно разобраться с дизайном формы. Нам нужен pictureBox (отображение графика), textBox (вывод максимума) и button (для запуска вычислительных процессов):

Используем возможности Wolfram Mathematica в .NET приложениях

Так же необходимо не забыть добавить на форму компонент «MathKernel». По дефолту свойство «CaptureGraphics» этого компонента задано как false. Нам нужна графика, так что инвертируйте значения этого свойства.
Собственно, осталось только дать указания кнопке:

mathKernel1.Compute("f[x_] := -0.75 x^2 - 6*x + 7.5;");    //отправляем математическому ядру пищу для ума
mathKernel1.Compute("xm = x /. Last[FindMaximum[f[x], {x}]]");
textBox1.Text = mathKernel1.Result.ToString();    //возвращаем результат последнего вычисления

Хорошо, максимум функции мы определили. Далее, разберёмся с графикой:

pictureBox1.Image = null;    //готовим pictureBox1
mathKernel1.GraphicsHeight = pictureBox1.Height;    //и ядро для работы с ним
mathKernel1.GraphicsWidth = pictureBox1.Width;
mathKernel1.Compute("Plot[{f[x], f[xm]}, {x, -10, 10}, PlotRange -> Full]");    //рисуем график в ядре
if (mathKernel1.Graphics.Length > 0) pictureBox1.Image = mathKernel1.Graphics[0];    //и выводим графику на pictureBox1

Результат виден на следующем скриншоте:

Используем возможности Wolfram Mathematica в .NET приложениях

Быстро, просто и красиво.

Заключение

Думаю, .NET/Link может стать хорошим инструментом для магистров, аспирантов и прочих комрадов, занимающихся наукой. К сожалению, основные минусы — высокая цена Wolfram Mathematica и плохая портабельность — могут испортить всю картину.

P.S. Надеюсь, вам понравился мой первый пост. Буду рад ответить на вопросы. Если вас интересуют статьи о Wolfram Mathematica, пишите!

Автор: Kazemir


  1. Unika:

    Kazemir, отличная статья!!
    Не отображается MathKernel, поиск результатов не дает – я правильно поняла, что нужно подключить MathKernel.dll ???не могли бы вы написать полный путь к этому файлу???

  2. Unika:

    или ее нужно дополнительно скачивать???

  3. Unika:

    все, разобралась!!!все работает!!!!спасибо за статью!!!!!!!!!!!

  4. Shembolt:

    Kazemir, а вы можете опубликовать свой проект на C# для примера? Спасибо!

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js