Znajdowanie wielomianowych aproksymacji fali sinusoidalnej


16

Chcę aproksymować sinusoidę podaną przez poprzez zastosowanie wielomianowego wavehapera do prostej fali trójkątnej , generowanej przez funkcjęsin(πx)

T(x)=14|12mod(12x+14, 1)|

gdzie nazwa jest ułamkową częścią :mod(x,1)x

mod(x,y)y(xyxy)

Seria Taylor może być wykorzystana jako zmieniacz fal.

S1(x)=πx2πx233!+πx255!πx277!

Biorąc pod uwagę powyższe funkcje, S1(T(x)) da nam przyzwoite przybliżenie fali sinusoidalnej. Ale musimy przejść do siódmej potęgi serii, aby uzyskać rozsądny wynik, a szczyty są nieco niskie i nie będą miały nachylenia dokładnie zero.

Zamiast serii Taylora, moglibyśmy użyć wielomianu zmieniającego fale zgodnie z kilkoma zasadami.

  • Musi przejść przez -1, -1 i + 1, + 1.
  • Nachylenie przy -1, -1 i + 1, + 1 musi wynosić zero.
  • Musi być symetryczny.

Prosta funkcja spełniająca nasze wymagania:

S2(x)=3x2x32

Wykresy S2(T(x)) i sin(πx) są dość bliskie, ale nie tak bliskie jak seria Taylora. Pomiędzy szczytami i przejściami przez zero wyraźnie się nieco odbiegają. Cięższa i dokładniejsza funkcja spełniająca nasze wymagania:

S3(x)=x(x25)216

Prawdopodobnie jest to wystarczająco blisko dla moich celów, ale zastanawiam się, czy istnieje inna funkcja, która bardziej zbliża się do fali sinusoidalnej i jest tańsza obliczeniowo. Bardzo dobrze rozumiem, jak znaleźć funkcje spełniające trzy powyższe wymagania, ale nie jestem pewien, jak znaleźć funkcje spełniające te wymagania, a także najlepiej pasujące do fali sinusoidalnej.

Jakie istnieją metody znajdowania wielomianów, które naśladują falę sinusoidalną (po zastosowaniu do fali trójkątnej)?


Aby wyjaśnić, niekoniecznie szukam tylko nieparzystych wielomianów, chociaż są to najprostszy wybór.

Coś w rodzaju następującej funkcji może również pasować do moich potrzeb:

S4(x)=3x2+x24+x44

Spełnia to wymagania w zakresie ujemnym i można zastosować rozwiązanie fragmentaryczne, aby zastosować go również w zakresie dodatnim; na przykład

3x2P(x,2)4P(x,4)4

gdzie jest podpisaną funkcją mocy .P

Byłbym również zainteresowany rozwiązaniami wykorzystującymi podpisaną funkcję mocy do obsługi wykładników ułamkowych, ponieważ daje to nam kolejne „pokrętło do skręcania” bez dodawania kolejnego współczynnika.

a0x +a1P(x, p1)

Biorąc pod uwagę odpowiednie stałe, mogłoby to potencjalnie uzyskać bardzo dobrą dokładność bez ciężkości wielomianów piątego lub siódmego rzędu. Oto przykład spełniający opisane tutaj wymagania przy użyciu wybranych ręcznie: .a0=1.666¯,a1=0.666¯,p1=2.5

5x2P(x, 52)3

W rzeczywistości te stałe są bardzo zbliżone do i , i . Podłączenie ich daje coś, co wygląda wyjątkowo blisko fali sinusoidalnej.π21π2e

π2x +(1π2)P(x,e)

Innymi słowy, wygląda bardzo blisko między 0,0 a π / 2,1. Wszelkie przemyślenia na temat tego znaczenia? Może narzędzie takie jak Octave może pomóc odkryć „najlepsze” stałe dla tego podejścia.xxe6sin(x)


1
więc jaka jest twoja definicja terminu „bliżej”? O ile mogę powiedzieć, cytowana przez ciebie seria Taylora jest minimalnym przybliżonym błędem L² dla skończonej liczby współczynników. (Myślę.)
Marcus Müller

