Как использовать SymPy.core.add.Add в качестве значения для математического вычисления внутри функции Python

#python #function #sympy

#python #функция #sympy

Вопрос:

У меня есть функция, которую я перебираю с помощью массива значений. Затем я интегрирую его дважды, и мне нужно использовать значение этого второго интегрирования внутри другой функции.

 import numpy as np
import sympy 
from sympy.abc import a, x, y

#First function
def m1(x):
    mn = (-110   210*x   -113*x**2   141*x**3   -869*x**4   2980*x**5  
          -6150*x**6   7848*x**7   -6079*x**8   2626*x**9   -485*x**10)
    return mn

#Array of values 
dist = np.arange(0, 1.09, 0.01)
result_m1 = [] #Empty list to store results

#Iteration over array
for v in dist:
    result_m1.append(m1(v))

f1 = sympy.integrate(m1(x), x) #First symbolic integration
f2 = sympy.integrate(f1, x) #second symbolic integration

def d(x):
    df = (-1)*(f2)/(67e9*4.72537401e-9)
    return df

#Second iteration for another batch of results
result_d = []
for v in dist:
    result_d.append(d(v))
  

Всякий раз, когда я запускаю приведенный выше код, я получаю, что result_m1 — это список чисел (пригодных для использования), а result_d — это список выражений / символьных уравнений SymPy (непригодных для использования).
Мне нужно, чтобы f2 было символическим уравнением, поэтому в итоге я получу функцию, подобную функции m1 (ту, которую я могу повторять с массивом).

Комментарии:

1. Ваше описание результатов неясно. Это могло бы помочь, если бы вы показали некоторые результаты, а не просто рассказали о них (в противном случае нам пришлось бы запускать ваш код самостоятельно — ugg 🙂 ). Является dist единственным использованием numpy ? Совместное использование sympy и numpy часто приводит к проблемам, хотя здесь это может быть не так.

2. Я запустил ваш код и вижу проблему (но пока не решение). Я думаю, вы можете построить более простой пример. While x является аргументом вашей m1 функции и m1(y) или m1(0) показывает, что, d это не тот же тип функции. df не зависит от x аргумента

3. попробуйте использовать symlp.lambdify

4. @hpaulj, извините за то, что не показал некоторые результаты, это был список, повторяющий выражение mn 109 раз, так что было бы некрасиво показывать его здесь. Но я понял, что вы сказали о разнице в крестиках, приведенный ниже ответ сделал это за меня! Спасибо за помощь

Ответ №1:

Существует путаница между глобальной переменной sympy x и параметром x функций. Это не одно и то же. Лучше всего давать им отдельные названия, чтобы уменьшить путаницу. Затем вы заметите, что f2 используется символ x . Это может быть заменено значением параметра через f2.subs(x, xi) :

 import numpy as np
import sympy
from sympy.abc import a, x, y

#First function
def m1(xi):
    mn = (-110   210*xi   -113*xi**2   141*xi**3   -869*xi**4   2980*xi**5  
          -6150*xi**6   7848*xi**7   -6079*xi**8   2626*xi**9   -485*xi**10)
    return mn

#Array of values
dist = np.arange(0, 1.09, 0.01)
result_m1 = [] #Empty list to store results

#Iteration over array
for v in dist:
    result_m1.append(m1(v))

f1 = sympy.integrate(m1(x), x) #First symbolic integration
f2 = sympy.integrate(f1, x) #second symbolic integration

def d(xi):
    df = (-1)*(f2.subs(x, xi))/(67e9*4.72537401e-9)
    return df

#Second iteration for another batch of results
result_d = []
for v in dist:
    result_d.append(d(v))
  

Как отмечено в комментариях, lambdify() может использоваться для создания версии numpy, которая позволяет записывать вызовы, которые приносят пользу трансляции numpy:

 import numpy as np
import sympy
from sympy.abc import a, x, y

#First function
def m1(xi):
    mn = (-110   210*xi   -113*xi**2   141*xi**3   -869*xi**4   2980*xi**5  
          -6150*xi**6   7848*xi**7   -6079*xi**8   2626*xi**9   -485*xi**10)
    return mn

dist = np.arange(0, 1.09, 0.01)
m1_np = sympy.lambdify(x, m1(x))  # use lambdify to create a numpy version of function m1
result_m1 = m1_np(dist)

f1 = sympy.integrate(m1(x), x) #First symbolic integration
f2 = sympy.integrate(f1, x) #second symbolic integration

def d(xi):
    df = (-1)*(f2.subs(x, xi))/(67e9*4.72537401e-9)
    return df

d_np = sympy.lambdify(x, d(x))
result_d = d_np(dist)