2016-01-17 6 views
5

Я просто изучаю, как использовать sympy, и я пробовал простую интеграцию функции sin. Когда аргумент sin() имеет постоянную фазу постоянный выход integrate() дает то же значение независимо является фаза: 0Sympy: integrate() странный вывод

from sympy import * 
w = 0.01 
phi = 0.3 
k1 = integrate(sin(w*x), (x, 0.0, 10.0)) 
k2 = integrate(sin(w*x + 0.13), (x, 0.0, 10.0)) 
k3 = integrate(sin(w*x + phi),(x, 0.0, 10.0)) 
k1, k2, k3 

(0.499583472197429, 0, 0) 

Может кто-нибудь объяснить мне, почему?

+0

Как вы определяете 'x'? –

+2

Я могу воспроизвести это для множества 'w' и' phi', даже для неопределенных интегралов. Например, «интегрировать (sin (0,7 * x + 0,1), x)' дает '0'. Похож на ошибку! – TheBamf

+0

Кажется, у него довольно много интегральных ошибок. (https://github.com/sympy/sympy/labels/integrals). Тем не менее он правильно интегрируется, если 'w' задано как' symbol' – Lol4t0

ответ

0

Это похоже на ошибку. Решение обходного пути может быть, чтобы получить символическое выражение вашего интеграла первого (который, кажется, работает нормально), а затем оценить его для каждого набора параметров в верхнем и нижней границе и вычислить разницу:

import sympy as sp 
x, w, phi = sp.symbols('x w phi') 

# integrate function symbolically 
func = sp.integrate(sp.sin(w * x + phi), x) 

# define your parameters 
para = [{'w': 0.01, 'phi': 0., 'lb': 0., 'ub': 10., 'res': 0.}, 
     {'w': 0.01, 'phi': 0.13, 'lb': 0., 'ub': 10., 'res': 0.}, 
     {'w': 0.01, 'phi': 0.3, 'lb': 0., 'ub': 10., 'res': 0.}] 

# evaluate your function for all parameters using the function subs 
for parai in para: 
    parai['res'] = func.subs({w: parai['w'], phi: parai['phi'], x: parai['ub']}) 
    -func.subs({w: parai['w'], phi: parai['phi'], x: parai['lb']}) 

После этого , para выглядит тогда следующим образом:

[{'lb': 0.0, 'phi': 0.0, 'res': 0.499583472197429, 'ub': 10.0, 'w': 0.01}, 
{'lb': 0.0, 'phi': 0.13, 'res': 1.78954987094131, 'ub': 10.0, 'w': 0.01}, 
{'lb': 0.0, 'phi': 0.3, 'res': 3.42754951227208, 'ub': 10.0, 'w': 0.01}] 

, который, кажется, дает разумные результаты для интеграции, которые хранятся в res

+0

Спасибо за обходной путь, я убедился, что развитие выражения в sin() и cos() символически и оценка в конце работы прекрасна, но я был действительно удивлен таким поведением, и я не понял почему. – user1259970

+0

Хорошо, да, я понимаю путаницу. Как говорится ниже, это похоже на Python 2, и ошибка будет исправлена ​​в следующей версии. Спасибо, что указали на эту ошибку; Время от времени я использую sympy и теперь буду более осторожным. – Cleb

0

Я просто побежал ваш код в разрабатываемой версии SymPy и я получил (0.499583472197429, 1.78954987094131, 3.42754951227208). Таким образом, кажется, что ошибка будет исправлена ​​в следующей версии.

Он также выглядит как эта ошибка только в Python 2. Когда я использую Python 3, даже с последней стабильной версией (0.7.6.1), я получаю тот же ответ.

+0

Спасибо asmeuser. Я не уверен, что это ошибка или нет, потому что я проверил и проверил, что я использую Python 3.4.4 (на Anaconda 2.1.0), а версия sympy - 0.7.6.1 в соответствии с init_session(). Я попробовал интерактивную систему «SymPy Live Shell» на [веб-сайте SymPy] (http://docs.sympy.org/dev/tutorial/printing.html), и еще раз у меня получился тот же результат: (0.499583472197429 , 0,0) – user1259970

+0

Можете ли вы попробовать версию sympy от GitHub? – asmeurer

+0

Да, проблема с sympy от GitHub (SymPy 0.7.7.dev) устраняет проблему. Благодаря !! – user1259970

0

Могу ли я рекомендовать использовать numpy для численной интеграции?

>>> import numpy as np 
>>> w = 0.01 
>>> phi = 0.3 
>>> dt = 0.01 
>>> t = 2*np.pi*np.arange(0,1,dt) 
>>> np.sum(np.sin(t)*dt) 
-1.0733601507606494e-17 
>>> np.sum(np.sin(t+ phi)*dt) 
2.5153490401663703e-17 

Эти цифры в основном близки к 0. Точное число является артефактом нашего выбора сетки dt и сдвиг phi (а также точность np.sin)

Чтобы быть более совместимым с вашим примером :

>>> t = np.arange(0,10,dt) 
>>> w = 0.01 
>>> phi = 0.3 
>>> np.sum(np.sin(w*t)*dt) 
0.4990843046978698 
>>> np.sum(np.sin(w*t + phi)*dt) 
3.4270800187375658 
>>> np.sum(np.sin(w*t + 0.13)*dt) 
1.7890581525454512 

Как указано в Integrating in Python using Sympyэто плохая идея использовать символическую библиотеку для численных расчетов

+0

Спасибо, вы правы, я не намерен использовать sympy для решения числовых задач, чтобы узнать, как использовать sympy, и этот пример настолько невиновен, что я действительно удивлен. – user1259970

Смежные вопросы