Tôi khuyên bạn nên sử dụng
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 104 và
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 105, trong đó các hệ số là
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 106.
Ví dụ: để đại diện cho
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 107:
p1 = numpy.poly1d[[3,2,1]]
Và với đối tượng
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 108 kết quả, bạn có thể hoạt động bằng cách sử dụng
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 109,
139 139 1390, v.v.
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
Nếu bạn muốn xây dựng các chức năng của riêng mình, giả sử rằng P chứa các hệ số theo thứ tự:
139 139 1391:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
Ghi chú
Hàm đánh giá của tôi sử dụng theo cấp số nhân, có thể tránh được với quy tắc của Horner, như được đăng trong một câu trả lời khác, có sẵn trong hàm
139 139 1392 của Numpy
Bài đăng Matlab
Đa thức có thể được biểu diễn dưới dạng danh sách các hệ số. Ví dụ: đa thức \ [4*x^3 + 3*x^2 -2*x + 10 = 0 \] có thể được biểu diễn dưới dạng [4, 3, -2, 10]. Dưới đây là một số cách để tạo ra một đối tượng đa thức và đánh giá nó.
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 10
139 139 139
Numpy giúp bạn dễ dàng có được sự phái sinh và tích phân của đa thức.
Xem xét: \ [y = 2x^2 - 1 \]. Chúng tôi biết đạo hàm là \ [4x \]. Ở đây chúng tôi tính toán đạo hàm và đánh giá nó ở x = 4.
import numpy as np p = np.poly1d[[2, 0, -1]] p2 = np.polyder[p] print p2 print p2[4]
4 x 16
Tích hợp của đa thức trước đó là \ [\ frac {2} {3} x^3 - x + c \]. Chúng tôi giả sử \ [c = 0 \]. Hãy để chúng tôi tính toán tích phân \ [\ int_2^4 2x^2 - 1 dx \].
import numpy as np p = np.poly1d[[2, 0, -1]] p2 = np.polyint[p] print p2 print p2[4] - p2[2]
3 0.6667 x - 1 x 35.3333333333
Một lý do để sử dụng đa thức là dễ dàng tìm thấy tất cả các gốc bằng cách sử dụng numpy.roots.
import numpy as np print np.roots[[2, 0, -1]] # roots are +- sqrt[2] # note that imaginary roots exist, e.g. x^2 + 1 = 0 has two roots, +-i p = np.poly1d[[1, 0, 1]] print np.roots[p]
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
0Có các ứng dụng của đa thức trong nhiệt động lực học. Phương trình van der waal là một đa thức khối \ [f [v] = v^3 - \ frac {p n b + n r t} {p} v^2 + \ frac {n^2 a} {p} v - \ frac {n^3 a b} {p} = 0 \], trong đó \ [a \] và \ [b \] là hằng số, \ [p \] là áp suất, \ [r \] là hằng số khí, \ [ T \] là nhiệt độ tuyệt đối và \ [n \] là số nốt ruồi. Rễ của phương trình này cho bạn biết thể tích của khí ở những điều kiện đó.
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
1print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
2Lưu ý rằng chỉ có một gốc là có thật [và thậm chí sau đó, chúng ta phải interpet 0.J là không tưởng tượng. Ngoài ra, trong một đa thức khối, chỉ có thể có hai gốc tưởng tượng]. Trong trường hợp này có nghĩa là chỉ có một pha hiện tại.
1. Tóm tắt Summary
Các đa thức trong numpy thậm chí còn tốt hơn ở Matlab, bởi vì bạn có một đối tượng đa thức hoạt động giống như một hàm. Nếu không, chúng tương đương về mặt chức năng.
Bản quyền [c] 2013 của John Kitchin. Xem giấy phép để biết thông tin về sao chép.
Nguồn chế độ org
Bởi Bernd Klein. Sửa đổi lần cuối: 16 tháng 2 năm 2022.Bernd Klein. Last modified: 16 Feb 2022.
Trên trang này➤
Giới thiệu
Nếu bạn đã đến trường trung học, bạn sẽ gặp phải các thuật ngữ chức năng đa thức và đa thức. Chương này của hướng dẫn Python của chúng tôi hoàn toàn về đa thức, tức là chúng tôi sẽ xác định một lớp để xác định đa thức. Sau đây là một ví dụ về đa thức với độ 4:polynomial and polynomial function. This chapter of our Python tutorial is completely on polynomials, i.e. we will define a class to define polynomials. The following is an example of a polynomial with the degree 4:
$$ p [x] = x^4 - 4 \ cdot x^2 + 3 \ cdot x $$
Bạn sẽ phát hiện ra rằng có rất nhiều điểm tương đồng với số nguyên. Chúng tôi sẽ xác định các hoạt động số học khác nhau cho các đa thức trong lớp của chúng tôi, như bổ sung, trừ, nhân và chia. Lớp đa thức của chúng tôi cũng sẽ cung cấp phương tiện để tính toán đạo hàm và tích phân của đa thức. Chúng tôi sẽ không bỏ lỡ âm mưu đa thức.
Có rất nhiều beaty trong đa thức và trên hết là cách chúng có thể được thực hiện như một lớp Python. Chúng tôi muốn nói cảm ơn Drew Shanon, người đã cho phép chúng tôi sử dụng bức tranh tuyệt vời của anh ấy, coi toán học là nghệ thuật!
Giới thiệu toán học ngắn
Chúng tôi sẽ chỉ đối phó với đa thức trong một không xác định [còn được gọi là biến] x. Một dạng chung của đa thức trong một không xác định trông như thế này:
$$ a_n \ cdot x^n + a_ {n-1} \ cdot x^{n-1} + \ ldots + a_2 \ cdot x^2 + a_1 \ cdot x + a_0 $$
Trong đó $ a_0, a_1, ... a_n $ là các hằng số - số nguyên không âm - và $ x $ là không xác định hoặc biến. Thuật ngữ "không xác định" có nghĩa là $ x $ đại diện cho không có giá trị cụ thể, nhưng bất kỳ giá trị nào có thể được thay thế cho nó.
Biểu thức này thường được viết với toán tử tổng:
$$ \ sum_ {k = 0}^{n} a_k \ cdot x^k = a_n \ cdot x^n + a_ {n-1} \ cdot x^{n-1} + \ ldot ^2 + a_1 \ cdot x + a_0 $$
Hàm đa thức là một hàm có thể được xác định bằng cách đánh giá một đa thức. Một hàm F của một đối số có thể được định nghĩa là:
$$ f [x] = \ sum_ {k = 0}^{n} a_k \ cdot x^k $$
Các chức năng đa thức với Python
Thật dễ dàng để thực hiện các hàm đa thức trong Python. Như một ví dụ, chúng tôi xác định hàm đa thức được đưa ra trong phần giới thiệu của chương này, tức là $ p [x] = x^4 - 4 \ cdot x^2 + 3 \ cdot x $
Mã Python cho hàm đa thức này trông như thế này:
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
3Chúng ta có thể gọi chức năng này giống như bất kỳ chức năng nào khác:
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
4OUTPUT:
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
5print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
6Đào tạo Python sống
Các khóa học trực tuyến sắp tới
Ghi danh ở đây
Lớp đa thức
Chúng tôi sẽ xác định bây giờ là một lớp cho các hàm đa thức. Chúng tôi sẽ xây dựng một ý tưởng mà chúng tôi đã phát triển trong chương về các nhà trang trí hướng dẫn Python của chúng tôi, nơi chúng tôi giới thiệu các nhà máy đa thức.polynomial factories.
Một đa thức được xác định duy nhất bởi các hệ số của nó. Điều này có nghĩa là, một thể hiện của lớp đa thức của chúng tôi cần một danh sách hoặc tuple để xác định các hệ số.
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
7Chúng ta có thể khởi tạo đa thức của hàm đa thức ví dụ trước đây như sau:
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
8OUTPUT:
print[p1*p1]
# 4 3 2
#9 x + 12 x + 10 x + 4 x + 1
9Đã xác định biểu diễn chuỗi chính tắc của một đa thức với hàm repr, chúng tôi cũng muốn xác định một đầu ra có thể được sử dụng để tạo một phiên bản thân thiện hơn với mọi người. Chúng tôi viết một bản trình bày latex có thể được sử dụng để in chức năng theo cách đẹp:repr function, we also want to define an output which could be used to create a version which is more friendly for people. We write a LaTex represention which can be used to print the function in a beatiful way:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
0def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
1OUTPUT:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
2Nếu chúng ta sử dụng nó trong latex, nó sẽ trông như thế này:
$ p_0 = x^4-4x^2+3x $
$ p_1 = 2x $
$ p_2 = 4x^2+x-1 $
$ p_3 = 3x^4-5x^2+2x+7 $
$ p_4 = -42 $
Cho đến nay, chúng tôi đã xác định đa thức, nhưng những gì chúng tôi thực sự cần là các hàm đa thức. Đối với mục đích này, chúng tôi biến các trường hợp của lớp đa thức thành các thiết bị gọi bằng cách xác định phương thức cuộc gọi.polynomials, but what we actually need are polynomial functions. For this purpose, we turn instances of the Polynomial class into callables by defining the call method.
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
3Bây giờ có thể gọi một thể hiện của lớp chúng tôi như một hàm. Chúng tôi gọi nó với một đối số và thể hiện, - có thể gọi được, - hoạt động giống như một hàm đa thức:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
4OUTPUT:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
5Chỉ để giải trí, chúng ta hãy vẽ đồ thị chức năng được xác định trước đó:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
6Trước khi chúng tôi tinh chỉnh lớp học của mình, chúng tôi hãy sử dụng một biến thể hiệu quả hơn về mặt số lượng để tính toán đa thức. Chúng tôi sẽ sử dụng thuật toán này trong phương thức
139 139 1393 của chúng tôi. Chúng tôi đã giới thiệu biến thể này trong chương của chúng tôi về trang trí.
Mỗi đa thức
$ f [x] = \ sum_ {k = 0}^{n} a_k \ cdot x^k $
cũng có thể được viết dưới dạng
$ f [x] = [a_n x + x_ {n-1}] x + \ cdot + a_1] x + a_0 $
Để thấy rõ rằng chúng tương đương, chúng tôi viết lại định nghĩa lớp của mình, nhưng gọi nó là
139 139 1394 để chúng tôi có thể sử dụng cả hai phiên bản:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
7Chúng tôi sẽ kiểm tra cả hai lớp bằng cách so sánh kết quả:
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
8OUTPUT:
Có thể xác định bổ sung và trừ cho đa thức. Tất cả những gì chúng ta phải làm là thêm hoặc trừ các hệ số có cùng số mũ từ cả hai đa thức.
Nếu chúng ta có các hàm đa thức $ f [x] = \ sum_ {k = 0}^{n} a_k \ cdot x^k $ và $ g [x] = \ sum_ {k = 0}^{n} b_k \ cdot x^k $, bổ sung được định nghĩa là
$$ [f + g] [x] = \ sum_ {k = 0}^{n} [a_k + b_k] \ cdot x^k $$
và phép trừ tương ứng được định nghĩa là
$$ [f -g] [x] = \ sum_ {k = 0}^{n} [a_k - b_k] \ cdot x^k $$
Trước khi chúng ta có thể thêm các phương thức __add__ và __sub__, cần thiết để bổ sung và trừ, chúng ta thêm một zip_longest []. Nó hoạt động tương tự như ZIP cho hai tham số, nhưng nó không dừng lại nếu một trong các trình lặp bị kiệt sức nhưng thay vào đó sử dụng "fillvalue".
def eval_polynomial[p,x]:
return sum[[a*x**i for i,a in enumerate[p]]]
def multiply_by_one_term[p, a, k]:
return [0]*k + [a*i for i in p]
9OUTPUT:
Chúng tôi sẽ thêm trình tạo này vào lớp của chúng tôi như một phương thức tĩnh. Bây giờ chúng tôi có khả năng thêm các phương thức __add__ và __sub__. Chúng tôi sẽ cần máy phát
139 139 1395 từ itertools.
139 139 1395 lấy và số lượng lặp tùy ý và tham số từ khóa
139 139 1397. Nó tạo ra một trình lặp tập hợp các phần tử từ mỗi lần lặp. Nếu các vòng lặp có độ dài không đồng đều, các giá trị bị thiếu sẽ được lấp đầy bằng fillvalue. Lặp lại tiếp tục cho đến khi có thể cạn kiệt lâu nhất.
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 100
Nó là cực kỳ dễ dàng để thêm sự khác biệt vào lớp của chúng tôi. Về mặt toán học, nó được định nghĩa là
$$ f '[x] = \ sum_ {k = 0}^{n} k \ cdot a_k \ cdot x^{k-1} $$
if
$$ f [x] = \ sum_ {k = 0}^{n} a_k \ cdot x^k $$
Điều này có thể dễ dàng thực hiện trong phương pháp 'phái sinh' của chúng tôi:
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 101
Chơi xung quanh một chút:
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 102
OUTPUT:
import numpy as np ppar = [4, 3, -2, 10] p = np.poly1d[ppar] print p[3] print np.polyval[ppar, 3] x = 3 print 4*x**3 + 3*x**2 -2*x + 103
Đào tạo Python sống
Các khóa học trực tuyến sắp tới
Ghi danh ở đây