如何传递用于scipy的sympy表达式?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何传递用于scipy的sympy表达式?相关的知识,希望对你有一定的参考价值。

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

这是我尝试过的非常简化的版本。我用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,它将向此sme发送此TypeError:不支持的操作数/的类型:'int'和'list'

这些是与江淮的回溯

文件“”,第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中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”,行49sol = 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中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”,行49sol = root(f,Guess,jac = False)#Entrega el resultado

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

答案

提供的代码还给我一个错误:TypeError:_lambdifygenic()缺少1个必需的位置参数:'y1'。如y所建议,用y = DeferredVector('y')代替this post的声明解决了该问题。假设您使用的是最新版本的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

以上是关于如何传递用于scipy的sympy表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何用python进行符号求解?

Task1:动手学高等数学(sympy、scipy、matplotlib)

sympy 如何简化以变量为指数的表达式

使用 Sympy 生成 C 代码。将 Pow(x,2) 替换为 x*x

在 sympy 中,如何将函数表达式转换为运算符重载表达式?

sympy - 扩展时如何加法组合指数?