2
Jaki jest twój cel? To może naprawdę pomóc nam powiedzieć, dlaczego szukasz kształtownika fali wielomianowej, na jakiej podstawie technologicznej i jakie są twoje główne cele w przybliżeniu.
Marcus Müller

@ MarcusMüller Jestem gotów poświęcić dokładność serii Taylora za coś znacznie tańszego, jeśli nie da się go odróżnić od fali sinusoidalnej do ludzkiego ucha. Niepokoją mnie również szczyty aproksymacji serii Taylora. Jestem zainteresowany znalezieniem czegoś „bliższego” niż dwie pozostałe funkcje, które wymieniłem. Podejrzewam, że nie będzie taniej niż . S2
Gość

1
„Do ludzkiego ucha” ma tu kluczowe znaczenie :) Dlaczego szczyty „przeszkadzają” tobie? Ponownie: daj nam pojęcie, dlaczego / w jakim celu i na jakich ograniczeniach to robisz. Bez wystarczającego tła twoje pytanie jest po prostu zbyt szerokie, aby na nie odpowiedzieć poprawnie!
Marcus Müller

1
Dlaczego zaczynasz od fali trójkąta? Generatory sinusoidalne są proste i powszechne, fale kwadratowe są trywialnie filtrowane do podstawowej harmonicznej itp.
Carl Witthoft

Odpowiedzi:


10

około dziesięć lat temu zrobiłem to dla nienazwanej firmy zajmującej się syntezatorami muzyki, która miała badania i rozwój niedaleko mojego mieszkania w Waltham MA. (nie mogę sobie wyobrazić, kim oni są.) Nie mam współczynników.

ale spróbuj tego:

f(x)sin(π2x)for 1x+1=π2x(a0+a1x2+a2x4)

gwarantuje to, że .f(x)=f(x)

Aby zagwarantować, że wtedyf(x)|x=±1=0

f(x)=π2(a0+3a1x2+5a2x4)

(1)a0+3a1+5a2=0

To pierwsze ograniczenie. Aby zagwarantować, że zatem|f(±1)|=1

(2)a0+a1+a2=2π

To drugie ograniczenie. Eliminowanie i rozwiązywanie Eqs. (1) i (2) dla w kategoriach (które należy dostosować):a 2 a 1a0a2a1

a0=52π12a1

a2=12π12a1

Teraz masz tylko jeden współczynnik, , który możesz , aby uzyskać najlepszą wydajność:a1

f(x)=π2x((52π12a1)+a1x2(12π+12a1)x4)

W ten sposób przekręciłbym aby uzyskać najlepszą wydajność oscylatora fali sinusoidalnej. Zmieniłbym użycie powyższego i symetrii fali sinusoidalnej około i umieściłem dokładnie jeden cały cykl w buforze o mocy dwóch liczb punktów (powiedzmy 128, nie obchodzi mnie to) i uruchomiłem FFT na tym idealny cykl. x = 1a1x=1

Bin 1 wyniku FFT będzie siłą sinusoidy i powinien wynosić około . Teraz możesz wyregulować aby zwiększyć lub zmniejszyć zniekształcenie trzeciej harmonicznej. od , aby . To jest w bin 3 wyników FFT. Jednak zniekształcenie piątej harmonicznej (wartość w bin 5) będzie następowało (będzie rosło wraz ze spadkiem trzeciej harmonicznej). Dostosowałbym aby siła 5. poziomu harmonicznej była równa 3. poziomowi harmonicznej. Będzie to około -70 dB od pierwszej harmonicznej (jak pamiętam). To będzie najlepiej brzmiąca fala sinusoidalna z taniego, 3-współczynnikowego, nieparzysto-symetrycznego wielomianu 5. rzędu.a 1 a 15N/2a1a01a1a15π2a01a1

Ktoś inny może napisać kod MATLAB. Jak ci to brzmi?


na pewno nie będę miał czasu na wykonanie MATLABingu w celu znalezienia optymalnego aby trzecia harmoniczna była równa piątej harmonicznej, około 70 dB poniżej podstawowej (1. harmonicznej). ktoś inny musi to zrobić. Przepraszam. a1
Robert Bristol-Johnnson

