2017-01-08 4 views
2

В настоящее время я делаю программу, которая включает в себя исправление. Единственным модулем, который может выполнять сложную интеграцию, является Scipy с его командой scipy.integrate.quad(). Однако в моем коде мне нужно иметь переменную, которая представляет собой функцию, так как в конечном итоге в процессе выпрямления будут выполняться более разные функции, которые производятся с использованием предыдущего уравнения. Каждый источник, который я видел о команде, либо включает лямбда, либо создает определение, которое выводит уравнение. Вы введите вручную. Итак, мой вопрос: есть ли способ интегрировать его, не делая этого? Вот мой код:scipy.integrate.quad() без использования lambda

import scipy             
import sympy 
from scipy.integrate import quad 

def rectify(smallestterm, nextsmallestterm, poly, coef, exp): 
    test = rectification(coef,exp) 
    a = quad(test, smallestterm, nextsmallestterm) 
    print(a) 
    a = a[0] 
    dist = a/2 
    return dist  
def test(x): 
    return rectification(coef, exp) 
def rectification(coef, exp): 
    u = Poly(lint(coef,exp)) #Generated Equation 
    b = u.all_coeffs() 
    poly = b 
    c = len(poly) - 1 
    exponents = [] 
    while c + 1 > 0: 
     exponents.append(c) 
     c = c - 1 
    poly = function(poly,exponents) #Generated Equation in a form that can actually be used and identified as a function. 
    return sqrt(1+(pow(diff(poly),2))) 

Где coef список ведущих коэффициентов полинома и exp список ведущих индексов многочлена. По сути, они оба будут косвенно объединены в другом определении, function(coef, exp) (код для него не показан), который выводит многочлен (переменная «poly»).

т.е.

function([2,4,5],[1,6,0]) Выходы

4 * х ** 6 + 2 * х + 5

Этот код (выше кода функции) не работает, как это Безразлично 't позвольте мне использовать переменную «a» для представления целой функции, поскольку она только распознает «a» как функцию сама по себе. Итак, лямбда не работает в моем случае. Я не могу просто сделать что-то вроде:

import scipy 
import sympy 
from scipy.integrate import quad 
poly = 2*x**5 + 5*x**4 - 4*x**2 + 10 #Some complicated polynomial 
d = diff(poly) #differential of polynomial 
a = sqrt(1+(pow(d,2))) 
e = quad(a, 1, 5) 
e = e[1]/2 
return e 

Если вам нужно, чтобы увидеть мой полный код, чтобы понять, какие другие функции в этом коде, пожалуйста, спросите, и я счастливо обеспечить его!

+3

Фактически, это, вероятно, поможет показать _less_ код. Уменьшите образец кода до [минимального полного примера] (https://stackoverflow.com/help/mcve), необходимого для демонстрации проблемы; например, вы могли бы использовать более простую математическую функцию и не вводить класс 'Poly' (который вы даже не определяете здесь), и вы также можете удалить кучу' print', и вы можете удалить неиспользуемые ' симпы' импорт. Кроме того, несмотря на все это объяснение, я до сих пор не понимаю, почему вы не хотите использовать лямбда-функцию? (Ссылка на полный код по-прежнему будет полезна.) –

+0

@DavidZ Сделаем! Вот проблема с использованием лямбда-функции: в моем коде я хочу дать программе ввод, чтобы он вывел уравнение из него, а затем интегрировал уравнение. Это уравнение отнюдь не легко получить вручную, поэтому я хочу получить уравнение из кода (lint (coef, exp)). Поскольку у меня будет несколько уравнений, я буду устанавливать каждое новое уравнение некоторой переменной «a». Проблема с лямбдой в этом смысле состоит в том, что она просто рассматривает «а» как просто уравнение «у = а», а не (скажем, а = 2 * х^2 + 6) «у = 2 * х^2 + 6 ». Он игнорирует это как переменную хранения. –

+0

Хм ...Я до сих пор не понимаю. Лямбда-функции - это просто функции, а не уравнения. Когда вы пишете 'lambda x: 2 * x ** 2 + 6', который представляет функцию, которая принимает' x' и возвращает числовое значение '2 * x ** 2 + 6'. Он не устанавливает равного чему-либо (если под «уравнением» вы подразумеваете математическое уравнение), и он ничем не присваивает его (если под «уравнением» понимается назначение Python), хотя, конечно, вы можете назначить лямбда-функция _itself_ к переменной ('a = lambda x: 2 * x ** 2 + 6'). Я не понимаю, почему вы не могли просто выразить свое выражение в лямбда-функцию и назначить ее переменной. –

ответ

4

Насколько я понимаю, ваш код производит символические выражения с использованием SymPy. Это не функции в смысле Python, поскольку их нельзя назвать. Поэтому они не могут использоваться напрямую в качестве первого аргумента quad. SymPy обеспечивает lambdify метод, который оборачивает выражение в функцию:

quad(lambdify(x, expr), 0, 1) 

expr Здесь может быть любым символическим выражением с ней в переменной x, например expr = 4*x**6 + 2*x + 5.

+0

Ты, мой друг, святой! Спасибо огромное! –

+0

Охх, вот что это? В этом случае я также передам вам функцию [sympy 'lambdify'] (http://docs.sympy.org/dev/modules/utilities/lambdify.html#sympy.utilities.lambdify.lambdify). –

+0

@BobbySanchez Пожалуйста, просмотрите пересмотренную версию, используя lambdify, как предложил Дэвид З. – FTP