사인파의 다항식 근사값 구하기


16

함수에 의해 생성 된 간단한 삼각형 파에 다항식 파쇄기를 적용하여 sin(πx) 으로 주어진 사인파를 근사하고 싶습니다.

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

여기서 mod(x,1) 의 소수 부분입니다 x.

mod(x,y)y(xyxy)

테일러 시리즈는 웨이브 셰이퍼로 사용할 수 있습니다.

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

위의 함수를 감안할 때 는 사인파의 적절한 근사치를 얻습니다. 그러나 합리적인 결과를 얻으려면 시리즈의 7 제곱까지 올라갈 필요가 있으며 피크는 약간 낮아서 정확히 0의 기울기를 가지지 않습니다.S1(T(x))

Taylor 시리즈 대신 몇 가지 규칙에 따라 다항식 웨이브 쉐이퍼를 사용할 수 있습니다.

  • -1, -1 및 + 1, + 1을 통과해야합니다.
  • -1, -1 및 + 1, + 1의 기울기는 0이어야합니다.
  • 대칭이어야합니다.

우리의 요구 사항을 충족시키는 간단한 기능 :

S2(x)=3x2x32

\ sin \ left (\ pi x \ right) 의 그래프 는 매우 유사하지만 Taylor 계열만큼 가깝지는 않습니다. 피크와 제로 크로싱 사이에서 눈에 띄게 약간 벗어납니다. 우리의 요구 사항을 충족시키는 더 무겁고 정확한 기능 :S2(T(x))sin(πx)

S3(x)=x(x25)216

이것은 아마도 내 목적에 충분히 가깝지만 사인파에 더 가깝고 계산적으로 더 저렴한 다른 함수가 있는지 궁금합니다. 위의 세 가지 요구 사항을 충족하는 함수를 찾는 방법에 대해 잘 알고 있지만 해당 요구 사항을 충족하고 사인파와 가장 일치하는 함수를 찾는 방법을 잘 모르겠습니다.

사인파를 모방하는 다항식을 찾는 방법은 무엇입니까 (삼각파에 적용 할 때)?


명확히하기 위해 필자는 반드시 홀수 대칭 다항식만을 찾고있는 것은 아니지만 가장 간단한 선택입니다.

다음 기능과 같은 것도 내 요구에 맞을 수 있습니다.

S4(x)=3x2+x24+x44

이는 음수 범위의 요구 사항을 충족하며, 양수 솔루션을 사용하여 양수 범위에도 적용 할 수 있습니다. 예를 들어

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

where P is the signed power function.

또한 분수 지수를 지원하기 위해 부호있는 전력 함수를 사용하는 솔루션에 관심이 있습니다. 이는 다른 계수를 추가하지 않고도 또 다른 "꼬임"을 제공하기 때문입니다.

a0x +a1P(x, p1)

올바른 상수가 주어지면 5 차 또는 7 차 다항식의 무거움없이 잠재적으로 매우 우수한 정확도를 얻을 수 있습니다. 다음은 손으로 선택한 상수를 사용하여 여기에 설명 된 요구 사항을 충족하는 예입니다. .a0=1.666¯,a1=0.666¯,p1=2.5

5x2P(x, 52)3

In fact, those constants are very close to π2, and 1π2, and e. Plugging those in gives something that looks extremely close to a sine wave.

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

To put it another way, xxe6 looks very close to sin(x) between 0,0 and π/2,1. Any thoughts on the significance of this? Maybe a tool like Octave can help discover the "best" constants for this approach.


1
so, what's your error term definition for "more close"? As far as I could tell, the Taylor series you quoted is the minimum L² error approximate for finite number of coefficients. (I think.)
Marcus Müller

2
What, by the way, is your goal? It might really help to tell us why you're looking for a polynomial wave shaper, on what technological basis, and what your main objectives are for the approximation.
Marcus Müller

@MarcusMüller I'm willing to sacrifice the accuracy of Taylor series for something significantly cheaper, if it's indistinguishable from a sine wave to the human ear. The peaks of the Taylor series approximation also bother me. I'm interested in finding something "more close" than the other two functions I listed. I suspect it won't get any cheaper than S2.
Guest

1
"To the human ear" is critical here :) Why do the peaks "bother" you? Again: give us an idea of why / for what purpose and under which restrictions you're doing this. Without enough background your question is simply too broad to be properly answered!
Marcus Müller

1
Why are you starting with a triangle wave? Sine-generators are simple and common, square waves are trivially filtered to the fundamental harmonic, etc.
Carl Witthoft

