Я должен написать некоторый код, который имеет дело с генерацией и управлением многовариантными многочленами. Я обрисую в общих чертах свою задачу с упрощенным примером.
Позволяет говорят, что мне дают три выражения: 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. Другими словами, это было жестоко медленно для больших вычислений. Обе библиотеки были удивительно легки работать с, таким образом, для маленьких вычислений я действительно настоятельно рекомендую также.
Для решения моей проблемы, я вычислил градиенты вручную, упростил их и затем использовал шаблоны, которые я нашел для твердого кодирования некоторых значений в моем коде. Это было большим количеством работы, но сделало мой код экспоненциально быстрее и наконец применимый.
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)
Если вы используете 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 в своем вопросе.
Matlab и другие упомянутые вами инструменты обычно выполняют численные вычисления. Вам следует рассмотреть возможность использования Mathematica или альтернативной системы компьютерной алгебры (CAS) для символьных вычислений. См. Ссылку в вики: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems для сравнения различных CAS.