Phân rã từng phần bằng SymPy / Python

Sep 28 2020

Làm cách nào để tìm các hằng số A, B, C, D, K, S sao cho

1/(x**6+1) = (A*x+B)/(x**2+1) + (C*x+D)/(x**2-sqrt(3)*x+1) + (K*x+S)/(x**2+sqrt(3)*x+1)

đúng với mọi x thực.

Tôi cần một số mã giao hưởng có thể, không chắc chắn. Hoặc bất kỳ lib Python nào khác có thể giúp ích ở đây.

Tôi đã thử bằng tay nhưng nó không dễ dàng chút nào: sau 1 giờ tính toán, tôi thấy rằng có lẽ tôi đã mắc phải một số sai lầm.

Tôi đã thử phân rã từng phần trong SymPy nhưng nó không đi xa như vậy.

Tôi cũng đã thử Wolfram Alpha, nhưng nó cũng không phân hủy đến mức độ chi tiết đó, có vẻ như vậy.

Cố gắng WA

Xem các biểu mẫu thay thế mà WA cung cấp bên dưới.

Biên tập

Tôi đã thử lần thứ hai hoàn toàn bằng tay và tôi nhận được những thứ sau:

A = 0
B = 1/3
C = -1/(2*sqrt(3))
D = 1/3
K = 1/(2*sqrt(3))
S = 1/3

Làm cách nào để xác minh xem những điều này có đúng không?

Chỉnh sửa 2

Điểm chính của câu hỏi của tôi là: làm thế nào để thực hiện điều này với một số mã Python đẹp / có thể tái sử dụng?

Trả lời

4 OscarBenjamin Sep 29 2020 at 01:31

Bạn có thể làm điều này bằng cách sử dụng aparttrong giao hưởng nhưng apartsẽ tìm kiếm một phân tích nhân tử hợp lý theo mặc định, vì vậy bạn phải yêu cầu nó hoạt động trong Q(sqrt(3)):

In [37]: apart(1/(x**6+1))                                                                                                                     
Out[37]: 
        2                     
       x  - 2           1     
- ─────────────── + ──────────
    ⎛ 4    2    ⎞     ⎛ 2    ⎞
  3⋅⎝x  - x  + 1⎠   3⋅⎝x  + 1⎠

In [36]: apart(1/(x**6+1), extension=sqrt(3))                                                                                                  
Out[36]: 
       √3⋅x - 2            √3⋅x + 2           1     
- ───────────────── + ───────────────── + ──────────
    ⎛ 2           ⎞     ⎛ 2           ⎞     ⎛ 2    ⎞
  6⋅⎝x  - √3⋅x + 1⎠   6⋅⎝x  + √3⋅x + 1⎠   3⋅⎝x  + 1⎠