Python - Sympy - 求解网格中多个参数的数值方程
Python - Sympy - Solving equations numerically for multiple parameters in a grid
一个给定的方程取决于一个未知变量 (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))
但是,我收到以下错误:"expected a one-dimensional and numerical function"。对于 xgrid 中的每个值 x,我期望收到一个带有 y=-x**2 的向量。
请注意,实际感兴趣的函数不是示例中的 y=-x**2,而是隐含在 y 中的 x 中的非线性函数。
我是否被迫对网格中的每个值进行循环,或者我仍然可以以某种方式使用 lambdify?提前致谢!
当f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")
这一行执行时,首先python执行sp.nsolve(x**2+y, y, 2)
。这是您代码上的问题,SymPy 有一个方程式需要用 2 个未知数求解。
sympy.lambdify
的目的是将符号表达式转换为数值表达式。 "lambdyfing" sympy.nsolve
没有意义,因为后者(默认情况下)是一个数值函数。如果您需要为 sympy.nsolve
定义一个 "wrapper" 函数,您应该使用标准的 python 方法。
def f(x):
y = sp.symbols('y')
return float(sp.nsolve(x**2+y,y,2))
现在调用 f(xgrid)
,其中 xfrid
是一个 ndarray
没有任何意义,因为该函数接受标量参数。你需要写一个循环。如果您觉得懒惰,可以改用方便的 np.vectorize
函数,即使函数仅针对标量参数定义,它也会对 ndarrays
求值。但是,请注意,这种方法本质上是一个 shorthand 循环,即它执行的计算与您明确编写循环时完全相同。
f = np.vectorize(f)
f(xgrid)
array([ -1., -4., -9., -16., -25.])
一个给定的方程取决于一个未知变量 (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))
但是,我收到以下错误:"expected a one-dimensional and numerical function"。对于 xgrid 中的每个值 x,我期望收到一个带有 y=-x**2 的向量。
请注意,实际感兴趣的函数不是示例中的 y=-x**2,而是隐含在 y 中的 x 中的非线性函数。
我是否被迫对网格中的每个值进行循环,或者我仍然可以以某种方式使用 lambdify?提前致谢!
当f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")
这一行执行时,首先python执行sp.nsolve(x**2+y, y, 2)
。这是您代码上的问题,SymPy 有一个方程式需要用 2 个未知数求解。
sympy.lambdify
的目的是将符号表达式转换为数值表达式。 "lambdyfing" sympy.nsolve
没有意义,因为后者(默认情况下)是一个数值函数。如果您需要为 sympy.nsolve
定义一个 "wrapper" 函数,您应该使用标准的 python 方法。
def f(x):
y = sp.symbols('y')
return float(sp.nsolve(x**2+y,y,2))
现在调用 f(xgrid)
,其中 xfrid
是一个 ndarray
没有任何意义,因为该函数接受标量参数。你需要写一个循环。如果您觉得懒惰,可以改用方便的 np.vectorize
函数,即使函数仅针对标量参数定义,它也会对 ndarrays
求值。但是,请注意,这种方法本质上是一个 shorthand 循环,即它执行的计算与您明确编写循环时完全相同。
f = np.vectorize(f)
f(xgrid)
array([ -1., -4., -9., -16., -25.])