Производное и как преобразовать его символическое выражение - PullRequest
1 голос
/ 20 сентября 2019

Мне нужно получить производную, чтобы использовать ее позже в численных расчетах.И мой код не работает вообще.Я пытался использовать lambdify, но ошибка «не могу конвертировать символы int».Я читаю другие ответы на подобные вопросы, но это все еще не работает.

import numpy as np
from scipy.integrate import odeint
from scipy.integrate import quad
from scipy.integrate import solve_bvp as bvp
import matplotlib.pyplot as plt
from scipy.special import genlaguerre as L
from scipy.special import gamma as G
from math import factorial
from math import sqrt
import sympy as sym
from sympy.utilities.lambdify import lambdify


mp = 938.2720813
mn = 939.5654133

mu = (mn + mp)/4

hbar = 197.3270533

h2m = hbar**2/(2*mu)

V0 = 20
Rv = 1.5

Q0 = 1.5
Rq = 4.5

EIm = 0.3
ERe = 1

V = lambda r : -V0*np.exp(-r/Rv)
Q = lambda r : -Q0*np.exp(-r/Rq)


chi = lambda r, l : sqrt(factorial(l)*beta**3/(G(3 + l))) * r * L(l,2)(beta * r) * np.exp(- beta * r / 2)

r, l, beta = sym.symbols('r, l, beta')

def chifD(r, l, beta):
    return sqrt(factorial(l)*beta**3/(G(3 + l))) * r * L(l,2)(beta * r) * np.exp(- beta * r / 2)

def chiD(r, l, beta):
    return sym.diff(chifD(r ,l, beta), r)

print(chiD(r, l, beta))

chiLambdified = lambdify(((r,l, beta),),chiD(r,l, beta),"numpy")

print(chiD(1, 1, 1))

1 Ответ

0 голосов
/ 20 сентября 2019

Я почти уверен, что вы смешиваете модули, которые вы не должны.Я продолжал изменять твою функцию ци, пока не получил что-то, что работает.Ничто, кроме удаления всех функций math и scipy, вернуло то, что не было TypeError.

# works with sympy sqrt.
chi = lambda r, l : sym.sqrt(l*r)
print(chi(r,l))

# doesn't work with math or numpy sqrt.
chi = lambda r, l : math.sqrt(l*r)
print(chi(r,l))

Если вы хотите использовать функции, вам придется использовать те, которые идутС помощью sympy определите свои собственные, используя базовые операторы (чтобы объекты sympy были приняты), или найдите более простые способы определения ваших операций: sqrt () можно просто заменить на ** (1/2).

ВозможноВы должны искать способ, который может заставить sympy принимать функции из других модулей, потому что написание всех специальных функций из Scipy само по себе похоже на боль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...