#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)