символьные вычисления в C++

Мне нужно сделать аналитическую интеграцию в C++. Например, я должен интегрировать такие выражения: exp[I(x-y)], I — мнимое число.

Как я могу сделать это на С++?

Я попробовал GiNaC, но он может просто интегрировать полиномы. Я также попробовал SymbolicC++. Он может интегрировать такие функции, как sine, cosine или exp(x) и ln(x), но он не очень мощный. Например, он не может интегрировать x*ln(x), который можно легко получить с помощью Mathematica или путем интегрирования по частям.

Существуют ли какие-либо другие инструменты или библиотеки, способные выполнять символьные вычисления, такие как аналитическая интеграция в C++?


person MOON    schedule 04.07.2012    source источник
comment
Вы уже пробовали Maxima?   -  person jxh    schedule 04.07.2012
comment
использует Matlab вариант? Символический набор инструментов Matlab должен уметь делать это. Используя C Matlab Engine, вы можете вызвать его из своего кода C++?   -  person Philipp    schedule 04.07.2012
comment
У меня нет лицензии Matlab, поэтому я не могу ее использовать. Использует ли Maxima синтаксис C++? Я предпочитаю некоторую библиотеку на С++. если бы я хотел использовать другие программы, такие как maxima или Matlab, я бы использовал Mathematica. на самом деле я написал свою программу в математике. Это простая программа для разделения интегро-дифференциальных уравнений, но проблема в том, что Mathematica неэффективна с точки зрения времени, необходимого для вычислений. Поэтому я решил написать свою программу на C++.   -  person MOON    schedule 04.07.2012
comment
Несмотря на то, что наверное нет ничего подобного, как вы просите в качестве нативной библиотеки С++, ваш вопрос даже в принципе имеет много тонкостей. Начнем с того, что вы хотите интегрировать в первую очередь, вы должны иметь возможность определить такое выражение, это выражение времени выполнения (например, дерево выражений) или выражение времени компиляции ( например, а-ля Boost.Phoenix)? Какой результат вы хотите получить от вызываемой функции (время выполнения/компиляции)? Ваш вопрос очень актуален, проблема в том, что решение сначала должно решить эти тонкости.   -  person alfC    schedule 17.12.2013
comment
@alfC Есть ли какая-нибудь библиотека, позволяющая выполнять символьные вычисления во время выполнения?   -  person Tomilov Anatoliy    schedule 15.02.2014
comment
@Dukales, GiNaC, SymbolicC++ и libmatheval gnu.org/software/libmatheval . На мой взгляд, ни один из них не подходит.   -  person alfC    schedule 17.02.2014
comment
GiNaC может интегрировать sine, cosine и т. д. в новые версии.   -  person Isaac Pascual    schedule 10.08.2016


Ответы (3)


Если вам нужно выполнить символьную интеграцию, то вы, вероятно, не получите ничего быстрее, чем запустить его в mathematica или maxima - они уже написаны (что-то вроде) C++. Так что, если ваши уравнения не имеют очень специфических формул, которые вы можете использовать так, как Mathematica или Maxima не могут, то вам, вероятно, не повезло — и, по крайней мере, вы не получите такого рода нестандартных манипуляций от готовая библиотека.

Вы можете иметь право написать свой собственный код, чтобы получить прирост скорости, если вам нужно выполнять численные решения. (Я знаю, что делал это для создания численных решений УЧП).

person Michael Anderson    schedule 05.07.2012
comment
Мой код, написанный на Mathematica, находится по этой ссылке: mediafire.com/?cw9s3ne7jz8fq7s. отношение рекурсии. Я даю ему 0-й член, и он получает первый член, затем он использует первый член для получения второго и так далее. Для первых 4 семестров это занимает не так много времени, но для дальнейших семестров требуется много времени, и на самом деле я никогда не получал эти более высокие сроки. этот код должен решать интегро-дифференциальное уравнение, поэтому мне нужно получить много терминов. По крайней мере, я думаю, что 50 сроков необходимо. - person MOON; 05.07.2012
comment
Так как это занимает много времени в Mathematica, я решил написать это на С++ - person MOON; 05.07.2012
comment
Можете ли вы добавить изображение уравнения, я не могу открыть блокнот по математике (в эти дни у меня нет математики...) - person Michael Anderson; 05.07.2012

Другие известные мне библиотеки C++, выполняющие символьные вычисления,

Если не ошибаюсь, SymEngine пока не поддерживает интеграцию; однако у Пираньи есть. документация для Piranha в настоящее время несколько ограничена и находится в стадии разработки, но вы можете увидеть функцию интеграции здесь. Обратите внимание, что вторая ссылка использует синтаксис Python-оболочки Piranha. Однако Piranha «представляет собой библиотеку компьютерной алгебры для символьных манипуляций с разреженными многомерными полиномами и другими тесно связанными символическими объектами (такими как ряды Пуассона)», поэтому я не думаю, что она может интегрировать конкретные функции, которые могут вас заинтересовать. .

Хотя это не C++, вас также может заинтересовать SymPy для Python, который может выполнять некоторые из более сложных символьных интеграций, которые могут вас заинтересовать. Документация по интеграции SymPy находится здесь.

person Grayscale    schedule 20.07.2017

Пару дней назад я искал символьную математическую библиотеку, такую ​​​​как SymPy для C ++, потому что я был поражен ее скоростью по сравнению с Python или большинством других языков программирования.

Я нашел Vienna Math Library, потрясающую библиотеку с очень современным синтаксисом и лучшими функциями SymPy. моих знаний. Эта библиотека также имеет встроенную функцию, которую можно использовать для решения вашей задачи.

Этого было достаточно для решения ИК (обратной кинематики) шарнирного манипулятора с 3 степенями свободы.

person Mobin Vahdati    schedule 05.05.2020