Tìm các xấp xỉ đa thức của sóng hình sin


16

Tôi muốn ước tính sóng hình sin được cung cấp bởi bằng cách áp dụng một hình thức đa thức cho sóng tam giác đơn giản , được tạo bởi hàmsin(πx)

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

trong đó là phần phân số của :mod(x,1)x

mod(x,y)y(xyxy)

Một loạt Taylor có thể được sử dụng như một waveshaper.

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

Với các chức năng trên, S1(T(x)) sẽ giúp chúng ta có được xấp xỉ khá tốt về sóng hình sin. Nhưng chúng ta cần phải đi lên đến sức mạnh thứ 7 của loạt bài để có kết quả hợp lý, và các đỉnh hơi thấp và sẽ không có độ dốc chính xác bằng không.

Thay vì loạt Taylor, chúng ta có thể sử dụng một waveshaper đa thức theo một vài quy tắc.

  • Phải đi qua -1, -1 và + 1, + 1.
  • Độ dốc tại -1, -1 và + 1, + 1 phải bằng không.
  • Phải đối xứng.

Một chức năng đơn giản đáp ứng yêu cầu của chúng tôi:

S2(x)=3x2x32

Các đồ thị của S2(T(x))sin(πx) khá gần nhau, nhưng không gần bằng loạt Taylor. Ở giữa các đỉnh và điểm giao nhau bằng 0, chúng rõ ràng lệch một chút. Một chức năng nặng hơn và chính xác hơn đáp ứng yêu cầu của chúng tôi:

S3(x)=x(x25)216

Điều này có lẽ đủ gần với mục đích của tôi, nhưng tôi vẫn tự hỏi liệu một chức năng khác có tồn tại gần đúng với sóng hình sin hơn không, và có tính toán rẻ hơn. Tôi có một nắm bắt khá tốt về cách tìm các hàm đáp ứng ba yêu cầu trên, nhưng tôi không chắc chắn về cách tìm các hàm đáp ứng các yêu cầu đó và cũng phù hợp nhất với sóng hình sin.

Phương pháp nào tồn tại để tìm đa thức bắt chước sóng hình sin (khi áp dụng cho sóng tam giác)?


Để làm rõ, tôi không nhất thiết chỉ tìm kiếm các đa thức đối xứng lẻ, mặc dù đó là những lựa chọn đơn giản nhất.

Một cái gì đó giống như chức năng sau đây cũng có thể phù hợp với nhu cầu của tôi:

S4(x)=3x2+x24+x44

Điều này đáp ứng các yêu cầu trong phạm vi tiêu cực và cũng có thể sử dụng giải pháp từng phần để áp dụng nó cho phạm vi tích cực; ví dụ

3x2-P(x,2)4-P(x,4)4

Trong đó là hàm công suất đã ký .P

Tôi cũng quan tâm đến các giải pháp sử dụng hàm năng lượng đã ký để hỗ trợ các số mũ phân số, vì điều này mang lại cho chúng ta một "núm vặn" khác mà không cần thêm hệ số khác.

một0x +một1P(x, p1)

Với các hằng số đúng, điều này có khả năng có được độ chính xác rất tốt mà không cần độ nặng của đa thức bậc 5 hoặc bậc bảy. Dưới đây là một ví dụ đáp ứng các yêu cầu được mô tả ở đây bằng cách sử dụng một số hằng số được chọn thủ công: .một0= =1.666¯,một1= =-0.666¯,p1= =2,5

5x-2P(x, 52)3

Trên thực tế, các hằng số đó rất gần với và và . Cắm những thứ đó vào sẽ cho thứ gì đó trông cực kỳ gần với sóng hình sin. 1-ππ2 đ1-π2e

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

Nói cách khác, trông rất gần với trong khoảng từ 0,0 đến π / 2,1. Bất kỳ suy nghĩ về tầm quan trọng của điều này? Có lẽ một công cụ như Octave có thể giúp khám phá các hằng số "tốt nhất" cho phương pháp này. tội(x)x-xe6tội(x)


