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

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

Благодарность!

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

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

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

8
Spike 23 Июн 2010 в 01:58

3 ответа

Лучший ответ

Если вы используете 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 в вашем вопросе.

2
user85109user85109 23 Июн 2010 в 09:36