Świetna odpowiedź, wciąż ją trawiąc. Właściwie zaczynam się zastanawiać, czy musi to być 3-współczynnikowy, nieparzysto-symetryczny wielomian 5 rzędu ... Czy twoje f '(x) może faktycznie być f (x) i być kawałkiem wartości około 0? Szorstki szkic tutaj . Może o tym właśnie myśli Ced? Nadal was dogonię.
Gość

To jest piękne podejście. Zastanawiam się, czy zamiast wziąć FFT i rozwiązać iteracyjnie, możesz utworzyć wielomian Czebeszewa trzeciego i piątego rzędu z twojego , a następnie zrównać oba i rozwiązać dla ? a 1f(x)a1
Speedy

Musiało być w półśnie, kiedy pisał, że „szkic”, mam na myśli coś jak ten , ale poprawił się uruchomić poprzez ± 1 i mają zerowe nachylenie (może po prostu wziąć pochodnej skrzypce się z nim, zintegrować go ponownie). Nie jestem pewien, czy jest jakaś przewaga nad piątym rzędem, coś, czego jeszcze nie rozważałem.
Gość

1
To naprawdę genialne rozwiązanie, zajęło mi tylko chwilę. Mam nadzieję, że zaznaczenie go poprawnie nie powstrzyma nikogo przed napisaniem kodu.
Gość

9

Zwykle dokonuje się aproksymacji minimalizującej pewną normę błędu, często L_ -norm (gdzie minimalny błąd maksymalny jest minimalizowany) lub norma (gdzie minimalny średni błąd kwadratu). - aproksymacja odbywa się za pomocą algorytmu wymiany Remeza . Jestem pewien, że możesz znaleźć kod Open Source implementujący ten algorytm. Jednak w tym przypadku uważam, że bardzo prosta (dyskretna) l_2 jest wystarczająca. Spójrzmy na kod Matlab / Octave i wyniki: L 2 L l 2LL2Ll2

x = przestrzeń linowa (0, pi / 2300); % siatki w [0, pi / 2]
x = x (:);
% przekroczonego układu równań liniowych
% (tylko przy użyciu mocy nieparzystych)
A3 = [x, x. ^ 3];
A5 = [x, x. ^ 3, x. ^ 5];
b = sin (x);
% rozwiązania w sensie l2
c3 = A3 \ b;
c5 = A5 \ b;
f3 = A3 * c3; % Przybliżenie trzeciego rzędu
f5 = A5 * c5; % Przybliżenie 5. rzędu

Poniższy rysunek pokazuje błędy aproksymacji dla zamówienia i dla aproksymacji . Błędy maksymalne zbliżanie się i odpowiednio. 5 t h3rd5th8.8869e-031.5519e-04

wprowadź opis zdjęcia tutaj

Optymalne współczynniki to

c3 =
   0,988720369237930
  -0,149993929056091

i

c5 =
   0,99976918199047515
  -0,16582163562776930
   0,00757183954143367

Przybliżenie trzeciego rzędu to

(1)sin(x)0.988720369237930x0.144993929056091x3,x[π/2,π/2]

a przybliżeniem piątego rzędu jest

(2)sin(x)0.99976918199047515x0.16582163562776930x3+0.00757183954143367x5,x[π/2,π/2]

EDYTOWAĆ:

Spojrzałem na przybliżenia z podpisaną funkcją mocy, jak zasugerowano w pytaniu, ale najlepsze przybliżenie nie jest prawie lepsze niż przybliżenie trzeciego rzędu pokazane powyżej. Funkcja aproksymująca to

(3)f(x)=x1p(π2)1pxp,x[0,π/2]

gdzie stałe zostały wybrane w taki sposób, i . Moc została zoptymalizowana, aby osiągnąć najmniejszy błąd maksymalny w zakresie . Stwierdzono, że optymalna wartość wynosi . Poniższy rysunek pokazuje błędy aproksymacji dla aproksymacji trzeciego rzędu i dla nowej aproksymacji :f ' ( π / 2 ) = 0 p [ 0 , π / 2 ] p p = 2,774 ( 1 ) ( 3 )f(0)=1f(π/2)=0p[0,π/2]pp=2.774(1)(3)

