Нахождение полиномиальных приближений синусоиды


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-й степени серии, чтобы получить разумный результат, и пики немного низкие и не будут иметь наклон ровно ноль.S1(T(x))

Вместо ряда Тейлора мы могли бы использовать полиномиальный формирователь волн, следуя нескольким правилам.

  • Должны пройти через -1, -1 и + 1, + 1.
  • Наклон в -1, -1 и + 1, + 1 должен быть нулевым.
  • Должен быть симметричным.

Простая функция, отвечающая нашим требованиям:

S2(x)=3x2x32

Графики S2(T(x)) и sin(πx) довольно близки, но не так близки, как ряд Тейлора. Между пиками и переходами через нуль они заметно отклоняются. Более тяжелая и точная функция, отвечающая нашим требованиям:

S3(x)=x(x25)216

Это, вероятно, достаточно близко для моих целей, но я задаюсь вопросом, существует ли другая функция, которая более близко приближает синусоидальную волну и в вычислительном отношении дешевле. Я довольно хорошо разбираюсь в том, как найти функции, удовлетворяющие трем требованиям выше, но я не уверен, как найти функции, которые отвечают этим требованиям, а также наиболее точно соответствуют синусоиде.

Какие существуют методы поиска полиномов, которые имитируют синусоидальную волну (применительно к треугольной волне)?


Чтобы уточнить, я не обязательно ищу только нечетно-симметричные полиномы, хотя это самый простой выбор.

Нечто подобное следующей функции может также соответствовать моим потребностям:

S4(x)=3x2+x24+x44

Это соответствует требованиям в отрицательном диапазоне, и кусочное решение может быть использовано, чтобы применить его и к положительному диапазону; например

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

где P - подписанная степенная функция .

Я также был бы заинтересован в решениях, использующих функцию степеней со знаком для поддержки дробных показателей, поскольку это дает нам еще одну «ручку кручения» без добавления другого коэффициента.

a0x +a1P(x, p1)

Учитывая правильные константы, это может потенциально получить очень хорошую точность без тяжести полиномов пятого или седьмого порядка. Ниже приведен пример выполнения требований , описанных здесь , с использованием некоторых подобранных констант: 0 = 1. ¯ 666 , 1 = - 0. ¯ 666 , р 1 = 2,5 .a0=1.666¯,a1=0.666¯,p1=2.5

5x2P(x, 52)3

На самом деле эти константы очень близки к π2 , а1π2 иe. Включение в них дает то, чтовыглядиточень близко к синусоиде.

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

Другими словами, выглядит очень близко кsin(x)между 0,0 и π / 2,1. Есть мысли о значении этого? Возможно, такой инструмент, как Octave, поможет найти «лучшие» константы для этого подхода.xxe6sin(x)


1
Итак, какова ваша ошибка определения термина для «более близко»? Насколько я могу судить, процитированная вами серия Тейлора - это минимальная ошибка L², приближенная для конечного числа коэффициентов. (Я думаю.)
Маркус Мюллер

2
Какова, кстати, ваша цель? Это может действительно помочь нам сказать, почему вы ищете формирователь полиномиальной волны, на какой технологической основе и каковы ваши основные цели для приближения.
Маркус Мюллер

@ MarcusMüller Я готов пожертвовать точностью серии Тейлора ради чего-то значительно более дешевого, если оно неразличимо от синусоиды до человеческого уха. Пики приближения ряда Тейлора также меня беспокоят. Я заинтересован в поиске чего-то «более близкого», чем две другие функции, которые я перечислил. Я подозреваю, что это не станет дешевле, чем . S2
Гость

1
Критическое значение здесь имеет «человеческое ухо» :) Почему пики «беспокоят» вас? Опять же: дайте нам представление о том, почему / для каких целей и при каких ограничениях вы это делаете. Без достаточного фона ваш вопрос просто слишком широк, чтобы на него правильно ответить!
Маркус Мюллер

1
Почему вы начинаете с треугольной волны? Синус-генераторы просты и распространены, прямоугольные волны тривиально фильтруются до основной гармоники и т. Д.
Карл Виттофт

Ответы:


10

Около десяти лет назад я сделал это для неназванной музыкальной компании, которая занималась исследованиями и разработками недалеко от моей квартиры в Уолтеме, штат Массачусетс. (не могу представить, кто они.) У меня нет коэффициентов.

но попробуйте это:

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

это гарантирует, что .f(x)=f(x)

Чтобы гарантировать, что тогдаf(x)|x=±1=0

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)k)|162299057k6+16711400131k4428526139187k2+2624451163425|4424948250624k8.

Python source

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

Это вариант ответа Роберта, и я выбрал тот путь, который я в итоге выбрал. Я оставляю это здесь на случай, если это поможет кому-то еще.
Гость

вау, решая это аналитически. Я бы просто использовал MATLAB и БПФ и Сорта охоты вокруг для ответа.
ты очень хорошо справился
Роберт Бристоу-Джонсон

