У меня есть следующий класс модели
import sympy as sp
import numpy as np;
from sympy.solvers.solveset import nonlinsolve
from math import sqrt
class general_equation_solver:
def __init__(self,q):
self.q = q
self.n = len(q)
self.numrows = 2*self.n
k,self.ids = 0,{}
for i in range(self.n):
for j in range(self.n):
self.ids[(i,j)] = k
k += 1
self.num_dummy = self.n
self.numcols = self.n*self.n+self.num_dummy
self.numvars = self.numcols
self.x = sp.symbols('x0:{}'.format(self.numvars))
self.equations = [x for x in range(self.numrows)]
for i in range(self.n):
s = ''
for j in range(self.n):
if s != '':
s += '+'
s += '{0}**2*{1}'.format(self.x[self.ids[(i,j)]],self.q[j])
s += '-{0}**2-{1}'.format(self.x[self.n**2+i],self.q[i])
self.equations[i] = sp.sympify(s)
for j in range(self.n):
s = ''
for i in range(self.n):
if s != '':
s += '+'
s += '{0}**2'.format(self.x[self.ids[(i,j)]])
s += '-1'
self.equations[self.n+j] = sp.sympify(s)
print(self.equations)
def solve(self):
solution = nonlinsolve(self.equations,self.x)
alpha = np.zeros((self.n,self.n))
for i in range(self.n):
for j in range(self.n):
alpha[i,j] = sqrt(solution[0][self.ids[(i,j)]])
dummies = []
for i in range(self.n):
dummies.append(sqrt(solution[0][self.n*self.n+i]))
return (dummies,alpha)
для решения, по сути, системы линейных уравнений, но с ограничением, что каждая переменная неотрицательна.Вот почему я смоделировал все это с помощью подстановок x' := x^2
.Следовательно, использование nonlinsolve()
.Я вызываю вышеуказанный код с main
:
if __name__ == '__main__':
q = [0.0005,0.0001,0.0007]
ex = general_equation_solver.general_equation_solver(q)
print("Launching...")
(dummy,alpha) = ex.solve()
Однако программа не завершается.Как я могу выяснить, что пошло не так?