1
Vì vậy, định nghĩa thuật ngữ lỗi của bạn cho "gần gũi hơn" là gì? Theo như tôi có thể nói, chuỗi Taylor mà bạn trích dẫn là sai số L² tối thiểu gần đúng cho số lượng hệ số hữu hạn. (Tôi nghĩ vậy.)
Marcus Müller

2
Nhân tiện, mục tiêu của bạn là gì? Nó thực sự có thể giúp cho chúng tôi biết lý do tại sao bạn đang tìm kiếm một máy tạo sóng đa thức, trên cơ sở công nghệ nào và mục tiêu chính của bạn là gì cho gần đúng.
Marcus Müller

@ MarcusMüller Tôi sẵn sàng hy sinh tính chính xác của loạt Taylor cho một thứ rẻ hơn đáng kể, nếu nó không thể phân biệt được từ sóng hình sin đến tai người. Các đỉnh của xấp xỉ chuỗi Taylor cũng làm phiền tôi. Tôi quan tâm đến việc tìm kiếm một cái gì đó "gần gũi" hơn hai chức năng khác mà tôi đã liệt kê. Tôi nghi ngờ nó sẽ không rẻ hơn . S2
Khách

1
"Tai người" rất quan trọng ở đây :) Tại sao các đỉnh "làm phiền" bạn? Một lần nữa: cho chúng tôi một ý tưởng về lý do tại sao / cho mục đích gì và theo những hạn chế nào bạn đang làm điều này. Không có đủ nền tảng câu hỏi của bạn chỉ đơn giản là quá rộng để được trả lời đúng!
Marcus Müller

1
Tại sao bạn bắt đầu với một sóng tam giác? Máy phát điện hình sin rất đơn giản và phổ biến, sóng vuông được lọc một cách tầm thường đến sóng hài cơ bản, v.v.
Carl Witthoft

Câu trả lời:


10

khoảng một thập kỷ trước tôi đã làm điều này cho một công ty tổng hợp âm nhạc không tên, người có R & D không quá xa căn hộ của tôi ở Waltham MA. (không thể tưởng tượng họ là ai.) Tôi không có hệ số.

nhưng hãy thử điều này:

f(x)tội(π2x)cho -1x+1= =π2x(một0+một1x2+một2x4)

điều này đảm bảo rằng .f(-x)= =-f(x)

Để đảm bảo rằng thìf'(x)|x= =±1= =0

f'(x)= =π2(một0+3một1x2+5một2x4)

(1)một0+3một1+5một2= =0

Đó là hạn chế đầu tiên. Để đảm bảo rằng , sau đó|f(±1)|= =1

(2)một0+một1+một2= =2π

Đó là hạn chế thứ hai. Loại bỏ và giải các phương trình. (1) và (2) cho về (được trái để điều chỉnh):a 2 a 1một0một2một1

một0= =52π-12một1

một2= =-12π-12một1

Bây giờ bạn chỉ còn một hệ số, , còn lại để vòng để có hiệu suất tốt nhất:một1

f(x)= =π2x((52π-12một1)+một1x2-(12π+12một1)x4)

Đây là cách tôi sẽ vòng để có hiệu suất tốt nhất cho bộ tạo dao động sóng hình sin. Tôi sẽ điều chỉnh sử dụng ở trên tính đối xứng của sóng hình sin khoảng và đặt chính xác toàn bộ một chu kỳ trong một bộ đệm với sức mạnh của hai số điểm (giả sử 128, tôi không quan tâm) và chạy FFT trên đó chu kỳ hoàn hảo. x = 1một1x= =1

Thùng kết quả FFT 1 sẽ là điểm mạnh của sin và nên ở khoảng . Bây giờ bạn có thể điều chỉnh để đưa biến dạng sóng hài thứ 3 lên và xuống. Tôi sẽ bắt đầu với sao cho . Đó là trong thùng 3 của kết quả FFT Nhưng biến dạng sóng hài thứ 5 (giá trị trong thùng 5) sẽ có hậu quả (nó sẽ tăng lên khi sóng hài thứ 3 đi xuống). Tôi sẽ điều chỉnh để cường độ của mức hài bậc 5 bằng với mức hài bậc 3. Nó sẽ ở khoảng -70 dB từ sóng hài thứ 1 (như tôi nhớ lại). Đó sẽ là sóng hình sin đẹp nhất từ ​​một đa thức rẻ tiền, 3 hệ số, bậc 5, đối xứng lẻ.một 1 một 15N/2một1một01một1một15π-2một01một1

