Библиотеки для управления многомерными многочленами

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

Позволяет говорят, что мне дают три выражения: 2x^2, 3 года + 1, и 1z. Я затем должен умножить их вместе, которые дали бы мне 6x^2yz + 2x^2z. Затем я хотел бы найти частные производные этого выражения относительно x, y, и z. Это дало бы мне 12xyz + 4xz, 6x^2z, и 6x^2y + 2x^2.

Моя проблема имеет дело с выполнением простых манипуляций как это по выражениям, содержащим тысячи переменных, и мне нужен простой способ систематически делать это. Я действительно хотел бы использовать Python, так как у меня уже есть большая связанная с проектом функциональность, завершенная с помощью numpy/scipy/matplotlib, но если существует устойчивая панель инструментов там на другом языке, я открыт для использования этого также. Я провожу университетское исследование, таким образом, я открыт для использования Matlab также.

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

Спасибо!

Продолжите: Я провел несколько дней, работая с sympy, который оказался очень простым в использовании. Однако это было очень для замедления для размера проблемы, я продолжаю работать так, я теперь пойду, исследуют matlab. Для предоставления чрезвычайно грубой оценки скорости с помощью размера небольшой выборки потребовалось приблизительно 5 секунд для вычисления каждой из частных производных многочлена порядка 2 содержащий 250 переменных.

Развейте № 2: Я, вероятно, должен был сделать эту спину, когда я все еще работал над этой проблемой, но я мог бы также позволить всем знать, что matlab символьная библиотека была чрезвычайно сопоставима в скорости с sympy. Другими словами, это было жестоко медленно для больших вычислений. Обе библиотеки были удивительно легки работать с, таким образом, для маленьких вычислений я действительно настоятельно рекомендую также.

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

8
задан Spike 29 July 2010 в 22:36
поделиться

3 ответа

Sympy идеально подходит для этого: http://code.google.com/p/sympy/

Документация: http://docs.sympy.org/

Примеры различий из учебника: http://docs.sympy.org/tutorial.html#differentiation

import sympy

x, y, z = sympy.symbols('xyz')

p1 = 2*x*x
p2 = 3*y + 1
p3 = z

p4 = p1*p2*p3

print p4

print p4.diff(x)
print p4.diff(y)
print p4.diff(z)

Вывод:

2*z*x**2*(1 + 3*y)
4*x*z*(1 + 3*y)
6*z*x**2
2*x**2*(1 + 3*y)
9
ответ дан 5 December 2019 в 14:00
поделиться

Если вы используете MATLAB, то символический TB работает хорошо, ЕСЛИ он у вас есть. Если нет, то воспользуйтесь моим набором инструментов sympoly . Просто скачайте его с файлового обмена.

sympoly x y z
A = 2*x^2; B = 3*y + 1;C = 1*z;
gradient(A*B*C)

ans =
Sympoly array has size = [1  3]

Sympoly array element [1  1]
    4*x*z + 12*x*y*z
Sympoly array element [1  2]
    6*x^2*z
Sympoly array element [1  3]
    2*x^2 + 6*x^2*y

Обратите внимание, что это указывает на то, что вы допустили ошибку, дифференцируя результат по z в своем вопросе.

2
ответ дан 5 December 2019 в 14:00
поделиться

Matlab и другие упомянутые вами инструменты обычно выполняют численные вычисления. Вам следует рассмотреть возможность использования Mathematica или альтернативной системы компьютерной алгебры (CAS) для символьных вычислений. См. Ссылку в вики: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems для сравнения различных CAS.

1
ответ дан 5 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: