Sympy:使用lambdify评估1d数组的表达式并返回每个元素的根

时间:2014-07-06 22:20:39

标签: python sympy mpmath

我无法理解下面的数值评估。我有一个包含两个变量rgamma的函数。我现在希望将该函数的根绘制为0到500的gamma函数。我知道如何使用lambdify来计算变量的1d数组上的函数。但是,我不明白如何让sympy找到给定变量gamma函数的根,然后跨越0到500之间的许多gamma值。

import numpy as np
import sympy as sm
import sympy.mpmath as mpmath
from sympy.interactive import printing
printing.init_printing(use_latex=True)

r, gamma = sm.symbols("r gamma")

function = -0.5+(sm.exp(-2*r**2)+sm.exp(-1-r**2*(4+sm.exp(-2*r**2*gamma)))*r**2*gamma)/(sm.exp(2*r**2)+r**2*gamma)  #the function with two variables
root_gammazero = sm.nsolve(function.subs(gamma,0),0.1) # this gives r = 0.416277

x_vector = np.linspace(0,500,1000)    #step through parameter gamma on x-axis

functionlambdify = sm.lambdify(gamma, sm.nsolve(function.subs(gamma,gamma),r, 0.1), "numpy") #find root for a given gamma and then return that root in the y_vector
y_vector = functionlambdify(x_vector)

如何将更改变量gamma传递给lambdify函数。在代码示例中,我在function.subs(gamma,gamma),r, 0.1)中使用functionlambdify = sm.lambdify(gamma, sm.nsolve(function.subs(gamma,gamma),r, 0.1), "numpy")尝试了此操作,但它不起作用。

非常感谢任何帮助。

非常感谢!

1 个答案:

答案 0 :(得分:2)

nsolve本质上是一个用Python实现的算法,所以你不能" lambdify"它。 相反,只需为每个元素编写一个显式循环调用nsolve。 e.g:

y_vector = np.empty(len(x_vector))
for i in range(len(x_vector)):
    y_vector[i] = sm.nsolve(function.subs(gamma,x_vector[i]), 0.1)

如果此解决方案对您来说太慢,您可以使用创建表达式的回调 lambdify并使用例如非线性求解器。 SciPy的。