답변:


10

about a decade ago i did this for an unnamed music synthesizer company who had R&D not too far from my condo in Waltham MA. (can't imagine who they are.) i don't have the coefficients.

but try this:

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

this guarantees that f(x)=f(x).

To guarantee that f(x)|x=±1=0 then

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

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

That's the first constraint. To guarantee that |f(±1)|=1, then

(2)a0+a1+a2=2π

That's the second constraint. Eliminating a0 and solving Eqs. (1) and (2) for a2 in terms of a1 (which is left to adjust):

a0=52π12a1

a2=12π12a1

Now you have only one coefficient, a1, left to twiddle for best performance:

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

This is the way I would twiddle a1 for best performance for a sine wave oscillator. I would adjust use the above and the symmetry of the sine wave about x=1 and place exactly one entire cycle in a buffer with a power of two number of points (say 128, i don't care) and run the FFT on that perfect cycle.

The FFT result bin 1 will be the strength of the sine and should be about N/2. Now you can adjust a1 to bring your 3rd harmonic distortion up and down. I would start with a15π2 so that a01. That's in bin 3 of the FFT results But the 5th harmonic distortion (value in bin 5) will be consequential (it will go up as the 3rd harmonic goes down). I would adjust a1 so that the strength of the 5th harmonic level is equal to the 3rd harmonic level. It will be around -70 dB from the 1st harmonic (as I recall). That will be the nicest-sounding sine wave from a cheap, 3-coefficient, 5th-order, odd-symmetrical polynomial.

Someone else can write the MATLAB code. How does that sound to you?


i will definitely not have time to do the MATLABing to hunt for the optimal a1 so that the 3rd harmonic is equal to the 5th harmonic, about 70 dB below the fundamental (1st harmonic). someone else needs to do that. sorry.
robert bristow-johnson

Great answer, still digesting it. Actually starting to wonder if it needs to be a 3-coefficient, 5th-order, odd-symmetrical polynomial ... Could your f'(x) actually be f(x) and be a piecewise deal around 0? Rough sketch here. Maybe this is what Ced has in mind? Still catching up to you guys.
Guest

This is a beautiful approach. I wonder if instead of taking the FFT and solving iteratively you could form the third- and fifth-order Chebyshev polynomials from your f(x), then equate the two and solve for a1?
Speedy

Must have been half asleep when I posted that "sketch," I meant to do something like this, but corrected to run through ±1 and have zero slope (can just take the derivative, fiddle around with it, integrate it again). Not sure if there's any advantage over fifth-order, just something I hadn't considered yet.
Guest

1
This really is a brilliant solution, just took a while to sink in. I hope marking it correct won't stop someone else from coming along and writing the code.
Guest

9

What is usually done is an approximation minimizing some norm of the error, often the L-norm (where the maximum error is minimized), or the L2-norm (where the mean squared error is minimized). L-approximation is done by using the Remez exchange algorithm. I'm sure you can find some open source code implementing that algorithm. However, in this case I think a very simple (discrete) l2-optimization is sufficient. Let's look at some Matlab/Octave code and the results:

x = linspace(0,pi/2,300);    % grid on [0,pi/2]
x = x(:);
% overdetermined system of linear equations
% (using odd powers only)
A3 = [x,x.^3];
A5 = [x,x.^3,x.^5];
b = sin(x);
% solve in l2 sense
c3 = A3\b;
c5 = A5\b;
f3 = A3*c3;    % 3rd order approximation
f5 = A5*c5;    % 5th order approximation

The figure below shows the approximation errors for the 3rd-order and for the 5th-order approximations. The maximum approximation errors are 8.8869e-03 and 1.5519e-04, respectively.

여기에 이미지 설명을 입력하십시오

The optimum coefficients are

c3 =
   0.988720369237930
  -0.144993929056091

and

c5 =
   0.99976918199047515
  -0.16582163562776930
   0.00757183954143367

So the third-order approximation is

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

and the fifth-order approximation is

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

EDIT:

I had a look into approximations with the signed power function, as suggested in the question, but the best approximation is hardly better than the third-order approximation shown above. The approximating function is

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

where the constants were chosen such that f(0)=1 and f(π/2)=0. The power p was optimized to achieve the smallest maximum error in the range [0,π/2]. The optimal value for p was found to be p=2.774. The figure below shows the approximation errors for the third-order approximation (1) and for the new approximation (3):

여기에 이미지 설명을 입력하십시오

The maximum approximation error of the approximation (3) is 4.5e-3, but note that the third-order approximation only exceeds that error close to π/2 and that for the most part its approximation error is actually smaller than the one of the signed power function.

EDIT 2:

If you don't mind division you could also use Bhaskara I's sine approximation formula, which has a maximum approximation error of 1.6e-3:

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

That's very helpful, thanks. This is the first time I've used Octave. I followed most of it, but how did you get the approximation error plots and maximum values?
Guest

1
@Guest: The errors are just b-f3 and b-f5, respectively. Use the plot command to plot them.
Matt L.

1
@Guest: And the maxima you get from max(abs(b-f3)) and max(abs(b-f5)).
Matt L.

@Guest: I played around with the signed power function, but the result is not significantly better than the third-order approximation I had before. Check out my edited answer. As for complexity, would it make such a big difference?
Matt L.

Thanks for looking into it. Complexity isn't a huge deal, just curious how accurate the approximation can get with relatively low complexity. I'm not quite sure how you came up with (3), but it works nicely. I'd need to use 2.752 instead for p, since anything above that will send the peaks over 1 (clipping).
Guest

7

Start with an otherwise general, odd-symmetry 5th-order parameterized polynomial:

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

Now we place some constraints on this function. Amplitude should be 1 at the peaks, in other words f(1)=1. Substituting 1 for x gives:

(1)a0+a1+a2=1

That's one constraint. The slope at the peaks should be zero, in other words f(1)=0. The derivative of f(x) is

a0+3a1x2+5a2x4

and substituting 1 for x gives our second constraint:

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

Now we can use our two constraints to solve for a1 and a2 in terms of a0.

(3)a1=522a0a2=a032

All that's left is to tweak a0 to get a nice fit. Incidentally, a0 (and the slope at the origin) ends up being π2, as we can see from a plot of the function.

Parameter optimization

Below are a number of optimizations of the coefficients, which result in these relative amplitudes of the harmonics compared to the fundamental frequency (1st harmonic):

근사치 비교

In the complex Fourier series:

k=ckei2πPkx,

of a real P-periodic waveform with P=4 and time symmetry about x=1 and with half a period defined by odd function f(x) over 1x1, the coefficient of the kth complex exponential harmonic is:

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

Because of the relationship 2cos(x)=eix+eix (see: Euler's formula), the amplitude of a real sinusoidal harmonic with k>0 is 2|ck|, which is twice that of the magnitude of the complex exponential of the same frequency. This can be massaged to a form which makes it easier for some symbolic mathematics software to simplify the integral:

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|

The above takes advantage of that |eix|=1 for real x. It is easier for some computer algebra systems to simplify the integral by assuming k is real, and to simplify to integer k at the end. Wolfram Alpha can integrate individual terms of the final integral corresponding to the terms of the polynomial f(x). For the coefficients given in Eq. 3 we get amplitude:

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

5th order, continuous derivative

We can solve for the value of a0 that gives equal amplitude 2|ck|of the 3rd and the 5th harmonic. There will be two solutions corresponding to the 3rd and the 5th harmonic having equal or opposite phases. The best solution is the one that minimizes the maximum amplitude of the 3rd and above harmonics and equivalently the maximum relative amplitude of the 3rd and above harmonics compared to the fundamental frequency (1st harmonic):

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.

This gives the fundamental frequency at amplitude 1367961615885π616354π41.000071420 and both the 3rd and the 5th harmonic at relative amplitude 18906 or about 78.99 dB compared to the fundamental frequency. A kth harmonic has relative amplitude (1(1)k)|8177k279425|142496k6.

7th order, continuous derivative

Likewise, the optimal 7th order polynomial approximation with the same initial constraints and the 3rd, 5th, and 7th harmonic at the lowest possible equal level is:

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.

This is the best of four possible solutions corresponding to equal/opposite phase combinations of the 3rd, 5th, and 7th harmonic. The fundamental frequency has amplitude 2293523251200281681925π8405395408π6+108019280π40.9999983752, and the 3rd, 5th, and 7th harmonics have relative amplitude 11555395123.8368 dB compared to the fundamental. A kth harmonic has relative amplitude (1(1)k)|1350241k450674426k2+347960025|597271680k8 compared to the fundamental.

5th order

If the requirement of a continuous derivative is dropped, the 5th order approximation will be more difficult to solve symbolically, because the amplitude of the 9th harmonic will rise above the amplitude of the 3rd, 5th, and the 7th harmonic if those are constrained to be equal and minimized. Testing 16 different solutions corresponding to different subsets of three harmonics from {3,5,7,9} being of equal amplitude and of equal or opposite phases, the best solution is:

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

The fundamental frequency has amplitude 10804305921303695π61827228π4+537160π20.9997773320. The 3rd, 5th, and 9th harmonics have relative amplitude 726377791.52 dB, and the 7th harmonic has relative amplitude 7260833103310027392.6 dB compared to the fundamental. A kth harmonic has relative amplitude (1(1)k)|67145k42740842k2+19555425|33763456k6.

This approximation has a slight corner at the half-cycle boundaries, because the polynomial has zero derivative not at x=±1 but at x±1.002039940. At x=1 the value of the derivative is about 0.004905799828. This results in slower asymptotic decay of the amplitudes of the harmonics at large k, compared to the 5th order approximation that has a continuous derivative.

7th order

A 7th order approximation without continuous derivative can be found similarly. The approach requires testing 120 different solutions and was automated by the Python script at the end of this answer. The best solution is:

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

The fundamental frequency has amplitude 169918012823961602124555703725π83428209113496π6+1336912010480π4155807094720π21.0000024810802368487. The largest relative amplitude of the harmonics above the fundamental is 502400688077133.627 dB. compared to the fundamental. A kth harmonic has relative amplitude (1(1)케이)|162299057케이6+16711400131케이4428526139187케이2+2624451163425|4424948250624케이8.

파이썬 소스

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

이것은 Robert의 답변에 대한 변형이며, 결국 내가 얻은 경로입니다. 다른 사람을 돕기 위해 여기에 남겨두고 있습니다.
Guest

와우, 분석적으로 해결합니다. 방금 MATLAB과 FFT를 사용하고 답을 찾기 위해 일종의 사냥을했습니다.
당신은 매우 잘했다.
robert bristow-johnson 2012

2
실제로 @OlliNiemitalo, 나는 -79 dB가 디지털 신트 사인파 발진기의 구현에 충분하다고 생각합니다. 그것은 톱니의 절대 값에서 쉽게 생성되는 삼각파에 의해 구동 될 수 있으며, 이는 고정 소수점 위상 누산기로 가장 쉽게 생성됩니다.
그 5 차 다항식 사인파와 순수한 사인 사이의 차이를 아무도 듣지 못할 것입니다.
robert bristow-johnson

1
다항식 에프순서를 늘리면 오류를 임의로 줄일 수 있다는 이점이 있습니다. 유리수 함수의 장점은 동일하지만 나눗셈은 곱셈보다 계산 비용이 더 많이 듭니다. 예를 들어 Intel i7에서 단일 스레드는 나누기보다 7-27 배 많은 곱셈과 덧셈을 동시에 수행 할 수 있습니다. 대안을 근사화에프이는 다항식에 해당하는 곱셈과 덧셈을 기본 연산으로 분해하는 것을 의미합니다. 그것들은 사인과 직접 사인을 근사화하도록 최적화 될 수 있습니다에프.
Olli Niemitalo

1
@OlliNiemitalo, 나는 당신이 무슨 뜻인지 알았습니다 ... 나눗셈이 곱셈보다 훨씬 느리다면 (그리고 뿌리 / 분수 지수와 같은 것이 더 나빠질 것이라고 생각합니다), "좋은, 빠른 에프0"어쨌든 테일러 시리즈와 같은 다항식을 고려하여 정리할 것입니다. 어쨌든 근사치이기 때문에 어떤 종류의 싼 근사치가 어느 정도의 정확도에서 다항식 접근법을 능가 할 가능성이 있습니다. 본질적으로 수학 문제로 여겨지는 것에 대한 잡초.
손님

5

당신은 이론적 인 이유나 실용적인 적용을 위해 이것을 묻고 있습니까?

일반적으로 유한 범위에 걸쳐 계산 비용이 비싼 경우 가장 좋은 방법은 일련의 조회 테이블입니다.

한 가지 방법은 가장 적합한 포물선을 사용하는 것입니다.

n = 바닥 (x * N + .5);

d = x * N-n;

i = n + N / 2;

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

0에서 도함수를 사용하지 않고 d에 대한 값 -1/2, 0 및 1/2을 만족시키는 각 지점에서 포물선을 찾아 연속 근사를 보장합니다. 음수 x 값을 처리하기 위해 배열 인덱스 대신 x 값을 이동할 수도 있습니다.

세드

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

후속 조치 :

좋은 근사치를 찾는 데 필요한 노력과 결과는 매우 인상적입니다. 내 지루하고 부드러운 부분 별 포물선 솔루션이 어떻게 비교되는지 궁금합니다. 당연히 훨씬 나아졌습니다. 결과는 다음과 같습니다.

   방법 최소 최대 평균 RMS
  -------- -------- -------- -------- --------
     전력 -8.48842 1.99861 -4.19436 5.27002
    영업 이익 S_3 -2.14675 0.00000 -1.20299 1.40854
     Bhask -1.34370 1.63176 -0.14367 0.97353
     비율 -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.12668
     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
    16 강 -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

이 값은 근사값과 .0001마다 0에서 1까지의 스케일 (0 포함) 사이의 실제 평가 간의 오차의 1000 배를 나타내므로 10001 점을 모두 나타냅니다. 스케일은 0에서π/20에서 1까지의 척도를 사용하는 Olli Niemitalo의 방정식을 제외하고. 열 값은 헤더에서 명확해야합니다. 간격은 .001로 변경되지 않습니다.

"전원"라인은 다음 방정식입니다. 엑스엑스이자형6.

rbj 5 라인은 Matt L의 c5 솔루션과 동일합니다.

16, 32 및 64는 포물선이 맞는 구간 수입니다. 물론 각 구간 경계에서 1 차 도함수에는 중요하지 않은 불연속성이 있습니다. 함수의 값은 연속적입니다. 간격 수를 늘리면 메모리 요구 사항 (및 초기화 시간) 만 증가하고 근사화에 필요한 계산량은 증가하지 않으며 다른 방정식보다 적습니다. 고정 소수점 구현은 이러한 경우 AND를 사용하여 나눗셈을 저장할 수 있기 때문에 2의 제곱을 선택했습니다. 또한 카운트가 테스트 샘플링과 일치하기를 원하지 않았습니다.

Olli Niemitalo의 python 프로그램을 실행하고 이것을 출력물의 일부로 얻었습니다.

누군가 내가 다른 방정식을 포함하기를 원한다면 의견에 알려주십시오.

다음은 조각 별 포물선 근사에 대한 코드입니다. 전체 테스트 프로그램이 게시하기에 너무 깁니다.

# ==================================================== =============================
데프 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-2y) * 2

# ---- 조회 배열 계산

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

        theL0 = 0 (argPieceCount)
        theL1 = 0 (argPieceCount)
        theL2 = 0 (argPieceCount)

        범위 k의 경우 (0, argPieceCount) :
         x = float (k) * theStep

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

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

# ---- 채우기를

        theN = len (argArray)

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

        range (0, theN)의 i의 경우 :
         x = float (i) * theFactor

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

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

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

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

부록

손님을 포함 시켰습니다 에스원래 게시물에서 'OP S_3'으로 기능하고 의견에서 '비율'로 게스트의 두 매개 변수 수식을 사용합니다. 둘 다 0에서 1까지입니다. 비율 1은 런타임 계산이나 조회 테이블 작성에 적합하지 않다고 생각합니다. 결국 일반 sin () 호출보다 CPU에 대한 계산이 훨씬 많습니다. 수학적으로 흥미 롭습니다.


잘 했어! 해당 버그를 수정했습니다 ( "176/120").
Olli Niemitalo

좋은 업데이트, 이것은 나에게 더 의미가 있습니다. 그만큼엑스엑스이자형6 아마도 테스트 할 필요가 없습니다. 이자형내가 이것을 가지고 노는 동안 계속 팝업되는 것처럼 보였습니다. 테스트하기에 더 적합한 합리적 표현은 다음과 같습니다.에프0(엑스)=|엑스|기호(엑스) ; =에프0'(1) ; 에프1(엑스)=에프0(엑스)엑스 ; =1에프1(1) ; 에프2(엑스)=에프1(엑스) ... 지금 약으로 설정해야합니다 22...
게스트

...또는 에프0(엑스)거의 다른 홀수 대칭 함수일 수 있습니다. S 자형은 다음과 같이 잘 작동하는 것 같습니다엑스1엑스+1 (그러나 올바른 값은 물론 찾을 필요가 있습니다). 여기의 줄거리는 ... 올리 언급,이 아마 즉석에서 계산을위한 실제적인 아니지만, 나는 그것이 조회 테이블을 구축하기위한 유용 할 수있을 것 같아요.
손님

더 정확한 2- 파라미터 버전은 0엑스1엑스0엑스+1엑스 꽤 좋아 보인다 과를011109
Guest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.