2016-03-23 14 views
2

Bazı sembolik matematik işlemlerini yürütmek için sympy kullanıyorum.Sympy ayıklamak Fourier Series katsayıları

Başlangıç ​​dikdörtgen darbe katarı (görev çevrimi: <% 50), bir Fourier serisi temsil oluşturma, daha sonra çarpma faktörleri, yani a_n ve standart Fourier serisi b_n erişmeye. Özetle

:

from sympy import fourier_series, pi, cos, sin 
from sympy.abc import t 
from sympy.functions.special.delta_functions import Heaviside 
T = sy.symbols('T') 
s = fourier_series(Heaviside(t) - Heaviside(t-1/4), (t, 0, 1)) 
s.truncate(3) 

1/π*sin(2πt)+1/π*sin(4πt)+1/π*cos(2πt)+0.25 

Sonra baz fonksiyonlarının katsayıları erişmek istiyorum. Bu kapsamda, as_coefficient(expr) kullanmam gerektiğini düşündüm.

Bu basit bir durumda beklenen sonuçlar üretir: fourier_series tarafından döndürülen nesne ile,

g = 1/(pi*T)*sin(2*pi*t) 
g.as_coefficient(sin(2*pi*t)) 

1/πT 

Ancak bu işe görünmüyor:

a = s.truncate(3) 
a.as_coefficient(sin(2*pi*t)) 

döner bir şey (hatta bir uyarı veya mesaj). s.as_Add() veya s.as_Mul() dönüş hem a_n onun sin(2*pi*n*t) terimi bağlı (veya çift için b_n) bir tam ifade gibi

diğer yöntemler.

cevap

1
yöntemi 2*sin(x)+3*cos(x) gibi bir terimleri işleyemez: katsayıları yalnızca belirtilen ifade ( sin(x) gibi) dikkate alınabilirse alır. Bu yüzden, onu kullanmak için, serileri her biri bir trig işlevi olan parçalara ayırmanız gerekir. Bu yapılabilir, ancak bu yaklaşımı değiştirmek daha kolaydır:
  1. Seri için bir jeneratör almak üzere s.truncate(None)'u kullanın.

nedeni üreteci tarafından üretilen her bir dönem için

  • , kosinüs katsayısı elde etmek için 0 takın ve (burada k endeksi) sinüs katsayısı elde etmek için aralık uzunluğunun 1/(4 * k) fiş Bu çalışır: 0, sinüs 0 ve kosinüs 1; uzunluğunun 1/4, kosinüs 0 ve sinüs 1.

    trig


    from sympy import fourier_series, pi, cos, sin 
    from sympy.abc import t 
    from sympy.functions.special.delta_functions import Heaviside 
    s = fourier_series(Heaviside(t) - Heaviside(t-1/4), (t, 0, 1)) 
    iter = s.truncate(None) 
    cosine_coeffs = [] 
    sine_coeffs = [0]  # there is no sine term for k = 0 
    for k in range(0, 4): 
        term = next(iter) 
        cosine_coeffs.append(term.subs(t, 0)) 
        if k > 0: 
         sine_coeffs.append(term.subs(t, 1/(4*k))) 
    

    Sonucu geçerli:

    cosine_coeffs = [0.250000000000000, 1/pi, 0, -1/(3*pi)] 
    
    sine_coeffs = [0, 1/pi, 1/pi, 1/(3*pi)] 
    
    +0

    Vay serin görünüyor! Çiğnemem gereken birkaç şey var, birincisi çok nadiren kullandığım yineleyici kavramı. Katsayılarımı elde edebilmek için 'bir seviye daha derine inmem' ve 'a = s.truncate (3); m = a.args [1]; m.as_coeff_mul [1] [0] 'nihayet faktörümü elde etmek için ... İşaret ettiğin gibi hantal ve genel durum için bunu yapmanın otomatik bir yolunu bulamadım. Belki yineleyicileri anladıktan sonra, öğrenme etkisi için ikinci bir şans vereceğim;) –

    İlgili konular