Một số người khác có thể viết mã MATLAB. âm thanh này như thế nào với bạn?


Tôi chắc chắn sẽ không có thời gian để thực hiện MATLABing để tìm kiếm tối ưu để sóng hài thứ 3 bằng với sóng hài thứ 5, thấp hơn khoảng 70 dB so với mức cơ bản (sóng hài thứ 1). người khác cần phải làm điều đó. lấy làm tiếc. một1
robert bristow-johnson

Câu trả lời tuyệt vời, vẫn tiêu hóa nó. Trên thực tế bắt đầu tự hỏi nếu nó cần phải là một đa thức 3 hệ số, bậc 5, đối xứng lẻ ... f '(x) của bạn có thực sự là f (x) và là một thỏa thuận từng phần 0 không? Phác thảo thô ở đây . Có lẽ đây là những gì Ced có trong tâm trí? Vẫn bắt kịp các bạn.
Khách

Đây là một cách tiếp cận đẹp. Tôi tự hỏi nếu thay vì lấy FFT và giải quyết lặp đi lặp lại, bạn có thể tạo các đa thức ba và thứ năm từ , sau đó đánh đồng hai và giải cho không? a 1f(x)một1
Tốc độ

Phải ngủ một nửa khi tôi đăng "bản phác thảo" đó, tôi có ý định làm một cái gì đó như thế này , nhưng đã sửa để chạy qua ± 1 và có độ dốc bằng không (chỉ cần lấy đạo hàm, mân mê nó, tích hợp lại). Không chắc chắn nếu có bất kỳ lợi thế nào so với đơn hàng thứ năm, chỉ là điều tôi chưa xem xét.
Khách

1
Đây thực sự là một giải pháp tuyệt vời, chỉ mất một lúc để chìm đắm. Tôi hy vọng việc đánh dấu nó đúng sẽ không ngăn người khác đến và viết mã.
Khách

9

Điều thường được thực hiện là một xấp xỉ tối thiểu hóa một số chỉ tiêu của lỗi, thường là -norm (trong đó lỗi tối đa được giảm thiểu) hoặc -norm (trong đó lỗi bình phương trung bình được giảm thiểu). -appro xấp xỉ được thực hiện bằng cách sử dụng thuật toán trao đổi Remez . Tôi chắc rằng bạn có thể tìm thấy một số mã nguồn mở thực hiện thuật toán đó. Tuy nhiên, trong trường hợp này tôi nghĩ rằng việc ưu hóa l_2 rất đơn giản (rời rạc) là đủ. Hãy xem xét một số mã Matlab / Octave và kết quả: L 2 L l 2LL2Ltôi2

x = không gian (0, pi / 2.300); % lưới trên [0, pi / 2]
x = x (:);
% hệ thống quá hạn của phương trình tuyến tính
% (chỉ sử dụng quyền hạn lẻ)
A3 = [x, x. ^ 3];
A5 = [x, x. ^ 3, x. ^ 5];
b = sin (x);
% giải theo nghĩa l2
c3 = A3 \ b;
c5 = A5 \ b;
f3 = A3 * c3; % Xấp xỉ bậc 3
f5 = A5 * c5; % Xấp xỉ thứ 5

Hình dưới đây cho thấy các lỗi xấp xỉ cho tự và cho các xấp xỉ -order. Các lỗi xấp xỉ tối đa là và , tương ứng. 5 t h3rd5th8.8869e-031.5519e-04

nhập mô tả hình ảnh ở đây

Các hệ số tối ưu là

c3 =
   0,988720369237930
  -0.144993929056091

c5 =
   0,99996918199048515
  -0.16582163562776930
   0,0075183954143367

Vì vậy, xấp xỉ bậc ba là

(1)tội(x)0,988720369237930x-0.144993929056091x3,x[-π/2,π/2]

và xấp xỉ bậc 5 là

