Библиотеки для работы с многомерными полиномами - PullRequest
7 голосов
/ 23 июня 2010

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

Допустим, мне дано три выражения: 2x ^ 2, 3y + 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?

Спасибо!

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

Follow # 2: Возможно, мне следовало бы сделать это еще тогда, когда я еще работал над этой проблемой, но я мог бы также сообщить всем, что символьная библиотека matlab была чрезвычайно сопоставима вскорость к симпати.Другими словами, это было очень медленно для больших вычислений.С обеими библиотеками было удивительно легко работать, поэтому для небольших вычислений я настоятельно рекомендую либо.

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

Ответы [ 3 ]

9 голосов
/ 23 июня 2010

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)
2 голосов
/ 23 июня 2010

Если вы используете MATLAB, то символический ТБ работает хорошо, ЕСЛИ он у вас есть. Если нет, то используйте мой 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 в вашем вопросе.

1 голос
/ 23 июня 2010

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

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