2013-05-08 2 views
7

Я знаю, что sympy в python может устанавливать предположения о переменных, таких как x является положительным, отрицательным, реальным, сложным и т. Д. Мне было интересно, может ли sympy установить предположения относительно переменных относительно к другим переменным. Например, если у меня есть переменные x и y, я могу установить sympy, чтобы предположить, что x> y в своих решениях. Или, альтернативно, если у меня есть две переменные, a и B, могу ли я установить sympy, чтобы предположить, что a + 2B < 1? Подобные предположения, возможно, помогли бы симпы упростить сложные решения для решения() и собственных векторов.Установка предположений на переменные в Sympy по отношению к другим переменным

Я просмотрел все и не нашел информации, относящейся к установке этих допущений в sympy.

Я спрашиваю, потому что я пытаюсь найти собственные векторы конкретной матрицы

a,b = symbols('a,b', nonnegative=False) 
M = Matrix([ [1-a-2*b, a, b, b], 
      [a, 1-a-2*b, b, b], 
      [b, b, 1-a-2*b, a], 
      [b, b, a, 1-a-2*b] ]) 

SymPy находит собственные правильно

M.eigenvals() 

который я подтверждено с помощью MATLAB и WolframAlpha, что все дают те же результаты. Тем не менее, собственные векторы беспорядок

M.eigenvects() 

MATLAB и WolframAlpha возвращают собственные векторы [1,1,1,1] [-1, -1,1,1] [0,0, -1,1 ] [-1,1,0,0], которые являются правильными собственными векторами. Я даже не пытался упростить результаты симпы, потому что они невероятно длинны и сложны. Я подозреваю, что это связано с предположениями о переменных, например, указав, что a + 2b < 1, но я не уверен.

ответ

9

мне было интересно ли этот пост в качестве комментария, но это слишком долго:

Короткий ответ: не в пригодном для использования способом.

Предполагаемая система SymPy является своего рода беспорядком прямо сейчас (версия 0.7.2, последняя по состоянию на май 2013 года). Существует вероятность того, что летом это улучшится из-за перспективного проекта GSoC, но пока это еще не ясно.

В SymPy фактически существуют две системы допущений. Старый, который добавляет предположения к самим символам (следовательно, создает проблемы с перестройкой деревьев выражений) и вызывается в конструкторе (например, Symbol(..., positive=True)), и есть новый, который основан на глобальных переменных для глобальных предположений и менеджеров контекста (with assume(...):) для местных.

Многие из функций в SymPy действительно проверяют старые предположения (например, Abs будет проверять, был ли задан аргумент ключевого слова positive), но все равно могут быть пропущены. Новая система предположений может быть более мощной, но почти не используется на данный момент (за исключением очень недавних подмодулей).

В старой системе предположений, что вы хотите, невозможно. В новой возможно, но, вероятно, еще не реализовано и не используется ни в каких частях SymPy.

Итак, у вас есть два варианта: помогите нам с системами допущений или помогите нам с матричным модулем. Оба могут использовать еще одну любовь.

+1

Здравствуйте, вы, кажется, знают много о предположении системы. Где можно узнать более практические советы о текущем состоянии из системы допущений в конце 2016 г. Sympy теперь находится в версии 1, и, похоже, все еще существуют две системы допущений, поскольку существуют предположения о допущениях и предположениях конструктора символов. Документация не объясняет, почему существуют еще две системы или даются указания знать, когда использовать тот или иной. – Shaun

+0

@Shaun, лучшим местом для запроса обновленных инструкций будет список рассылки sympy. – Krastanov

4

Предположения не вступают в игру здесь. Это обычно имеет значение только в том случае, если у вас квадратные корни, потому что sqrt(x**2) = x только если x >= 0.

Все, что вам нужно для этого, это упростить результат.Matrix.eigenvects имеет флаг simplify, но, по-видимому, он не упрощает результаты. Я открою для этого проблему. В то же время вы можете сделать это вручную. Обратите внимание, что Matrix.simplify актов в месте (если вам не нравится, что вы можете использовать Matrix.applyfunc(simplify)

>>> A = M.eigenvects() 
>>> A[0][2][0].simplify() 
>>> A[1][2][0].simplify() 
>>> pprint(A) 
⎡⎛1, 1, ⎡⎡1⎤⎤⎞, ⎛-4⋅b + 1, 1, ⎡⎡-1⎤⎤⎞, ⎛-2⋅a - 2⋅b + 1, 2, ⎡⎡-1⎤, ⎡0 ⎤⎤⎞⎤ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢-1⎥⎥⎟ ⎜     ⎢⎢1 ⎥ ⎢0 ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢1 ⎥⎥⎟ ⎜     ⎢⎢0 ⎥ ⎢-1⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎣⎝  ⎣⎣1⎦⎦⎠ ⎝    ⎣⎣1 ⎦⎦⎠ ⎝     ⎣⎣0 ⎦ ⎣1 ⎦⎦⎠⎦ 
+0

https://code.google.com/p/sympy/issues/detail?id= 3811 – asmeurer

+0

Ах, спасибо! решает, фактически решает ряд проблем, которые у меня были. Я столкнулся с проблемами с собственными векторами, содержащими квадратные корни, например, sqrt ((K-a) ** 2). Было бы неплохо указать предположение, что K> a, поэтому это упрощается как положительное. На основании вышеприведенного сообщения, похоже, пока это невозможно. – Nate

+1

Вы можете сделать это в некоторой степени с новыми предположениями. Попробуйте 'уточнить (expr, Q.позитив (K - a))'. – asmeurer

Смежные вопросы