Как вычислить неопределенный интеграл программно - PullRequest
15 голосов
/ 13 июля 2010

Я помню, как решал много неопределенных интеграционных задач. Существуют определенные стандартные методы их решения, но, тем не менее, существуют проблемы, для решения которых требуется комбинация подходов. Но как мы можем достичь решения программно.

Например, посмотрите на онлайн-приложение для интеграторов Mathematica. Итак, как мы подходим к написанию такой программы, которая принимает функцию в качестве аргумента и возвращает неопределенный интеграл функции.

wolfram mathematica online integrator

PS. Можно предположить, что входная функция является непрерывной (то есть не является, например, sin (x) / x).

Ответы [ 5 ]

19 голосов
/ 13 июля 2010

У вас есть Алгоритм Риша , который едва уловимо неразрешим (поскольку вы должны решить, равны ли два выражения, сродни вездесущей проблеме остановки), и действительно долго для реализации.Если разобраться в сложных вещах, то решение обыкновенного дифференциального уравнения на самом деле не сложнее (а вычисление неопределенного интеграла эквивалентно решению y '= f (x)).Существует дифференциальная теория Галуа, которая имитирует теорию Галуа для полиномиальных уравнений (но с группами Ли симметрий решений вместо конечных групп перестановок корней).Алгоритм Риша основан на нем.

6 голосов
/ 13 июля 2010

Алгоритм Риша, который вы ищете, - это алгоритм Риша:

http://en.wikipedia.org/wiki/Risch_algorithm

Я считаю, что использовать его немного сложно.Эта книга:

http://www.amazon.com/Algorithms-Computer-Algebra-Keith-Geddes/dp/0792392590

имеет описание этого.Описание на 100 страниц.

3 голосов
/ 13 июля 2010

Вы сохраняете набор базовых форм, с которыми вы знаете интегралы (полиномы, элементарные тригонометрические функции и т. Д.), И используете их в форме ввода. Это выполнимо, если вам не нужно много общего: очень легко написать программу, например, интегрирующую многочлены.

Если вы хотите сделать это в самом общем возможном случае, вам придется выполнять большую часть работы, которую выполняют системы компьютерной алгебры. Для некоторых людей это работа всей жизни, например, если вы посмотрите на «алгоритм» Риша , опубликованный в других ответах, или символическую интеграцию , вы увидите, что существуют целые многотомные книги («Мануэль Бронштейн, символическая интеграция» Том I : Springer "), который был написан по этой теме, и очень немногие из существующих систем компьютерной алгебры реализуют его в максимальной общности.

Если вы действительно хотите кодировать его самостоятельно, вы можете посмотреть исходный код Sage или несколько проектов, перечисленных среди его компонентов . Конечно, проще использовать одну из этих программ или, если вы пишете что-то большее, использовать одну из них в качестве библиотек.

1 голос
/ 13 июля 2010

Эти экспертные системы обычно имеют огромную коллекцию техник и просто пробуют одну за другой.

Я не уверен насчет WolframMath, но в Maple есть команда, которая позволяет отображать все промежуточные шаги. Если вы сделаете это, вы получите на выходе все опробованные методики.

Edit:

Преобразование ввода не должно быть действительно сложной задачей - вам нужно написать синтаксический анализатор и лексер , которые преобразуют текстовый ввод во внутреннее представление.

0 голосов
/ 13 июля 2010

Удачи.Mathematica - очень сложная часть программного обеспечения, и символические манипуляции это то, что она делает лучше всего.Если вам интересна тема, взгляните на эти книги:

http://www.amazon.com/Computer-Algebra-Symbolic-Computation-Elementary/dp/1568811586/ref=sr_1_3?ie=UTF8&s=books&qid=1279039619&sr=8-3-spell

Кроме того, обращение к источнику также не повредит.Эта книга на самом деле объясняет внутреннюю работу Mathematica

http://www.amazon.com/Mathematica-Book-Fourth-Stephen-Wolfram/dp/0521643147/ref=sr_1_7?ie=UTF8&s=books&qid=1279039687&sr=1-7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...