(2)tội(x)0,99996918199048515x-0.16582163562776930x3+0,0075183954143367x5,x[-π/2,π/2]

BIÊN TẬP:

Tôi đã xem xét các xấp xỉ với hàm công suất đã ký, như được đề xuất trong câu hỏi, nhưng xấp xỉ tốt nhất hầu như không tốt hơn so với xấp xỉ bậc ba được hiển thị ở trên. Hàm gần đúng là

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

trong đó các hằng số được chọn sao cho và . Công suất được tối ưu hóa để đạt được lỗi tối đa nhỏ nhất trong phạm vi . Giá trị tối ưu cho được tìm thấy là . Hình dưới đây cho thấy các lỗi xấp xỉ cho xấp xỉ bậc ba và cho xấp xỉ mới :f'(0)= =1f'(π/2)= =0p[0,π/2]pp= =2.774(1)(3)

nhập mô tả hình ảnh ở đây

Lỗi xấp xỉ tối đa của xấp xỉ là , nhưng lưu ý rằng xấp xỉ bậc ba chỉ vượt quá sai số đó gần bằng π / 2 và đối với hầu hết các lỗi xấp xỉ của nó thực sự nhỏ hơn một trong các hàm công suất đã ký.(3)4.5e-3π/2

EDIT 2:

Nếu bạn không phân chia, bạn cũng có thể sử dụng công thức xấp xỉ sin của Bhaskara I , có lỗi xấp xỉ tối đa là 1.6e-3:

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

Điều đó rất hữu ích, cảm ơn. Đây là lần đầu tiên tôi sử dụng Octave. Tôi đã làm theo hầu hết, nhưng làm thế nào bạn có được các ô lỗi gần đúng và các giá trị tối đa?
Khách

1
@Guest: Các lỗi chỉ là b-f3b-f5, tương ứng. Sử dụng plotlệnh để vẽ chúng.
Matt L.

1
@Guest: Và cực đại bạn nhận được từ max(abs(b-f3))max(abs(b-f5)).
Matt L.

@Guest: Tôi đã chơi xung quanh với chức năng sức mạnh đã ký, nhưng kết quả không tốt hơn đáng kể so với xấp xỉ bậc ba mà tôi có trước đây. Kiểm tra câu trả lời chỉnh sửa của tôi. Đối với sự phức tạp, nó sẽ làm cho một sự khác biệt lớn như vậy?
Matt L.

Cảm ơn vì đã điều tra việc này. Độ phức tạp không phải là một vấn đề lớn, chỉ tò mò mức độ chính xác có thể đạt được với độ phức tạp tương đối thấp. Tôi không chắc chắn làm thế nào bạn nghĩ ra (3), nhưng nó hoạt động tốt. Tôi cần sử dụng 2.752 thay thế p, vì bất cứ điều gì ở trên sẽ gửi các đỉnh trên 1 (cắt).
Khách

7

Bắt đầu với một đa thức tham số bậc 5, đối xứng bậc 5 khác nhau:

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

Bây giờ chúng tôi đặt một số ràng buộc về chức năng này. Biên độ nên là 1 tại các đỉnh, nói cách khác f(1)=1 . Thay thế 1 cho x cho:

(1)a0+a1+a2=1

Đó là một hạn chế. Độ dốc tại các đỉnh núi nên không, hay nói cách khác f(1)=0 . Đạo hàm của f(x)

a0+3a1x2+5a2x4

và thay thế 1 cho x đưa ra ràng buộc thứ hai của chúng tôi:

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

Bây giờ chúng ta có thể sử dụng hai khó khăn của chúng tôi để giải quyết cho a1a2 về a0 .

(3)a1=522a0a2=a032

Tất cả những gì còn lại là để tinh chỉnh a0 để có được một sự phù hợp thoải mái. Ngẫu nhiên, a0 (và độ dốc tại gốc) kết thúc lên được π2 , như chúng ta có thể thấy từ mộtâm mưucủa hàm.

Tối ưu hóa thông số

Dưới đây là một số tối ưu hóa của các hệ số, dẫn đến các biên độ tương đối của các sóng hài so với tần số cơ bản (sóng hài thứ 1):

So sánh các xấp xỉ

