2017-06-19 42 views
1

给定方程取决于未知变量(y)和一组参数。我想用数值方法求解y,给出网格中每个元素的参数值。Python - Sympy - 数值求解网格中多个参数的方程

我尝试的解决方案的简化的例子如下(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中的y中。

我被迫做了一个在网格中的每个值的循环,或者我仍然可以使用lambdify莫名其妙吗?提前致谢!

回答

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.])

1

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

+0

谢谢!这是否意味着我被迫对网格中的每个值执行循环,或者我仍然可以使用lambdify? – CarlosH

+0

我会说可悲的循环 – glegoux

+0

谢谢。我编辑了这个问题,看看是否有人可以提出更有效的解决方案。如果从现在起一周内没有人回复,我会将您的问题标记为您解决。再次感谢。 – CarlosH