3

给定方程取决于未知变量 (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))

但是,我收到以下错误:“预期为一维数值函数”。我期待为 xgrid 中的每个值 x 收到一个 y=-x**2 的向量。

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

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

4

2 回答 2

3

的目的sympy.lambdify是将符号表达式转换为数字表达式。“lambdyfing”毫无意义sympy.nsolve,因为后者(默认情况下)是一个数值函数。如果你需要为你定义一个“包装器”函数,sympy.nsolve你应该使用标准的 python 方法来做到这一点。

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

现在调用f(xgrid), where xfridis anndarray没有意义,因为该函数接受标量参数。你需要写一个循环。如果你觉得懒惰,你可以改用方便的函数,即使它只为标量参数定义np.vectorize,它也会使函数计算。ndarrays但是,请注意,这种方法本质上是循环的简写,即,它执行的计算与您显式编写循环时完全相同。

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

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

于 2017-06-21T17:46:20.603 回答
2

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

于 2017-06-19T23:41:56.717 回答