2016-01-17 11 views
5

Po prostu uczę się używać sympy i próbowałem prostej integracji funkcji grzechu. Gdy argument sin() ma stałą fazę stałą wyjście integrate() daje taką samą wartość, co jest faza: 0Sympy: integrate() dziwne wyjście

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) 

Czy ktoś mógłby wyjaśnić mi, dlaczego?

+0

Jak zdefiniowałeś "x"? –

+2

Mogę odtworzyć to dla różnych 'w' i' phi', nawet dla całek nieoznaczonych. Np. "Integruj (sin (0,7 * x + 0,1), x)" daje "0". Wygląda mi na błąd! – TheBamf

+0

Wygląda na to, że ma sporo całkowych błędów. (https://github.com/sympy/sympy/labels/integrals) Nadal integruje się prawidłowo, jeśli 'w' jest ustawione jako' symbol' – Lol4t0

Odpowiedz

0

To wydaje się być błędem. Rozwiązanie Rozwiązaniem może być, aby uzyskać symbolicznym wyrazem swoją integralną pierwszy (co wydaje się działać prawidłowo), a następnie oceniają go dla każdego zestawu parametrów przy górnej i dolnej granicy i obliczyć różnicę:

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']}) 

Po tym , para wygląda wtedy następująco:

[{'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}] 

który wydaje się dawać dobre efekty w zakresie integracji, które są przechowywane w res

+0

Dzięki za obejście tego problemu, zweryfikuję, że rozwijanie ekspresji w symbolach sin() i cos() i ocenianie na końcu działało dobrze, ale byłem naprawdę zaskoczony takimi zachowaniami i nie rozumiałem dlaczego. – user1259970

+0

Ok, tak, rozumiem zamieszanie. Jak mówi poniżej asmeurer, wydaje się, że dzieje się to tylko w Pythonie 2, a błąd zostanie naprawiony w następnej wersji. Dzięki za wskazanie tego błędu; Używam sympy od czasu do czasu i będę teraz bardziej ostrożny. – Cleb

0

właśnie prowadził swój kod w wersji rozwojowej SymPy i mam (0.499583472197429, 1.78954987094131, 3.42754951227208). Wygląda więc na to, że błąd zostanie naprawiony w następnej wersji.

Wygląda na to, że ten błąd występuje tylko w Pythonie 2. Kiedy używam Pythona 3, nawet z najnowszą stabilną wersją (0.7.6.1) otrzymuję tę samą odpowiedź.

+0

Dzięki asmeuser. Nie jestem pewien, czy to błąd, czy nie, ponieważ sprawdziłem i zweryfikowałem, że używam Pythona 3.4.4 (na Anacondzie 2.1.0), a wersja sympy to 0.7.6.1 według init_session(). Próbowałem systemu interaktywnego "SymPy Live Shell" na [stronie internetowej SymPy] (http://docs.sympy.org/dev/tutorial/printing.html) i znowu mam ten sam wynik: (0.499583472197429 , 0,0) – user1259970

+0

Czy możesz wypróbować wersję symp od GitHub? – asmeurer

+0

Tak, wersja sympy z GitHub (SymPy 0.7.7.dev) rozwiązuje problem. Dzięki !! – user1259970

0

Czy mogę polecić użycie numeru numpy do integracji numerycznej?

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

Liczby te są w zasadzie blisko 0. Dokładna liczba jest artefaktem z naszego wyboru siatki dt i przesunięcie phi (jak również dokładności np.sin)

Aby być bardziej spójne z przykładu :

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

Jak cytowany w Integrating in Python using Sympy, że to zły pomysł, aby użyć symboliczne bibliotekę do pracy numerycznej

+0

Dzięki, masz rację, nie jest moją intencją używać sympy do rozwiązywania problemów numerycznych tylko po to, aby nauczyć się korzystać z sympy, a przykład jest tak niewinny, że jestem naprawdę zaskoczony. – user1259970