Python - Sympy - 求解网格中多个参数的数值方程

Python - Sympy - Solving equations numerically for multiple parameters in a grid

一个给定的方程取决于一个未知变量 (y) 和一组参数。给定具有参数值的网格的每个元素,我想对 y 进行数值求解。

我尝试的解决方案的简化示例如下(y 是未知变量,x 是参数):

import numpy as np
import sympy as sp
x,y=sp.symbols('x y')
xgrid=np.arange(1,6)
f = sp.lambdify(x,sp.nsolve(x**2+y,y,2),"numpy")
print(f(xgrid))

但是,我收到以下错误:"expected a one-dimensional and numerical function"。对于 xgrid 中的每个值 x,我期望收到一个带有 y=-x**2 的向量。

请注意,实际感兴趣的函数不是示例中的 y=-x**2,而是隐含在 y 中的 x 中的非线性函数。

我是否被迫对网格中的每个值进行循环,或者我仍然可以以某种方式使用 lambdify?提前致谢!

f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")这一行执行时,首先python执行sp.nsolve(x**2+y, y, 2)。这是您代码上的问题,SymPy 有一个方程式需要用 2 个未知数求解。

sympy.lambdify的目的是将符号表达式转换为数值表达式。 "lambdyfing" sympy.nsolve 没有意义,因为后者(默认情况下)是一个数值函数。如果您需要为 sympy.nsolve 定义一个 "wrapper" 函数,您应该使用标准的 python 方法。

def f(x):
    y = sp.symbols('y')
    return float(sp.nsolve(x**2+y,y,2))

现在调用 f(xgrid),其中 xfrid 是一个 ndarray 没有任何意义,因为该函数接受标量参数。你需要写一个循环。如果您觉得懒惰,可以改用方便的 np.vectorize 函数,即使函数仅针对标量参数定义,它也会对 ndarrays 求值。但是,请注意,这种方法本质上是一个 shorthand 循环,即它执行的计算与您明确编写循环时完全相同。

f = np.vectorize(f)
f(xgrid)

array([ -1., -4., -9., -16., -25.])