wprowadź opis zdjęcia tutaj

Maksymalny błąd aproksymacji aproksymacji jest , ale należy pamiętać, że aproksymacja trzeciego rzędu przekracza ten błąd tylko w pobliżu i że w większości jego błąd aproksymacji jest w rzeczywistości mniejszy niż błąd podpisanej funkcji mocy .π / 2(3)4.5e-3π/2

EDYCJA 2:

Jeśli nie przeszkadza ci podział, możesz również użyć wzoru przybliżenia sinusoidy Bhaskara I , który ma maksymalny błąd przybliżenia 1.6e-3:

(4)sin(x)16x(πx)5π24x(πx),x[0,π/2]

To bardzo pomocne, dzięki. Po raz pierwszy korzystam z Octave. Śledziłem większość z nich, ale skąd masz wykresy błędów aproksymacji i wartości maksymalne?
Gość

1
@Guest: Błędy są po prostu b-f3i b-f5odpowiednio. Użyj plotpolecenia, aby je wykreślić.
Matt L.

1
@Gość: I maksima, które otrzymujesz od max(abs(b-f3))i max(abs(b-f5)).
Matt L.

@Gość: bawiłem się podpisaną funkcją mocy, ale wynik nie jest znacznie lepszy niż przybliżenie trzeciego rzędu, które miałem wcześniej. Sprawdź moją zredagowaną odpowiedź. Co do złożoności, czy miałoby to tak wielką różnicę?
Matt L.

Dzięki za przyjrzenie się temu. Złożoność nie jest wielkim problemem, po prostu ciekawa, jak dokładne może być przybliżenie przy stosunkowo niskiej złożoności. Nie jestem do końca pewien, jak wymyśliłeś (3), ale działa dobrze. Musiałbym zamiast tego użyć 2,752 p, ponieważ wszystko powyżej, co spowoduje wysłanie pików powyżej 1 (obcinanie).
Gość

7

Rozpocznij od sparametryzowanego wielomianu nieparzystej symetrii 5. rzędu:

f(x)=a0x1+a1x3+a2x5=x(a0+a1x2+a2x4)=x(a0+x2(a1+a2x2))

Teraz nakładamy pewne ograniczenia na tę funkcję. Amplituda powinna wynosić 1 na szczytach, innymi słowy f(1)=1 . Podstawienie 1 na x daje:

(1)a0+a1+a2=1

To jedno ograniczenie. Nachylenie na szczytach powinno wynosić zero, innymi słowy f(1)=0 . Pochodna f(x) to

a0+3a1x2+5a2x4

i podstawienie 1 na x daje nasze drugie ograniczenie:

(2)a0+3a1+5a2=0

Teraz możemy wykorzystać nasze dwa ograniczenia do rozwiązania za a1 i a2 w kategoriach a0 .

(3)a1=522a0a2=a032

Pozostaje to, aby dostosować a0 aby uzyskać ładny dopasowanie. Nawiasem mówiąc, 0 (i nachylenie przy początku) kończy się gatunkua0π2 , jak widać zwykresufunkcji.

Optymalizacja parametrów

Poniżej przedstawiono szereg optymalizacji współczynników, które skutkują tymi względnymi amplitudami harmonicznych w porównaniu do częstotliwości podstawowej (1. harmonicznej):

Porównanie przybliżeń

W złożonej serii Fouriera :

k=ckei2πPkx,

rzeczywistego P- okresowego przebiegu o P=4 i symetrii czasowej około x=1 i przy połowie okresu zdefiniowanego przez funkcję nieparzystą f(x) powyżej 1x1, współczynnik kth złożonej harmonicznej wykładniczej wynosi:

