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:
a0+a1+a2=1(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:
a0+3a1+5a2=0(2)
Teraz możemy wykorzystać nasze dwa ograniczenia do rozwiązania za a1 i a2 w kategoriach a0 .
a1=52−2a0a2=a0−32(3)
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):
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 −1≤x≤1, współczynnik kth złożonej harmonicznej wykładniczej wynosi:
ck=1P∫−1+P−1({f(x)−f(x−2)if x<1if x≥1)e−i2πPkxdx.
Z powodu zależności 2cos(x)=eix+e−ix (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∣∣∣∫3−1({f(x)−f(x−2)if x<1if x≥1)e−i2π4kxdx∣∣∣=12∣∣∣∫1−1f(x)e−iπ2kxdx−∫31f(x−2)e−iπ2kxdx∣∣∣=12∣∣∣∫1−1f(x)e−iπ2kxdx−∫1−1f(x+2−2)e−iπ2k(x+2)dx∣∣∣=12∣∣∣∫1−1f(x)e−iπ2kxdx−∫1−1f(x)e−iπ2k(x+2)dx∣∣∣=12∣∣∣∫1−1f(x)(e−iπ2kx−e−iπ2k(x+2))dx∣∣∣=12∣∣∣eiπ2x∫1−1f(x)(e−iπ2kx−e−iπ2k(x+2))dx∣∣∣=12∣∣∣∫1−1f(x)(e−iπ2k(x−1)−e−iπ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)k−1)(16a0(π2k2−10)−5×(5π2k2−48))π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π2−130832)16×(15885π2−16354)≈1.569778813,a1=52−2a0=79425π2−654168×(−15885π2+16354)≈−0.6395576276,a2=a0−32=15885π216×(15885π2−16354)≈0.06977881382.
Daje to częstotliwość podstawową przy amplitudzie 1367961615885π6−16354π4≈1.000071420oraz zarówno 3., jak i 5. harmonicznej przy amplitudzie względnej18906 lub około−78.99 dBporównaniu do częstotliwości podstawowej. kthharmoniczna ma względna amplituda(1−(−1)k)∣∣8177k2−79425∣∣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+32≈1.570781972,a1=−4a2+6a3+12≈−0.6458482979,a2=347960025π4−405395408π216×(281681925π4−405395408π2+108019280)≈0.07935067784,a3=−16569525π416×(281681925π4−405395408π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π8−405395408π6+108019280π4≈0.9999983752,a trzecia, piąta i siódma harmoniczna mają amplitudę względną11555395≈−123.8368 dBporównaniu do podstawowego. kthharmoniczna ma względna amplituda(1−(−1)k)∣∣1350241k4−50674426k2+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=1−a1−a2≈1.570034357a1=3×(2436304π2−2172825π4)8×(1303695π4−1827228π2+537160)≈−0.6425216143a2=1303695π416×(1303695π4−1827228π2+537160)≈0.07248725712
Częstotliwość podstawowa ma amplitudę 10804305921303695π6−1827228π4+537160π2≈0.9997773320.3., 5. i 9. harmoniczna mają amplitudę względną7263777≈−91.52 dB,a 7. harmoniczna ma amplitudę względną72608331033100273≈−92.6 dBporównaniu do podstawowego. kthharmoniczna ma względna amplituda(1−(−1)k)∣∣67145k4−2740842k2+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=1−a1−a2−a3≈1.5707953785726114835a1=−5×(4374085272375π6−6856418226992π4+2139059216768π2)16×(2124555703725π6−3428209113496π4+1336912010480π2−155807094720)≈−0.64590724797262922190a2=2624451163425π6−3428209113496π416×(2124555703725π6−3428209113496π4+1336912010480π2−155807094720)≈0.079473610232926783079a3=−124973864925π616×(2124555703725π6−3428209113496π4+1336912010480π2−155807094720)≈−0.0043617408329090447344
Częstotliwość podstawowa ma amplitudę 169918012823961602124555703725π8−3428209113496π6+1336912010480π4−155807094720π2≈1.0000024810802368487.Największa względna amplituda harmonicznych powyżej podstawy wynosi502400688077≈−133.627 dB.w porównaniu do podstawowego. kthharmoniczna ma względna amplituda(1−(−1)k)∣∣−162299057k6+16711400131k4−428526139187∗k2+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