Как передать выражения sympy для использования со scipy? - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу решить систему нелинейных уравнений, созданных циклами, используя root из scipy.optimize. Я хочу создать уравнения одним методом, а затем решить их другим. Я создал уравнения с sympy и хочу решить их с помощью scipy. В моем реальном коде слишком много циклов, и каждый раз root от scipy повторяет эти циклы.

Это очень упрощенная версия того, что я пробовал. Я сделал уравнения с sympy символами, а затем я использовал lambdify, чтобы вывести уравнения из sympy , но решатель отправляет мне ошибку.

from scipy.optimize import root
from sympy import Symbol, lambdify

y = [Symbol('x%d' % i) for i in range(2)]

def ecuacion():

    global c,cakeo,mellado

    c = []
    cakeo = y[0] +1 + y[1]
    c.append(cakeo)
    mellado = y[1] + 4 + -y[0]
    c.append(mellado)
    print(c)
    return c

ecuacion()

f = lambdify(y, c, 'numpy')

def solver():

    Guess = [1,-1]
    sol = root(f, Guess,method='hybr', jac=False) # Entrega el resultado       
    print(sol.x)
    return sol

solver()

Он посылает мне эту ошибку TypeError: root () получил неожиданный аргумент ключевого слова 'jac'. Если я удаляю jac, он отправляет smeme TypeError: неподдерживаемый операнд тип (ы) для /: 'int'and' list '

это трассировки с jac

File "", строка 1, в runfile (' C: / Users / gian_ /Documents / Irri-trickle / speed / i.py ', wdir =' C: / Users / gian_ / Documents / Irri-trickle / speed ')

Файл "C: \ Users \ gian_ \ Anaconda3 \ lib\ site-packages \ spyder_kernels \ customize \ spydercustomize.py ", строка 827, в исполняемом файле исполняемого файла (имя файла, пространство имен)

Файл" C: \ Users \ gian_ \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ "customize \ spydercustomize.py ", строка 110, в execfile exec (compile (f.read (), filename, 'exec'), пространство имен)

Файл" C: / Users / gian_ / Documents / Irri-струйка / скорость / i.py ", строка 54, яn solver ()

Файл "C: /Users/gian_/Documents/Irri-trickle/speed/i.py", строка 49, в solver sol = root (f, думаю, method = 'krylov') # Entrega el resultado

TypeError: root () получил неожиданный аргумент ключевого слова 'jac'

File "", строка 1, в runfile ('C: / Users / gian_ / Documents /Irri-trickle / speed / i.py ', wdir =' C: / Users / gian_ / Documents / Irri-trickle / speed ')

Файл "C: \ Users \ gian_ \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py ", строка 827, в исполняемом файле исполняемого файла (имя файла, пространство имен)

Файл" C: \ Users \ gian_ \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \spydercustomize.py ", строка 110, в execfile exec (compile (f.read (), имя файла, 'exec'), пространство имен)

Файл" C: / Users / gian_ / Documents / Irri-trickle /speed / i.py ", строка 54, в solver ()

Файл" C: /Users/gian_/Documents/Irri-trickle/speed/i.py ", строка 49, в solver sol = root(f, думаю, jac = False) # Entrega el resultado

Ошибка типа: root () получил неожиданный ключyword аргумент 'jac'

1 Ответ

1 голос
/ 08 ноября 2019

Предоставленный код также дал мне ошибку: Ошибка типа: _lambdifygenerated () отсутствует 1 обязательный позиционный аргумент: 'y1' . Замена объявления y на y = DeferredVector('y') решила проблему, как предложено в этого поста . Предположим, вы используете последние версии sympy и scipy.

Я не понимаю странного сообщения об ошибке jac, поскольку вы ввели его просто отлично. Может быть, вы случайно используете root из другого пакета?

Попробуйте импортировать его с однозначным именем, как в:

from scipy.optimize import root as scipy_root
from sympy import Symbol, lambdify, DeferredVector

y = DeferredVector('y')
...

def solver():
    guess = [1,-1]
    sol = scipy_root(f, guess, method='hybr', jac=False) # Entrega el resultado
    print(sol.x)
    return sol
...