Нелинейная система Dynami c Размер - PullRequest
0 голосов
/ 21 марта 2020

Попытка написать динамический 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))

1 Ответ

0 голосов
/ 21 марта 2020

Прежде чем беспокоиться о деталях реализации, взгляните на свои уравнения: ваши последние 3 являются дубликатами в терминах символов с разными константами ... это не даст решения:

>>> for i in equation_list[-3:]:print(i)
(x_4 - x_6)**2 + (x_5 - x_7)**2 - 0.447608387295936
(x_4 - x_6)**2 + (x_5 - x_7)**2 - 0.523866974100479
(x_4 - x_6)**2 + (x_5 - x_7)**2 - 0.915608644817872

Что такое Проблема, которую вы пытаетесь решить? Похоже на поиск пересечений между кругами, для которых даны 3 точки на каждом.

...