Есть люди, которым нравится писать .NET приложения. Есть люди, которые любят системы компьютерной алгебры. В этой статье круги Эйлера пересекутся!
Вместо вступления
Для научной работы понадобились сложные математические расчёты и рисование красивых графиков. Логичнее всего, обратится к таким математическим пакетам, как Mathematica, Matlab или к их бесплатным аналогам. Что, впрочем, и было сделано. Но возникла потребность в отдельном исполняемом файле для презентабельности и удобного изменения входных параметров.
Знаю, что у выше озвученных пакетов есть свои способы компиляции и разработки интерфейса, но была выбрана связка .NET + Wolfram.NETLink. Что же это за зверь такой?
Wolfram .NET/Link
У Wolfram есть протокол для обмена данными между Mathematica и другими программами — MathLink. .NET/Link прячет низкоуровневые детали этого процесса и позволяет программисту писать высокоуровневый код под .NET. Если кратко, то этот набор библиотек позволяет с помощью одной команды отправить какой-либо запрос ядру Mathematica и получить ответ с помощью другой. Можно писать и под сам MathLink, но уже на Си.
Конечно, есть у этого чуда и недостатки. Точнее один. Хотя сама библиотека занимает всего один файл (Wolfram.NETLink.dll), программа без предустановленной среды Wolfram Mathematica работать отказывается. Конечно, с помощью некоторого шаманства можно таскать с программой ядро Mathematica, но вряд ли это будет легально.
Реализация
Акей. Для начала возьмём что-нибудь простенькое для примера. Например, нахождение максимума квадратичной функции. А затем отобразим его на графике функции. В принципе, этого хватит, чтобы понять почти все, что нужно при работе с библиотекой .NET/Link. Итак, на языке Wolfram Mathematica это будет выглядеть так:
Думаю, тут и без объяснений всё ясно. Теперь можно и к реализации приступить. Создадим новый проект в Visual Studio и добавим ссылку на библиотеку «Wolfram.NETLink.dll» (зависит от версии, у меня лежит в Mathematica8.0SystemFilesLinksNETLink):
Добавим на панель инструментов компонент «MathKernel» из пространства имён Wolfram.NETLink:
Если его не будет в списке, нужно так же указать ссылку на библиотеку (через «Обзор»).
Хорошо, теперь нам нужно разобраться с дизайном формы. Нам нужен pictureBox (отображение графика), textBox (вывод максимума) и button (для запуска вычислительных процессов):
Так же необходимо не забыть добавить на форму компонент «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
Результат виден на следующем скриншоте:
Быстро, просто и красиво.
Заключение
Думаю, .NET/Link может стать хорошим инструментом для магистров, аспирантов и прочих комрадов, занимающихся наукой. К сожалению, основные минусы — высокая цена Wolfram Mathematica и плохая портабельность — могут испортить всю картину.
P.S. Надеюсь, вам понравился мой первый пост. Буду рад ответить на вопросы. Если вас интересуют статьи о Wolfram Mathematica, пишите!
Автор: Kazemir
Kazemir, отличная статья!!
Не отображается MathKernel, поиск результатов не дает – я правильно поняла, что нужно подключить MathKernel.dll ???не могли бы вы написать полный путь к этому файлу???
или ее нужно дополнительно скачивать???
все, разобралась!!!все работает!!!!спасибо за статью!!!!!!!!!!!
Kazemir, а вы можете опубликовать свой проект на C# для примера? Спасибо!