Использование sympy.integrate в функции, которая включает int () - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь интегрировать функции в Python. scipy.integrate.quad вроде работает нормально; но просто убедитесь, что я хочу сравнить результаты с другим кодом интеграции. Было предложено попробовать sympy.integrate. Теперь код для функций, которые я хочу интегрировать, содержит int (), который я использую для преобразования чисел с плавающей запятой в целые числа. Это нормально для quad, но не для sympy.integrate.

Вот простой пример, который воспроизводит ошибку:

import sympy

def f(x):
    return sympy.exp(int(x))

sympy.symbols('x')
print(sympy.integrate(f(x),(x,0,2)))

Это дает ошибку: TypeError: can't convert symbols to int

Так есть ли способ интегрировать функции, использующие int (), с scipy.integrate?

Спасибо

1 Ответ

1 голос
/ 11 июля 2020

Для использования integrate f должен быть символом SymPy c функция, которая запрещает ваше конкретное использование int. int(x), где x - Symbol, всегда будет приводить к ошибке типа, однако вы можете представить это символически, используя функцию floor:

def f(x):
    return sympy.exp(sympy.floor(x))

Однако использование floor может привести к поражению некоторых из цель использования SymPy в первую очередь, потому что это, вероятно, предотвратит обнаружение решения аналити c, как демонстрирует следующий сеанс python:

>>> from sympy import *
>>> x = symbols("x")
>>> integrate(exp(floor(x)), (x, 0, 2))  # use of floor prevents evaluated result
Integral(exp(floor(x)), (x, 0, 2))

Хотя вы можете использовать метод evalf для вычислить результат numeri c (который в конечном итоге выполняется mpmath):

>>> integrate(exp(floor(x)), (x, 0, 2)).evalf()
3.7

( возможно, этот результат предполагает, что sympy может лучше обработать этот интеграл? Wolfram Alpha вычисляет это как 1 + e = 3.71828... поэтому я полагаю, что здесь тоже есть как минимум ошибка точности с плавающей запятой - см. комментарий re ceiling)

В любом случае, я не знаю, считаете ли вы этот результат подходящим, учитывая версию f без floor:

>>> integrate(exp(x), (x, 0, 2))
-1 + exp(2)
>>> _.evalf()
6.38905609893065
...