如何传递与 scipy 一起使用的 sympy 表达式?

How to pass sympy expressions to be used with scipy?

我想使用 scipy.optimize 中的 root 求解由循环创建的非线性方程组。我想用一种方法创建方程,然后用另一种方法求解。我用 sympy 创建了方程,并想用 scipy 求解它们。我的真实代码有太多循环,每次 root from scipy 迭代这些循环。

这是我尝试过的非常简化的版本。我用 sympy 符号制作了方程式,然后我使用 lambdifysympy 中取出方程式,但求解器向我发送了一个错误.

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,它会向我发送此 TypeError: unsupported operand type(s) for /: 'int' and 'list'

这些是 jac

的回溯

文件“”,第 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 行,在运行文件中 execfile(文件名,命名空间)

文件 "C:\Users\gian_\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py",第 110 行,在 execfile 中 执行(编译(f.read(),文件名,'exec'),命名空间)

文件 "C:/Users/gian_/Documents/Irri-trickle/speed/i.py",第 54 行,在 求解器()

文件 "C:/Users/gian_/Documents/Irri-trickle/speed/i.py",第 49 行,在求解器中 sol = root(f, Guess, method='krylov') # Entrega el resultado

TypeError: root() 得到了一个意外的关键字参数 'jac'

文件“”,第 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 行,在运行文件中 execfile(文件名,命名空间)

文件 "C:\Users\gian_\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py",第 110 行,在 execfile 中 执行(编译(f.read(),文件名,'exec'),命名空间)

文件 "C:/Users/gian_/Documents/Irri-trickle/speed/i.py",第 54 行,在 求解器()

文件 "C:/Users/gian_/Documents/Irri-trickle/speed/i.py",第 49 行,在求解器中 sol = root(f, Guess, jac = False) # Entrega el resultado

TypeError: root() 得到了一个意外的关键字参数 'jac'

提供的代码也给我一个错误:TypeError: _lambdifygenerated() missing 1 required positional argument: '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