Главная » Хабрахабр » Символьный калькулятор на C#

Символьный калькулятор на C#

Понадобилась мне как-то библиотека на c#, которая умеет делать символьные вычисления (время от времени дополняю возможностями одну математическую программу). Всякие исходники в сети найти можно и на разных языках, но вот что-то попроще и попонятнее найти не удавалось. Обратил внимание на Jasymca (Java Symbolic Calculator).

Задача

Для реализации аналога Mathcad'овского блока odesolve в программе SMath Studio понадобилось решать уравнения относительно производных. Каких-то особых ограничений на решаемую систему ОДУ нет. То, что задаёт пользователь в относительно произвольном виде должно преобразовываться к виду, удобному для численного решения ОДУ. Выглядеть это должно так:

Не помешала бы помощь символьного движка. Обойтись возможностями языка c# мне тут оказалось трудным в общем случае.

Конвертация исходников

Посмотрел на исходники апплета. Вроде не очень страшно, но нужен конвертер Java в c#. В то время, когда я этим только начал заниматься нашёлся один более менее рабочий онлайновый ресурс, который сейчас вспомнить не удалось. Похоже, что это был ресурс от Tangible Software Solutions, т.к. комментарии в исходниках похожи на те, которые делает их текущий конвертер в виде программы.
Всё хорошо, но одно плохо. Ресурс конвертировал бесплатно только ограниченный размер исходника. Правда ограничение на количество строк. Очень странно, подумал я, и слепил в каждом файле все содержимое в одну строку. Далее бесплатно преобразовал однострочные исходники в c# эквивалент и восстановил нормальный вид в Visual Studio при помощи автоматического форматирования.

Доработка напильником

Надо ли говорить, что автоматический конвертер преобразует по большей части форму, а вот с содержанием нужно ещё поработать. На тот момент я понял, что мне явно не хватает уровней в обоих языках, чтобы разрешить все проблемы компиляции. Время шло, почитывал Джона Скита. Товарищ Скит внушил решимости.

Он сделал почти всю нудную работу. В процессе борьбы за компилируемость добрым словом вспоминал конвертер. Касалось это большого класса JMath. Не осилил он только математическую часть в некоторых моментах. Int64BitsToDouble(), который не работает с некоторыми unsigned long константами, например -0 (0x8000000000000000). Преобразования double в hex представление и обратно упирались в некоторых случаях в ограничение для метода BitConverter. 0 / double. Тут опять пришёл на помощь товарищ Скит, не без помощи которого удалось представить это значение как 1. Вообще, эта арифметика «бесконечно малых» до сих пор не даёт мне покоя, т.к. NegativeInfinity. я не уверен в правильном интерпретировании всего того, что автор Jasymca имел в виду.

Давно хотел посмотреть на внутреннюю кухню подобных символьных программ. После исправления некоторых смысловых ошибок, замены работы с типами и их экземплярами и добавления консольного интерфейса удалось таки этот проект запустить. Порог вхождения гораздо ниже. Одно дело какой-нибудь Symbolic C++ и совсем другое — Java или C#.

На момент написания заметки выглядит калькулятор так:

Требуется . Исполняемый файл доступен в репозитории. 0. Net 2. Net 2. Есть зависимость от LinqBridge для работы Linq в . 0 (библиотека приложена там же).

Исключение составляет работа с графикой, т.е. Работает практически всё из документации автора Jasymca. Думаю, что проще будет написать эту часть заново, чем портировать. построение графиков функций. Также присутствуют глюки, которые будут со временем вычищаться. Не включены функции, зависящие от сторонних библиотек (LAPACK и пр.).

Заключение

Проект создавался для любителей символьной математики. При желании может быть приведён к библиотеке и использоваться в собственных проектах, где требуется несложная численная или символьная математика: работа с комплексными числами, интегрирование, дифференцирование, решение уравнений и пр. Автор Jasymca позиционировал программу как учебное пособие для тех, кто хочет создать свою программу, выполняющую символьные вычисления:

One of the main obstacles are pocket calculators, which prevent many students from using computers for math. Jasymca has been developed for teaching mathematics, especially to facilitate a fast and easy entrance to computer mathematics. Jasymca is free software and runs on almost any system equipped with a microprocessor: from mobile phones and pdas to windows/linux/macos computers, even on game consoles or internet routers. Pocket calculaters are cheap and portable, while CAS-programs are often expensive and always require at least a laptop to run.

Надеюсь, что c# вариант исходников будет полезен в чём-то и вам.

Ссылки

1. Jasymca (Java Symbolic Calculator).
2. Исходники Jasymca (zip).
3. Jasymca 2.0 — Symbolic Calculator for Java (Manual, pdf).
4. Обзор подобных Java библиотек.
5. Репозиторий проекта.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Профессиональная IoT-конференция InoThings++ — что было и что будет

Привет, Хабр! Практически ровно год назад — в конце января 2018-го — мы попробовали провести первую профессиональную конференцию для разработчиков устройств, систем и проектов «Интернета вещей» InoThings++ 2018. Помимо того, что она была первой для нас — если не считать ...

[Перевод] Изучаем Python: модуль argparse

Если вы занимаетесь обработкой и анализом данных с использованием Python, то вам, рано или поздно, придётся выйти за пределы Jupyter Notebook, преобразовав свой код в скрипты, которые можно запускать средствами командной строки. Здесь вам и пригодится модуль argparse. Для новичков, ...