2
на самом деле @OlliNiemitalo, я думаю -79 дБ достаточно для реализации цифрового синтезатора синусоидальных колебаний. он может управляться треугольной волной, которая легко генерируется из величины abs пилообразного сигнала, который легче всего генерируется с помощью фазового аккумулятора с фиксированной точкой.
никто не услышит разницы между этой синусоидальной волной 5-го порядка и чистым синусом.
Роберт Бристоу-Джонсон

1
Полиномы вообще как еиметь преимущество в том, что при увеличении порядка ошибка может быть сделана сколь угодно малой. Рациональные функции имеют то же преимущество, но вычисление, как правило, обходится дороже, чем умножение. Например, в Intel i7 один поток может сделать в 7-27 раз больше умножений и сложений, чем делений за одно время. Аппроксимируя некоторую альтернативуеозначает разложение его на элементарные операции, как правило, умножения и сложения, которые всегда равны полиномам. Они могут быть оптимизированы, чтобы приблизить синус непосредственно по сравнению с черезе,
Олли Нимитало,

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;

Найдя параболу в каждой точке, которая соответствует значениям d, равным -1/2, 0 и 1/2, вместо использования производных в 0, вы обеспечите непрерывную аппроксимацию. Вы также можете сместить значение x вместо индекса массива, чтобы справиться с отрицательными значениями x.

CED

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

Следовать за:

Количество усилий и результаты, которые пошли на поиск хороших приближений, очень впечатляют. Мне было любопытно, как мое скучное и мягкое кусочно-параболическое решение будет сравниваться. Не удивительно, что это намного лучше. Вот результаты:

   Метод Минимальное Максимальное Среднее СКО
  -------- -------- -------- -------- --------
     Мощность -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
    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

Значения представляют 1000-кратную ошибку между аппроксимацией и фактической оценкой каждые 0,0001 по шкале от 0 до 1 (включительно), таким образом, всего 10001 балл. Шкала преобразуется для оценки функций от 0 доπ/2за исключением уравнений Олли Нимитало, которые используют шкалу от 0 до 1. Значения столбцов должны быть понятны из заголовков. Результаты не меняются с интервалом 0,001.

Линия «Power» - это уравнение: Икс-Иксе6,

Линия rbj 5 совпадает с решением Мэтта Л с5.

16, 32 и 64 - это количество интервалов, которые имеют параболические припадки. Конечно, существуют незначительные разрывы в первой производной на каждой границе интервала. Значения функции непрерывны, хотя. Увеличение количества интервалов только увеличивает требования к памяти (и время инициализации), но не увеличивает объем вычислений, необходимых для аппроксимации, который меньше, чем у любого другого уравнения. Я выбрал степень двойки, потому что реализация с фиксированной запятой может спасти деление с помощью AND в таких случаях. Кроме того, я не хотел, чтобы количество было соизмеримо с пробной выборкой.

Я запустил программу Python Олли Нимитало и получил ее как часть распечатки: «Кандидатское решение 176 из 120». Я подумал, что это странно, поэтому я упоминаю об этом.

Если кто-то хочет, чтобы я включил любое другое уравнение, пожалуйста, дайте мне знать в комментариях.

Вот код для кусочно-параболических приближений. Вся тестовая программа слишком длинна для публикации.

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

# ---- Рассчитать массивы поиска

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

        theL0 = нули (argPieceCount)
        theL1 = нули (argPieceCount)
        theL2 = нули (argPieceCount)

        для k в диапазоне (0, argPieceCount):
         x = float (k) * theStep

         ym = грех (x - theHalf)
         у = грех (х)
         yp = грех (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)

        для я в диапазоне (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

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

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

Appendum

Я включил Гость S3функция из исходного поста как "OP S_3" и формула двух параметров Гостя из комментариев как "Соотношение". Оба по шкале от 0 до 1. Я не думаю, что Ratio подходит для расчетов во время выполнения или для построения справочной таблицы. В конце концов, это значительно больше вычислений для процессора, чем просто вызов sin (). Это математически интересно, хотя.


Хорошая работа! Я исправил эту ошибку ("176 из 120").
Олли Нимитало

Хорошее обновление, это имеет больше смысла для меня сейчас. Икс-Иксе6 вероятно, не нужно проверять, я просто выбросил это, потому что я пытался выяснить значение екоторый, казалось, продолжал появляться, пока я играл с этим. Лучшее рациональное выражение для проверки может быть примерно таким:е0(Икс)знак равно|Икс|aподписать(Икс) ; бзнак равное0'(1) ; е1(Икс)знак равное0(Икс)-бИкс ; сзнак равно1е1(1) ; е2(Икс)знак равное1(Икс)с ... сейчас a должно быть установлено около 223...
Гость

...или е0(Икс)может быть практически любой другой нечетно-симметричной функцией; сигмоиды, кажется, работают хорошо, какaИкс-1aИкс+1 (но тогда правильное значение для aнужно найти, конечно). Вот сюжет ... как упоминает Олли, это, вероятно, непрактично для вычислений на лету, но я думаю, что это может быть полезно для построения справочной таблицы.
Гость

Или более точная версия с двумя параметрами, a0Икс-a1Иксa0Икс+a1Икс выглядит довольно хорошо сa013 и a1109
Гость
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.