给定的等式取决于未知变量(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?提前谢谢!
答案 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)
,其中xfrid
是ndarray
没有任何意义,因为函数接受标量参数。你需要写一个循环。如果你感到懒惰,你可以使用方便的np.vectorize
函数,即使只为标量参数定义函数,它也会使函数计算ndarrays
。但是,请注意,这种方法本质上是循环的简写,即它执行与您明确编写循环时完全相同的计算。
f = np.vectorize(f)
f(xgrid)
array([ -1., -4., -9., -16., -25.])