Trong loạt Fourier phức tạp :

k=ckei2πPkx,

của P- dạng sóng định kỳ có P=4 và đối xứng thời gian khoảng x=1 và với nửa chu kỳ được xác định bởi hàm lẻ f(x) trên 1x1, hệ số của sóng hài bậc mũ phức tạp thứ kth là:

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

Do mối quan hệ 2cos(x)=eix+eix (xem: Công thức của Euler ), biên độ của một sóng hài hình sin thực với k>02|ck|, gấp hai lần độ lớn của số mũ phức tạp của cùng tần số. Điều này có thể được tạo thành một dạng giúp cho một số phần mềm toán học tượng trưng dễ dàng hơn để đơn giản hóa tích phân:

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|

Ở trên tận dụng lợi thế đó |eix|=1 cho x. thực . Một số hệ thống đại số máy tính sẽ dễ dàng hơn để đơn giản hóa tích phân bằng cách giả sử k là số thực và đơn giản hóa thành số nguyên k ở cuối. Wolfram Alpha có thể tích hợp các số hạng riêng của tích phân cuối cùng tương ứng với các số hạng của đa thức f(x) . Đối với các hệ số đã cho trong phương trình. 3 chúng tôi nhận được biên độ:

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

Lệnh thứ 5, đạo hàm liên tục

Chúng tôi có thể giải quyết cho giá trị của a0 cung cấp cho biên độ bằng 2|ck|của hài bậc 3 và 5. Sẽ có hai giải pháp tương ứng với sóng hài bậc 3 và bậc 5 có các pha bằng hoặc ngược nhau. Giải pháp tốt nhất là giải pháp giảm thiểu biên độ cực đại của sóng hài bậc 3 trở lên và tương đương biên độ tương đối lớn nhất của sóng hài bậc 3 trở lên so với tần số cơ bản (sóng hài bậc 1):

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.

1367961615885π616354π41.0000714201890678.99 dBkth(1(1)k)|8177k279425|142496k6.

Lệnh thứ 7, đạo hàm liên tục

Tương tự, xấp xỉ đa thức bậc 7 tối ưu với cùng các ràng buộc ban đầu và điều hòa thứ 3, 5 và 7 ở mức bằng nhau thấp nhất có thể là:

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.

2293523251200281681925πsố 8-405395408π6+108019280π40,999983752,11555395-123.8368 dBkthứ tự(1-(-1)k)|1350241k4-50674426k2+347960025|597271680ksố 8

Đơn hàng thứ 5

{3,5,7,9}

f(x)= =một0x1+một1x3+một2x5một0= =1-một1-một21.570034357một1= =3×(2436304π2-2172825π4)số 8×(1303695π4-1827228π2+537160)-0,6425216143một2= =1303695π416×(1303695π4-1827228π2+537160)0,07248725712

10804305921303695π6-1827228π4+537160π20,9977773320.7263777-91,52 dB,7260833103310027392.6 dBkth(1(1)k)|67145k42740842k2+19555425|33763456k6.

x=±1x±1.002039940.x=10.004905799828k,

Đơn hàng thứ 7

Một xấp xỉ bậc 7 mà không có đạo hàm liên tục có thể được tìm thấy tương tự. Cách tiếp cận yêu cầu thử nghiệm 120 giải pháp khác nhau và được kịch bản Python tự động hóa ở cuối câu trả lời này. Giải pháp tốt nhất là:

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

169918012823961602124555703725π83428209113496π6+1336912010480π4155807094720π21.0000024810802368487.502400688077133.627 dB.kth(1(1)k)|162299057k6+16711400131k4428526139187k2+2624451163425|4424948250624k8.

Nguồn 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

Đây là một biến thể trong câu trả lời của Robert và là con đường cuối cùng tôi đã đi. Tôi sẽ để nó ở đây trong trường hợp nó giúp được ai khác.
Khách

wow, giải quyết nó một cách phân tích. Tôi sẽ chỉ sử dụng MATLAB và một FFT và tìm kiếm câu trả lời.
Bạn đã làm rất tốt.
robert bristow-johnson

