Giải phương trình tứ


10

Có một triển khai C mở cho giải pháp phương trình tứ phân:

ax+bx³+cx²+dx+e=0

Tôi đang nghĩ đến việc thực hiện giải pháp của Ferrari. Trên Wikipedia tôi đọc rằng giải pháp này chỉ ổn định về mặt tính toán đối với một số tổ hợp dấu hiệu có thể có của các hệ số. Nhưng có lẽ tôi may mắn ... Tôi đã có một giải pháp thực tế bằng cách giải quyết một cách phân tích bằng cách sử dụng hệ thống đại số máy tính và xuất sang C. Nhưng nếu có một triển khai thử nghiệm, tôi thích sử dụng nó. Tôi tìm kiếm một phương pháp nhanh và không muốn sử dụng một công cụ tìm root chung.

Tôi chỉ cần giải pháp thực sự.


Bạn có cần tất cả các giải pháp (thực tế) đồng thời? Như GertVdE nói dưới đây, nếu bạn gặp vấn đề về tính ổn định với giải pháp dạng đóng, thực sự không có lý do chính đáng để không sử dụng một số thuật toán tìm kiếm gốc.
Godric Seer

3
Tôi thấy buồn cười vì điều này đã được gắn thẻ phi đại số, vì bạn có thể chỉ cần tính toán giá trị riêng của ma trận đồng hành, vốn đã ở dạng Hessenberg và áp dụng quét QR sẽ khá đơn giản.
Victor Liu

2
Có một cái nhìn về các bộ giải khối / tứ phân được xuất bản trong ACM TOMS (Thuật toán 954) . Mã làm cho nó vào tạp chí đó thường có chất lượng rất cao. Bản thân giấy đứng sau một paywall nhưng mã có thể được tải xuống từ liên kết này .
GoHokies

... (chỉnh sửa sau) mã ACM được viết bằng FORTRAN 90 nhưng ấn tượng đầu tiên của tôi là người ta có thể gọi nó từ C mà không cần nỗ lực nhiều.
GoHokies

1
@GoHokies Tôi nghĩ bạn nên chuyển nhận xét của mình thành câu trả lời vì tôi nghĩ đó là một câu trả lời hay cho câu hỏi này. Đặc biệt là vì bài báo được liên kết quản lý để tránh sự mất ổn định số thông thường, và đó hoàn toàn không phải là một việc nhỏ.
Kirill

Câu trả lời:


20

Tôi sẽ khuyên bạn không nên sử dụng các giải pháp dạng đóng vì chúng có xu hướng rất không ổn định. Bạn cần hết sức cẩn thận trong cách thức và thứ tự các đánh giá của bạn về phân biệt đối xử và các thông số khác.

Ví dụ cổ điển là một ví dụ cho phương trình bậc hai . Tính toán gốc là sẽ khiến bạn gặp rắc rối với đa thức trong đó kể từ đó bạn bị hủy trong tử số. Bạn cần tính .x 1 , 2 = - b ± ax2+bx+c=0 b»4mộtcx1=-(b+sign(b)

x1,2=b±b24ac2a
b4ac
x1=(b+sign(b)b24ac)2a;x2=ca1x1

Higham trong kiệt tác "Độ chính xác và ổn định của thuật toán số" (tái bản lần 2, SIAM) sử dụng phương pháp tìm kiếm trực tiếp để tìm các hệ số của một đa thức bậc ba mà giải pháp khối phân tích cổ điển cho kết quả rất không chính xác. Ví dụ anh ta đưa ra là . Đối với đa thức này, các rễ được phân tách tốt và do đó vấn đề không phải là điều hòa. Tuy nhiên, nếu anh ta tính toán các gốc bằng cách sử dụng phương pháp phân tích và đánh giá đa thức trong các gốc này, anh ta thu được phần dư của trong khi sử dụng phương pháp chuẩn ổn định (phương pháp ma trận đồng hành) , phần dư là thứ tựO ( 10 - 2 ) O ( 10 - 15 ) O ( 10 - 11 )[a,b,c]=[1.732,1,1.2704]O(102)O(1015). Anh ta đề xuất một sửa đổi nhỏ cho thuật toán, nhưng ngay cả khi đó, anh ta có thể tìm thấy một tập hợp các hệ số dẫn đến dư lượng của , điều này chắc chắn không tốt. Xem p480-481 của cuốn sách được đề cập ở trên.O(1011)

Trong trường hợp của bạn, tôi sẽ áp dụng phương pháp của Bairstow . Nó sử dụng một sự kết hợp lặp lại của phép lặp Newton trên các hình thức bậc hai (và sau đó các gốc của phương trình bậc hai được giải quyết) và giảm phát. Nó dễ dàng thực hiện và thậm chí có một số triển khai có sẵn trên web.


1
Bạn có thể vui lòng giải thích ý của bạn là gì không "Tôi sẽ khuyên bạn không nên sử dụng các giải pháp dạng đóng vì chúng có xu hướng rất không ổn định." Điều này chỉ áp dụng cho đa thức bậc 4 hay đây là một quy tắc chung?
NoChance

@EmmadKareem Tôi đã cập nhật câu trả lời của tôi ở trên.
GertVdE

3

Xem những điều này:


2
Sử dụng mã này trên đa thức với các hệ số được đưa ra trong câu trả lời của tôi, tôi thấy như sau: , có lỗi tương đối là so với gốc thực (được tính bằng lệnh root của Octave sử dụng phương thức ma trận đồng hành). Nó có dư lượng trong khi gốc phương thức ma trận đồng hành có dư lượng . Tùy thuộc vào việc bạn có đủ tốt hay không (đối với đồ họa máy tính, đối với một số ứng dụng khác, nó sẽ không như vậy)O ( 10 - 8 ) O ( 10 - 7 ) O ( 10 - 15 )x1=1.602644912244132e+00O(108)O(107)O(1015)
GertVdE

1

Công thức số trong c cung cấp biểu thức dạng đóng cho các gốc thực của bậc hai và khối có lẽ có độ chính xác khá. Vì giải pháp đại số của tứ phân liên quan đến việc giải một khối và sau đó giải hai phép tính tứ giác, có thể một dạng tứ phân khép kín với độ chính xác tốt không nằm ngoài câu hỏi.


Tôi vừa lấy được gốc của ví dụ hình khối được trích dẫn trong vòng 2e-16 (một chút so với độ chính xác của phao của tôi) bằng cách sử dụng các công thức số trong công thức khối c (nhấn et al). Vì vậy, có lý do để hy vọng.
Nemocopperfield
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.