ck=1P11+P({f(x)if x<1f(x2)if x1)ei2πPkxdx.

Z powodu zależności 2cos(x)=eix+eix (patrz: wzór Eulera ), amplituda rzeczywistej harmonicznej sinusoidalnej przy k>0 wynosi 2|ck|, która jest dwa razy większa niż złożoność wykładnicza tej samej częstotliwości. Można to wmasować do postaci, która ułatwia symbolicznemu oprogramowaniu matematycznemu uproszczenie całki:

2|ck|=24|13({f(x)if x<1f(x2)if x1)ei2π4kxdx|=12|11f(x)eiπ2kxdx13f(x2)eiπ2kxdx|=12|11f(x)eiπ2kxdx11f(x+22)eiπ2k(x+2)dx|=12|11f(x)eiπ2kxdx11f(x)eiπ2k(x+2)dx|=12|11f(x)(eiπ2kxeiπ2k(x+2))dx|=12|eiπ2x11f(x)(eiπ2kxeiπ2k(x+2))dx|=12|11f(x)(eiπ2k(x1)eiπ2k(x+1))dx|

Powyższe korzysta z tego |eix|=1 dla prawdziwego x.Niektóre systemy algebry komputerowej łatwiej upraszczają całkę, zakładając, że k jest rzeczywiste, i upraszczają liczbę całkowitą k na końcu. Wolfram Alpha może całkować poszczególne warunki całki końcowej odpowiadające warunkom wielomianu f(x) . Dla współczynników podanych w równaniu. 3 otrzymujemy amplitudę:

=|48((1)k1)(16a0(π2k210)5×(5π2k248))π6k6|

5. rząd, pochodna ciągła

Możemy rozwiązać za wartość a0 zapewniający równe amplitudzie 2|ck|trzeciej i piątej harmonicznej. Będą dwa rozwiązania odpowiadające trzeciej i piątej harmonicznej o równych lub przeciwnych fazach. Najlepszym rozwiązaniem jest to, które minimalizuje maksymalną amplitudę trzeciej i wyższej harmonicznej oraz równoważnie maksymalną względną amplitudę trzeciej i wyższej harmonicznej w porównaniu do częstotliwości podstawowej (1. harmonicznej):

a0=3×(132375π2130832)16×(15885π216354)1.569778813,a1=522a0=79425π2654168×(15885π2+16354)0.6395576276,a2=a032=15885π216×(15885π216354)0.06977881382.

Daje to częstotliwość podstawową przy amplitudzie 1367961615885π616354π41.000071420oraz zarówno 3., jak i 5. harmonicznej przy amplitudzie względnej18906 lub około78.99 dBporównaniu do częstotliwości podstawowej. kthharmoniczna ma względna amplituda(1(1)k)|8177k279425|142496k6.

7. rząd, pochodna ciągła

Podobnie optymalne przybliżenie wielomianowe siódmego rzędu z tymi samymi ograniczeniami początkowymi oraz harmoniczną 3., 5. i 7. na najniższym możliwym równym poziomie wynosi:

f(x)=a0x1+a1x3+a2x5+a3x7=x(a0+a1x2+a2x4+a3x7)=x(a0+x2(a1+x2(a2+a3x2)))

a0=2a2+4a3+321.570781972,a1=4a2+6a3+120.6458482979,a2=347960025π4405395408π216×(281681925π4405395408π2+108019280)0.07935067784,a3=16569525π416×(281681925π4405395408π2+108019280)0.004284352588.

Jest to najlepsze z czterech możliwych rozwiązań odpowiadających kombinacjom równych / przeciwnych faz trzeciej, piątej i siódmej harmonicznej. Częstotliwość podstawowa ma amplitudę 2293523251200281681925π8405395408π6+108019280π40.9999983752,a trzecia, piąta i siódma harmoniczna mają amplitudę względną11555395123.8368 dBporównaniu do podstawowego. kthharmoniczna ma względna amplituda(1(1)k)|1350241k450674426k2+347960025|597271680k8 porównaniu do podstawowego.

5. zamówienie

Jeśli wymóg ciągłej pochodnej zostanie porzucony, przybliżenie 5. rzędu będzie trudniejsze do symbolicznego rozwiązania, ponieważ amplituda 9. harmonicznej wzrośnie powyżej amplitudy 3., 5. i 7. harmonicznej, jeśli są one ograniczone równe i zminimalizowane. Testując 16 różnych rozwiązań odpowiadających różnym podzbiorom trzech harmonicznych z {3,5,7,9} o jednakowej amplitudzie i jednakowych lub przeciwnych fazach, najlepszym rozwiązaniem jest:

f(x)=a0x1+a1x3+a2x5a0=1a1a21.570034357a1=3×(2436304π22172825π4)8×(1303695π41827228π2+537160)0.6425216143a2=1303695π416×(1303695π41827228π2+537160)0.07248725712

Częstotliwość podstawowa ma amplitudę 10804305921303695π61827228π4+537160π20.9997773320.3., 5. i 9. harmoniczna mają amplitudę względną726377791.52 dB,a 7. harmoniczna ma amplitudę względną7260833103310027392.6 dBporównaniu do podstawowego. kthharmoniczna ma względna amplituda(1(1)k)|67145k42740842k2+19555425|33763456k6.

To przybliżenie ma niewielki róg na granicach półcyklu , ponieważ wielomian ma zerową pochodną nie przy x=±1 ale przy x±1.002039940.Przy x=1 wartość pochodnej wynosi około 0.004905799828 . Powoduje to wolniejsze asymptotyczne zanikanie amplitud harmonicznych przy dużym k, porównaniu do aproksymacji 5. rzędu, która ma pochodną ciągłą.

7. zamówienie

Przybliżenie siódmego rzędu bez pochodnej ciągłej można znaleźć podobnie. Podejście to wymaga przetestowania 120 różnych rozwiązań i zostało zautomatyzowane przez skrypt Python na końcu tej odpowiedzi. Najlepszym rozwiązaniem jest:

f(x)=a0x1+a1x3+a2x5+a3x7a0=1a1a2a31.5707953785726114835a1=5×(4374085272375π66856418226992π4+2139059216768π2)16×(2124555703725π63428209113496π4+1336912010480π2155807094720)0.64590724797262922190a2=2624451163425π63428209113496π416×(2124555703725π63428209113496π4+1336912010480π2155807094720)0.079473610232926783079a3=124973864925π616×(2124555703725π63428209113496π4+1336912010480π2155807094720)0.0043617408329090447344

Częstotliwość podstawowa ma amplitudę 169918012823961602124555703725π83428209113496π6+1336912010480π4155807094720π21.0000024810802368487.Największa względna amplituda harmonicznych powyżej podstawy wynosi502400688077133.627 dB.w porównaniu do podstawowego. kthharmoniczna ma względna amplituda(1(1)k)|162299057k6+16711400131k4428526139187k2+2624451163425|4424948250624k8.

Źródło Python

from sympy import symbols, pi, solve, factor, binomial

numEq = 3 # Number of equations
numHarmonics = 6 # Number of harmonics to evaluate

a1, a2, a3, k = symbols("a1, a2, a3, k")
coefficients = [a1, a2, a3]
harmonicRelativeAmplitude = (2*pi**4*a1*k**4*(pi**2*k**2-12)+4*pi**2*a2*k**2*(pi**4*k**4-60*pi**2*k**2+480)+6*a3*(pi**6*k**6-140*pi**4*k**4+6720*pi**2*k**2-53760)+pi**6*k**6)*(1-(-1)**k)/(2*k**8*(2*pi**4*a1*(pi**2-12)+4*pi**2*a2*(pi**4-60*pi**2+480)+6*a3*(pi**6-140*pi**4+6720*pi**2-53760)+pi**6))

harmonicRelativeAmplitudes = []
for i in range(0, numHarmonics) :
    harmonicRelativeAmplitudes.append(harmonicRelativeAmplitude.subs(k, 3 + 2*i))

numCandidateEqs = 2**numHarmonics
numSignCombinations = 2**numEq
useHarmonics = range(numEq + 1)

bestSolution = []
bestRelativeAmplitude = 1
bestUnevaluatedRelativeAmplitude = 1
numSolutions = binomial(numHarmonics, numEq + 1)*2**numEq
solutionIndex = 0

for i in range(0, numCandidateEqs) :
    temp = i
    candidateNumHarmonics = 0
    j = 0
    while (temp) :
        if (temp & 1) :
            if candidateNumHarmonics < numEq + 1 :
                useHarmonics[candidateNumHarmonics] = j
            candidateNumHarmonics += 1
        temp >>= 1
        j += 1
    if (candidateNumHarmonics == numEq + 1) :
        for j in range(0,  numSignCombinations) :
            eqs = []
            temp = j
            for n in range(0, numEq) :
                if temp & 1 :
                    eqs.append(harmonicRelativeAmplitudes[useHarmonics[0]] - harmonicRelativeAmplitudes[useHarmonics[1+n]])
                else :
                    eqs.append(harmonicRelativeAmplitudes[useHarmonics[0]] + harmonicRelativeAmplitudes[useHarmonics[1+n]])
                temp >>= 1
            solution = solve(eqs, coefficients, manual=True)
            solutionIndex += 1
            print "Candidate solution %d of %d" % (solutionIndex, numSolutions)
            print solution
            solutionRelativeAmplitude = harmonicRelativeAmplitude
            for n in range(0, numEq) :                
                solutionRelativeAmplitude = solutionRelativeAmplitude.subs(coefficients[n], solution[0][n])
            solutionRelativeAmplitude = factor(solutionRelativeAmplitude)
            print solutionRelativeAmplitude
            solutionWorstRelativeAmplitude = 0
            for n in range(0, numHarmonics) :
                solutionEvaluatedRelativeAmplitude = abs(factor(solutionRelativeAmplitude.subs(k, 3 + 2*n)))
                if (solutionEvaluatedRelativeAmplitude > solutionWorstRelativeAmplitude) :
                    solutionWorstRelativeAmplitude = solutionEvaluatedRelativeAmplitude
            print solutionWorstRelativeAmplitude
            if (solutionWorstRelativeAmplitude < bestRelativeAmplitude) :
                bestRelativeAmplitude = solutionWorstRelativeAmplitude
                bestUnevaluatedRelativeAmplitude = solutionRelativeAmplitude                
                bestSolution = solution
                print "That is a new best solution!"
            print

print "Best Solution is:"
print bestSolution
print bestUnevaluatedRelativeAmplitude
print bestRelativeAmplitude

Jest to odmiana odpowiedzi Roberta i jest to droga, którą ostatecznie wybrałem. Zostawiam go tutaj na wypadek, gdyby pomógł komukolwiek innemu.
Gość

wow, rozwiązując to analitycznie. po prostu użyłbym MATLAB i FFT i trochę szukałem odpowiedzi.
zrobiłeś bardzo dobrze.
Robert Bristol-Johnnson

2
tak naprawdę @OlliNiemitalo, myślę, że -79 dB jest wystarczające do realizacji cyfrowego oscylatora z falą sinusoidalną. może być napędzany falą trójkątną, która jest łatwo generowana z wartości abs piłokształtnego, który najłatwiej jest wygenerowany za pomocą akumulatora fazowego o stałym punkcie.
nikt nie usłyszy różnicy między tą wielomianową falą sinusoidalną 5. rzędu a czystą sinusoidą.
Robert Bristol-Johnnson

1
fff

1
f0

5

Czy pytasz o to z powodów teoretycznych lub praktycznego zastosowania?

Zwykle, gdy masz kosztowną funkcję obliczeniową w ograniczonym zakresie, najlepszą odpowiedzią jest zestaw tabel odnośników.

Jednym z podejść jest stosowanie najlepiej dopasowanych parabol:

n = podłoga (x * N + .5);

d = x * N - n;

i = n + N / 2;

y = L_0 + L_1 [i] * d + L_2 [i] * d * d;

Znalezienie paraboli w każdym punkcie, który spełnia wartości d wynoszące -1/2, 0 i 1/2, zamiast używania pochodnych w 0, zapewnia ciągłe przybliżenie. Możesz również przesunąć wartość x zamiast indeksu tablicy, aby poradzić sobie z ujemnymi wartościami x.

Ced

=================================================

Kontynuacja:

Ilość wysiłku i wyniki, które zostały włożone w znalezienie dobrych przybliżeń, są imponujące. Byłem ciekawy, jak wyglądałoby moje nudne i nijakie paraboliczne rozwiązanie. Nic dziwnego, że robi się znacznie lepiej. Oto wyniki:

   Metoda Minimalna Maksymalna Średnia RMS
  -------- -------- -------- -------- --------
     Moc -8,48842 1,99861 -4,1936 5,23002
    OP S_3 -2,14675 0,00000 -1,20299 1,40854
     Bhask -1,334370 1,63176 -0,14367 0,97353
     Stosunek -0,24337 0,22770 -0,00085 0,16244
     rbj 5 -0,06724 0,15519 -0,00672 0,04195
    Olli5C -0,16367 0,20212 0,01003 0,1268
     Olli5 -0,26698 0,00000 -0,15177 0,16402
    Olli7C -0,00213 0,00000 -0,00129 0,00143
     Olli7 -0,00005 0,00328 0,00149 0,00181
    Para16 -0,00921 0,00916 -0,00017 0,00467
    Para32 -0,00104 0,00104 -0,00001 0,00053
    Para64 -0,00012 0,00012 -0,00000 0,00006

π/2

xxe6

Linia rbj 5 jest taka sama jak rozwiązanie Matt L5 c5.

16, 32 i 64 to liczba przedziałów, które mają napady paraboliczne. Oczywiście w pierwszej pochodnej występują niewielkie nieciągłości na każdej granicy przedziału. Wartości funkcji są jednak ciągłe. Zwiększenie liczby interwałów tylko zwiększa wymagania dotyczące pamięci (i czas inicjalizacji), nie zwiększa ilości obliczeń potrzebnych do aproksymacji, która jest mniejsza niż w przypadku innych równań. Wybrałem potęgi dwóch, ponieważ implementacja punktu stałego może uratować podział, używając AND w takich przypadkach. Nie chciałem też, aby liczba była proporcjonalna do próbkowania próbnego.

Uruchomiłem program pytlowy Olli Niemitalo i otrzymałem to jako część wydruku: „Rozwiązanie kandydujące 176 ze 120”. Myślałem, że to dziwne, więc wspominam o tym.

Jeśli ktoś chce, żebym włączył inne równania, daj mi znać w komentarzach.

Oto kod częściowych aproksymacji parabolicznych. Cały program testowy jest zbyt długi, aby opublikować.

# ================================================= ============================
def FillParab (argArray, argPieceCount):

# y = ad ^ 2 + bd + c

# ym = a .25 - b. 5 + c
# y = c
# yp = a .25 + b .5 + c

# c = y
# b = yp - ym
# a = (yp + ym - 2 lata) * 2

# ---- Oblicz tablice wyszukiwania

        theStep = pi * .5 / float (argPieceCount - 1)
        theHalf = theStep * .5

        theL0 = zera (argPieceCount)
        theL1 = zera (argPieceCount)
        theL2 = zera (argPieceCount)

        dla k w zakresie (0, argPieceCount):
         x = float (k) * theStep

         ym = sin (x - theHalf)
         y = sin (x)
         yp = sin (x + theHalf)

         theL0 [k] = y
         theL1 [k] = yp - ym
         theL2 [k] = (yp + ym - 2,0 * y) * 2

# ---- Wypełnij

        theN = len (argArray)

        theFactor = pi * .5 / float (theN - 1)

        dla i w zakresie (0, theN):
         x = float (i) * theFactor

         kx = x / theStep
         k = int (kx + .5)
         d = kx - k

         argArray [i] = theL0 [k] + (theL1 [k] + theL2 [k] * d) * d

# ================================================= ============================

=======================================

Dodatek

S3


Dobra robota! Naprawiłem ten błąd („176 ze 120”).
Olli Niemitalo

xxe6ef0(x)=|x|asign(x)b=f0(1)f1(x)=f0(x)bxc=1f1(1)f2(x)=f1(x)ca223

f0(x)ax1ax+1a

a0xa1xa0x+a1x a013a1109
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.