SymPy: nonlinsolve () не завершается - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть следующий класс модели

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()

Однако программа не завершается.Как я могу выяснить, что пошло не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...