Sympy: использование lambdify для вычисления выражения по одномерному массиву и возврата root для каждого элемента

#python #sympy #mpmath

#python #sympy #mpmath

Вопрос:

У меня возникли проблемы со следующей числовой оценкой. У меня есть функция с двумя переменными, r и gamma . Теперь я хочу построить график корня этой функции как функции гаммы от 0 до 500. Я знаю, как использовать lambdify для вычисления функции по одномерному массиву переменной. Однако я не понимаю, как заставить sympy находить root функции для заданной переменной gamma, а затем переходить по многим значениям gamma от 0 до 500.

 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) in functionlambdify = sm.lambdify(gamma, sm.nsolve(function.subs(gamma,gamma),r, 0.1), "numpy") , но это не сработало.

Любая помощь приветствуется.

Большое спасибо!

Ответ №1:

nsolve — это, по сути, алгоритм, реализованный на Python, поэтому вы не можете его «лямбдировать». Вместо этого просто напишите явный цикл, вызывающий 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.