Попытка написать динамический c решатель для N точек (центров).
nsolve
возвращает matrix is numerically singular
, в то время как scipy
возвращает Result from function call is not a proper array of floats
Я заметил, что Решатель scipy лучше в поиске решений, чем nsolve. Совместим ли scipy с sympy? Есть ли лучший способ создания переменных в Python (возможно, через global ())?
У меня такое ощущение, что Сципи не может оценивать символы симпии как переменные
from sympy import *
from scipy.optimize import fsolve
import random
#number of points
centers = 4
#get the right indices for the equations (e.g. Ax, Ay, Bx, By, etc.)
equations = []
for idx, i in enumerate(range(0, (centers-1)*2, 2)):
for y in range(2 + (idx*2), centers*2, 2):
equations.append([i, y, i+1, y+1])
#dynamically create variables using sympy.Symbol
vars_list = []
for i in range(0,centers*2):
vars_list.append(Symbol('x_'+str(i)))
globals()['x_'+str(i)] = None
#random initial solutions
random_inits = [random.random() for _ in range(0,centers*2)]
#Format: (Ax - Bx)**2 + (Ay - By)**2 - 0.2421875**2
equation_list = []
for item in equations:
equation_list.append((vars_list[item[0]] - vars_list[item[1]])**2 + (vars_list[item[2]] - vars_list[item[3]])**2 - random.random())
#dummy
for _ in range(0,2):
equation_list.append((vars_list[item[0]] - vars_list[item[1]])**2 + (vars_list[item[2]] - vars_list[item[3]])**2 - random.random())
#lists lengths match
print (len(equation_list), len(vars_list), len(random_inits))
print(nsolve(equation_list, vars_list, random_inits))
def equations(p):
vars_list = p
return equation_list
print(fsolve(equations, random_inits))