Python - Sympy - 以数字方式求解网格中多个参数的方程

时间:2017-06-19 22:33:55

标签: python python-3.x sympy equation-solving lambdify

给定的等式取决于未知变量(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,如示例中所示,而是一个非线性函数,隐含在y中的x中。

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

2 个答案:

答案 0 :(得分:1)

当这行f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")正在执行时,第一个python执行sp.nsolve(x**2+y, y, 2)。这是你的代码的问题,SymPy有一个方程式可以解决2个未知数。

答案 1 :(得分:1)

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),其中xfridndarray没有任何意义,因为函数接受标量参数。你需要写一个循环。如果你感到懒惰,你可以使用方便的np.vectorize函数,即使只为标量参数定义函数,它也会使函数计算ndarrays。但是,请注意,这种方法本质上是循环的简写,即它执行与您明确编写循环时完全相同的计算。

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

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

相关问题