2017-03-12 2 views
5

J'ai un système d'équations comme suit:solution symbolique du système d'équations en utilisant sympy des solutions triviales en fonction des symboles

enter image description here

Ce système spécifique, je sais qu'une solution non triviale (s) existe seulement si p1 == p2, qui est

enter image description here.

Cependant, comment puis-je déterminer cela dans le cas général en utilisant Sympy?

Pour cet exemple, ma mise en œuvre est la suivante:

from sympy import Matrix, symbols, pprint, lcm, latex 
from sympy.solvers import solve_linear_system 

top_matrix = Matrix.zeros(8,7) 
p1 = symbols("p1") 
p2 = symbols("p2") 

top_matrix[0,0] = 1 
top_matrix[0,1] = -1 

top_matrix[1,1] = (1-p1) 
top_matrix[1,2] = -1 

top_matrix[2,2] = 1 
top_matrix[2,4] = p2-1 

top_matrix[3,1] = p1 
top_matrix[3,3] = -1 

top_matrix[4,3] = 1 
top_matrix[4,4] = -p2 

top_matrix[5,4] = 1 
top_matrix[5,5] = -1 

top_matrix[6,1] = -1 
top_matrix[6,6] = 1 

top_matrix[7,4] = -1 
top_matrix[7,6] = 1 

pprint(top_matrix) 
vars = symbols("a1, a2, a3, a4, a5, a6, a7, a8") 
print solve_linear_system(top_matrix, *vars) 

Le résultat est

None 

Si je mets

p2 = p1 

le résultat est

{a1: -1, a5: -1, a2: -1, a6: -1, a3: p1 - 1, a4: -p1} 

Existe-t-il un moyen de découvrir cette exigence automatiquement?

Répondre

3

Dans votre code d'exemple, solve_linear_system attend un système augmenté, c'est-à-dire que si le côté droit est zéro, la matrice doit être déclarée comme Matrix.zeros(8,8). Avec cette modification, votre code donne

{a3: 0, a1: 0, a5: 0, a7: 0, a6: 0, a2: 0, a4: 0} 

qui est en effet une solution, mais pas intéressant ...

Pour y remédier, on peut demander explicitement que devrait être normalisé un composant de la solution , par exemple, 1. donc, si vous faites quelque chose comme ce qui suit:

from sympy import Matrix, symbols, pprint, lcm, latex, solve 

top_matrix = Matrix.zeros(8,7) 
p1,p2 = symbols("p1, p2") 

top_matrix[0,0] = 1 
top_matrix[0,1] = -1 

top_matrix[1,1] = (1-p1) 
top_matrix[1,2] = -1 

top_matrix[2,2] = 1 
top_matrix[2,4] = p2-1 

top_matrix[3,1] = p1 
top_matrix[3,3] = -1 

top_matrix[4,3] = 1 
top_matrix[4,4] = -p2 

top_matrix[5,4] = 1 
top_matrix[5,5] = -1 

top_matrix[6,1] = -1 
top_matrix[6,6] = -1 

top_matrix[7,4] = 1 
top_matrix[7,6] = 1 

pprint(top_matrix) 

a1,a2,a3,a4,a5,a6,a7 = list(symbols("a1, a2, a3, a4, a5, a6, a7")) 

B = Matrix([[1],[a2],[a3],[a4],[a5],[a6],[a7]]) 

C = top_matrix * B 

print(solve(C, (a2,a3,a4,a5,a6,a7,p1,p2))) 

et résoudre les autres variables, ainsi que les paramètres p1,p2, le résultat est:

[{a2: 1, a7: -1, a4: p2, a6: 1, a5: 1, p1: p2, a3: -p2 + 1}] 

qui est en effet la solution désirée.

4

Il semble que des friandises sympy p1 et p2 comme non égaux, ce qui signifie que

top_matrix.nullspace() 

[]

qui est, le système homogeous avec des coefficients de la matrice top_matrix n'a pas non solution triviale.

Vous avez deux options, ici. La première consiste à traiter le système homogène comme ayant des variables inconnues à la fois les éléments du vecteur betp2, en traitant p1 comme un paramètre fixe.

b = sp.Matrix(sp.symbols('b1:8')) #import sympy as sp 
sp.solve(top_matrix*b, (*b,p2)) 
[{b1: 0, b2: 0, b3: 0, b4: 0, b5: 0, b6: 0, b7: 0}, 
{b1: b7, b2: b7, b3: b7*(-p1 + 1), b4: b7*p1, b5: b7, b6: b7, p2: p1}] 

Notez que le système a deux solutions. Le trivial (avec arbitraire p2), et un non-trivial, où il est p2==p1 (arbitraire b7).

La deuxième option consiste à réaliser que le système A*b=0 a une solution non triviale si le système A.T*A*b=0 a une solution non triviale. Ce dernier est possible si le déterminant de A.T*A est nul.Le facteur déterminant de A.T*A est égal à

(top_matrix.T * top_matrix).det().factor() 

6*(p1 - p2)**2

révélant immédiatement qu'il doit tenir p1==p2 afin d'avoir une solution non triviale.