我无法理解以下数值评估。我有一个带有两个变量r
和gamma
的函数。现在,我希望将该函数的根作为从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")
尝试了此操作,但是它不起作用。任何帮助是极大的赞赏。
非常感谢!
最佳答案
nsolve本质上是用Python实现的算法,因此您不能对其进行“ lambdify”。
相反,只需为每个元素编写一个显式循环,调用nsolve。例如:
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和使用来自例如的非线性求解器卑鄙的
关于python - Sympy:使用lambdify评估一维数组上的表达式并在每个元素处返回根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24600850/