2
Trên thực tế @OlliNiemitalo, tôi nghĩ rằng -79 dB là đủ tốt để thực hiện bộ tạo dao động sóng hình sin tổng hợp kỹ thuật số. nó có thể được điều khiển bởi một sóng tam giác, được tạo ra dễ dàng từ giá trị abs của răng cưa, dễ dàng được tạo ra nhất với bộ tích lũy pha điểm cố định.
không ai sẽ nghe thấy một sự khác biệt giữa sóng hình sin đa thức bậc 5 đó và một hình sin thuần túy.
robert bristow-johnson

1
fff

1
f0

5

Bạn đang hỏi điều này vì lý do lý thuyết hoặc một ứng dụng thực tế?

Thông thường, khi bạn có một hàm đắt để tính toán trên một phạm vi hữu hạn, câu trả lời tốt nhất là một tập hợp các bảng tra cứu.

Một cách tiếp cận là sử dụng parabolas phù hợp nhất:

n = sàn (x * N + .5);

d = x * N - n;

i = n + N / 2;

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

Bằng cách tìm parabol tại mỗi điểm đáp ứng các giá trị cho d là -1/2, 0 và 1/2, thay vì sử dụng các đạo hàm ở 0, bạn đảm bảo xấp xỉ liên tục. Bạn cũng có thể thay đổi giá trị x, thay vì chỉ mục mảng để xử lý các giá trị x âm của bạn.

Ced

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

Theo sát:

Số lượng nỗ lực và kết quả đã đi vào việc tìm kiếm các xấp xỉ tốt là rất ấn tượng. Tôi tò mò không biết giải pháp parabol piecewise nhàm chán và nhạt nhẽo của tôi sẽ so sánh như thế nào. Không ngạc nhiên, nó làm tốt hơn nhiều. Đây là kết quả:

   Phương pháp RMS tối thiểu trung bình tối đa
  -------- -------- -------- -------- --------
     Công suất -8.48842 1.99861 -4.19436 5.27002
    OP S_3 -2.14675 0,00000 -1,2099 1,40854
     Bhask -1.34370 1.63176 -0,14367 0,97353
     Tỷ lệ -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

π/2

x-xe6

Dòng rbj 5 giống như giải pháp c5 của Matt L.

16, 32 và 64 là số lượng các khoảng có khớp parabol. Tất nhiên, có sự không liên tục không đáng kể trong đạo hàm đầu tiên tại mỗi ranh giới khoảng. Các giá trị của hàm là liên tục mặc dù. Việc tăng số lượng các khoảng chỉ làm tăng các yêu cầu bộ nhớ (và thời gian khởi tạo), nó không làm tăng số lượng tính toán cần thiết cho phép tính gần đúng, ít hơn bất kỳ phương trình nào khác. Tôi đã chọn quyền hạn của hai vì việc thực hiện điểm cố định có thể cứu một bộ phận bằng cách sử dụng AND trong các trường hợp như vậy. Ngoài ra, tôi không muốn số lượng tương xứng với mẫu thử nghiệm.

Tôi đã chạy chương trình trăn của Olli Niemitalo và nhận được điều này như một phần của bản in: "Giải pháp ứng cử viên 176 trên 120" Tôi nghĩ đó là điều kỳ lạ, vì vậy tôi đang đề cập đến nó.

Nếu bất cứ ai muốn tôi bao gồm bất kỳ phương trình khác, xin vui lòng cho tôi biết trong các ý kiến.

Đây là mã cho các xấp xỉ parabol của piecewise. Toàn bộ chương trình thử nghiệm là quá dài để đăng.

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

# y = quảng cáo ^ 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

# ---- Tính toán Mảng tra cứu

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

        theL0 = số không (argPieceCount)
        theL1 = số không (argPieceCount)
        theL2 = số không (argPieceCount)

        cho k trong phạm vi (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

# ---- Làm điền

        theN = len (argArray)

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

        cho i trong phạm vi (0, theN):
         x = float (i) * theFactor

         kx = x / Bước
         k = int (kx + .5)
         d = kx - k

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

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

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

Phụ lục

S3


Làm tốt lắm! Tôi đã sửa lỗi đó ("176 of 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

một0x-một1xmột0x+một1x một013một1109
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.