Python - Sympy -在网格中为多个参数数值求解方程

6kkfgxo0  于 2022-11-19  发布在  Python
关注(0)|答案(2)|浏览(226)

一个给定的方程取决于一个未知变量(y)和一组参数。我想用数值方法求解y,给定网格的每个元素和参数值。
我尝试的解决方案的简化示例如下(y是未知变量,x是参数):

  1. import numpy as np
  2. import sympy as sp
  3. x,y=sp.symbols('x y')
  4. xgrid=np.arange(1,6)
  5. f = sp.lambdify(x,sp.nsolve(x**2+y,y,2),"numpy")
  6. print(f(xgrid))

但是,我收到以下错误:
应为一维数字函数。
对于xgrid中的每个值x,我希望收到一个带有y=-x**2的向量。
请注意,实际感兴趣的函数不是示例中的y=-x**2,而是xy中均隐含的非线性函数。
我是否必须对grid中的每个值执行循环,或者我仍然可以使用lambdify?提前感谢!

kx1ctssn

kx1ctssn1#

sympy.lambdify的目的是将 * 符号 * 表达式转换为数值表达式。“lambdyfing”sympy.nsolve没有意义,因为后者(默认)是一个数值函数。如果需要为sympy.nsolve定义一个“wrapper”函数,应该使用标准的python方法。

  1. def f(x):
  2. y = sp.symbols('y')
  3. return float(sp.nsolve(x**2+y,y,2))

现在调用f(xgrid),其中xfrid是一个ndarray,因为这个函数接受标量参数。你需要写一个循环。如果你觉得懒,你可以改用方便的np.vectorize函数,它使一个函数为ndarrays求值,即使它只为标量参数定义。然而,注意,这种方法本质上是循环的简写,即,它执行与您显式编写循环完全相同的计算。

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

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

cgfeq70w

cgfeq70w2#

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

相关问题