一个给定的方程取决于一个未知变量(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
和y
中均隐含的非线性函数。
我是否必须对grid
中的每个值执行循环,或者我仍然可以使用lambdify
?提前感谢!
2条答案
按热度按时间kx1ctssn1#
sympy.lambdify
的目的是将 * 符号 * 表达式转换为数值表达式。“lambdyfing”sympy.nsolve
没有意义,因为后者(默认)是一个数值函数。如果需要为sympy.nsolve
定义一个“wrapper”函数,应该使用标准的python方法。现在调用
f(xgrid)
,其中xfrid
是一个ndarray
,因为这个函数接受标量参数。你需要写一个循环。如果你觉得懒,你可以改用方便的np.vectorize
函数,它使一个函数为ndarrays
求值,即使它只为标量参数定义。然而,注意,这种方法本质上是循环的简写,即,它执行与您显式编写循环完全相同的计算。array([ -1., -4., -9., -16., -25.])
cgfeq70w2#
当
f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")
这一行被执行时,首先python执行sp.nsolve(x**2+y, y, 2)
。这是你的代码的问题,SymPy有一个方程需要解决,有两个未知数。