Sympy:使用lambdify在一维数组上求值并返回每个元素的根

2 投票
1 回答
724 浏览
提问于 2025-04-18 12:17

我在理解以下的数值计算时遇到了一些困难。我有一个包含两个变量的函数,分别是 rgamma。现在我想绘制这个函数的根(也就是函数等于零的地方)随着 gamma 从 0 到 500 的变化情况。我知道如何使用 lambdify 来在一维数组上评估一个变量的函数,但我不太明白如何让 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 个回答

2

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 创建一个表达式的回调,然后使用像 scipy 这样的非线性求解器。

撰写回答