2016-03-29 1 views
1

Я хочу найти численное решение уравнения, выраженного как бесконечная сумма в Python. Упрощенный пример использования fsolve() и sympy будет:Поиск численного решения уравнения, выраженного в виде суммы в Python

from scipy.optimize import fsolve 
import math 
from sympy import * 

i = symbols('i', integer=True) 

def f(x): 
     return Sum(x**i, (i,0, oo)).evalf(10)-1 

print fsolve(f, 0.5) 

Я получаю сообщение об ошибке:

AttributeError: 'list' object has no attribute 'is_commutative' 

Я попытался подставляя бесконечную сумму с суммой с конечным числом членов, а также литье функция f() выводит тип float, но я получил ту же ошибку. Хотя это кажется простой задачей, я не мог найти решение этой проблемы в StackOverflow или в документации.

Мой вопрос: как я численно решаю уравнения, выраженные с использованием суммы в Python.

ответ

2

Эта конкретная сумма представляет собой не что иное, как сумму геометрических рядов. sympy соглашается:

In [23]: x = symbols('x') 

In [24]: i = symbols('i', integer=True) 

In [25]: Sum(x**i, (i, 0, oo)).doit() 
Out[25]: Piecewise((1/(-x + 1), Abs(x) < 1), (Sum(x**i, (i, 0, oo)), True)) 

Обратите внимание, что она расходится x >=1. Sympy вызывает ошибку (попробуйте f(1.1)), которые кишки fsolve не обрабатываются, и это как-то приводит к ошибке, которую вы видите.

В целом, я не думаю, что есть что-то особенное в решении уравнений с l.h.s. оценивается как сумма. Вы должны убедиться, что так или иначе функция, которую вы представляете fsolve или ее родственникам, фактически возвращает числовой вывод.

Кроме того, fsolve (i) ожидает, что ваша функция достаточно плавная. и (ii) она не обрабатывает границы. Таким образом, если вам нужно ограничить диапазон для поиска root, вам лучше использовать, скажем brentq. (в более высоких измерениях, искать least_squares.)

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

+0

Интересно, что Brentq не вызывает ошибку, однако ошибка по-прежнему сохраняется для fsolve в случае сумм, которые сходятся для всех действительных чисел. Это решило мою проблему. –