Giải phương trình siêu việt python

The value of root is : -1.0025
6
The value of root is : -1.0025
7 // C++ program for implementation of Bisection Method for45_______446____445____446______445// C++ program for implementation of Bisection Method for50 // C++ program for implementation of Bisection Method for45// C++ program for implementation of Bisection Method for46// C++ program for implementation of Bisection Method for45
The value of root is : -1.0025
51
The value of root is : -1.0025
24

Trong lớp hôm nay, chúng ta sẽ bắt đầu hai tuần về việc sử dụng numpy để thực hiện các nhiệm vụ số cơ bản. Hôm nay chúng ta sẽ cống hiến cho một trong những điều cơ bản nhất. tìm nghiệm của các phương trình đại số, hoặc tương đương, nghiệm của các hàm

Chúng ta có thể minh họa ví dụ này bằng cách sử dụng một bài toán từ thiên văn học cơ bản. Chúng ta biết rằng ánh sáng do vật đen phát ra tuân theo sự phân bố bước sóng phụ thuộc vào nhiệt độ của nó. Cụ thể, chúng ta biết rằng sự phân bố cường độ theo bước sóng được phân bố theo hàm Planck,


trong đó  là bước sóng, h là hằng số Planck, k là hằng số Boltzmann và T là nhiệt độ. Bây giờ, giả sử rằng chúng ta muốn tìm bước sóng có cường độ cực đại ở nhiệt độ T cho trước. Đây là một bài toán cực đại hóa một hàm đơn giản và chúng ta có thể giải nó thông qua phương pháp giải tích thông thường. lấy đạo hàm và tìm nơi nó bằng 0.

Đại số sẽ bớt lộn xộn hơn một chút nếu chúng ta thay thế , điều này làm cho hàm mà chúng ta muốn cực đại hóa


Lấy đạo hàm theo x, và đơn giản hóa một chút, ta có


Chúng tôi muốn tìm giá trị của x mà giá trị này bằng 0, rõ ràng là giá trị của x trong đó tử số [5 - x]ex - 5 bằng 0. Do đó, chúng ta chỉ còn lại một bài toán thuần túy. giải phương trình


Cái khó là đây là một phương trình siêu việt, nghĩa là phương trình không thể giải tích một cách chính xác. Tuy nhiên, như chúng ta sẽ thấy dưới đây, rõ ràng là có một giải pháp

Vấn đề giải phương trình này có tên chung là tìm nghiệm. Về mặt toán học, vấn đề có thể được phát biểu như sau. Giả sử chúng ta có hàm một biến f[x] nào đó. với [những] giá trị nào của x thì f[x] = 0?

đánh giá đồ họa

Bước đầu tiên để giải quyết một vấn đề như thế này là hiểu được chức năng trông như thế nào. Cuối cùng, chúng ta có thể kích hoạt python, xác định chức năng và vẽ đồ thị cho nó. Chúng tôi sẽ làm điều này cho cả hàm Planck và đạo hàm của nó, bỏ qua các hằng số hàng đầu trong dấu ngoặc vuông

   . trả lại [ x**5/[exp[x]-1] ]

   . trả lại [ x**4 * [[5-x]*exp[x]-5] / [exp[x]-1]**2 ]

Trong 3]. x=arange[0. 01,20,0. 01]

Trong [4]. cốt truyện[x, bx[x], lw=3]

Ra[4]. []

Trong [5]. cốt truyện[x, dbdx[x], lw=3]

Ra[5]. []

Trong [6]. cốt truyện [x, 0*x, 'k--']

Ra[6]. []

Trong [7]. huyền thoại [['B', 'dB/dx', '0']]

Ra[7]


Đường màu xanh lam là đồ thị của hàm chúng ta muốn và đường màu xanh lá cây là f[x] = 0. Rõ ràng là có một giải pháp. Bằng mắt thường, chúng ta có thể ước tính rằng nó vào khoảng x = 5, nhưng chúng ta có thể chính xác hơn thế nhiều

Tuy nhiên, một lý do quan trọng để vẽ đồ thị hàm trước khi sử dụng các phương pháp chính xác hơn này là đồ thị thường có thể cảnh báo chúng ta nếu hàm có nhiều hơn một nghiệm. Nếu đúng như vậy, chúng ta có thể cần suy nghĩ xem mình muốn tìm nghiệm nào, vì thường chỉ có một trong các nghiệm tương ứng với giải pháp thực tế vật lý mà chúng ta quan tâm.

Phương pháp Newton và phương pháp secant

Vậy làm thế nào để chúng ta tìm giá trị bằng số của x mà f[x] = 0? . Phương pháp Newton/phương pháp secant và phương pháp Brent

Phương pháp của Newton được phát minh ra, như người ta có thể đoán từ cái tên, bởi Isaac Newton, và nó bao gồm các bước sau. Chúng tôi bắt đầu với một dự đoán ban đầu cho gốc x0 và tại dự đoán, chúng tôi đánh giá cả hàm và đạo hàm của nó. f[x0] và f'[x0]

Nếu hàm số là một đường thẳng, thì chúng ta có thể tìm thấy nghiệm chỉ từ điều này, bởi vì f'[x0] là hệ số góc và f[x0] là giá trị y. Gốc sẽ là tại

Nói chung, hàm số f của chúng ta không phải là một đường thẳng, vì nếu nó là một đường thẳng, thì tất cả những điều này sẽ không cần thiết. Tuy nhiên, ở quy mô đủ nhỏ, mọi hàm trơn trông giống như một đường thẳng, vì vậy đây vẫn có thể là một xấp xỉ khá tốt, đặc biệt nếu dự đoán ban đầu của chúng tôi không quá xa. Để cải thiện giá trị gần đúng, chúng ta chỉ cần lặp lại quy trình bằng cách sử dụng giá trị mới x1 để đoán giá trị x mới x2 thông qua cùng một công thức

Chúng ta có thể thực hiện thao tác này lặp đi lặp lại cho đến khi f[xN] gần bằng 0 như chúng ta muốn. Bài viết về phương pháp của Newton trên wikipedia có biểu diễn đồ họa về điều này tốt hơn nhiều so với những gì tôi có thể nghĩ ra, vì vậy đây là

Phương pháp của Newton yêu cầu chúng ta có thể tính đạo hàm của hàm f'[x]. Điều này đôi khi là trường hợp, nhưng bây giờ luôn luôn. Nếu chúng ta không thể tính toán đạo hàm một cách phân tích, chúng ta có thể sử dụng một phương pháp liên quan chặt chẽ được gọi là phương pháp thứ hai. Điều này về cơ bản giống như phương pháp của Newton, với sự khác biệt là đạo hàm được tính gần đúng chứ không được tính toán chính xác. Giả sử rằng chúng ta lấy x0 và x1 làm hai giá trị dự đoán ban đầu ở gốc. Chúng ta có thể tính gần đúng đạo hàm bằng


Chúng ta có thể đưa giá trị gần đúng này vào công thức phương pháp của Newton để nhận được x2, sau đó chúng ta có thể tính gần đúng đạo hàm f'[x2] bằng cách sử dụng các giá trị của f[x] được đánh giá tại x2 và x1 giống như khi chúng ta tính gần đúng đạo hàm f'[x1] . Cái này

Gói scipy cung cấp các triển khai của cả phương thức Newton và phương thức secant. Để sử dụng các phương pháp này, trước tiên chúng ta phải xác định hàm có gốc mà chúng ta muốn tìm. Trong ví dụ trên, chúng tôi đã xác định hàm f[x] mà chúng tôi quan tâm, vì vậy chúng tôi có thể tiến hành các bước tiếp theo, đó là nhập scipy. tối ưu hóa mô-đun rồi gọi hàm newton[]

Cú pháp như sau

Trong [8]. nhập scipy. tối ưu hóa như opt

Trong [9]. opt. newton[dbdx, 5]

Ra[9]. 4. 965114231744276

Phương thức newton[] nhận hai đối số theo mặc định. Đầu tiên là chức năng có gốc được tìm thấy và thứ hai là dự đoán ban đầu cho vị trí của gốc. Với dự đoán ban đầu này, hàm sẽ áp dụng phương pháp Newton hoặc phương pháp secant lặp đi lặp lại để tìm gốc. Trong trường hợp này, chúng tôi đã không chỉ định đạo hàm của hàm và vì vậy phương pháp secant được sử dụng. Nếu chúng ta muốn xác định đạo hàm, chúng ta có thể làm như vậy và sau đó sử dụng phương pháp của Newton

  . return[ 20*x**3/[exp[x]-1] - 10*x**4*exp[x]/[exp[x]-1]**2 + 2*exp[2*x]

Trong [11]. opt. newton[dbdx, 5, fprime=d2bdx2]

Ra[11]. 4. 965114231744276

Hàm mà chúng ta đã định nghĩa là f'[x] là đạo hàm được tính toán giải tích của f[x]. Cú pháp là đối số tùy chọn fprime được đặt bằng với hàm trả về f'[x]. Vì hiện tại chúng ta đã chỉ định f'[x], nên hàm newton[] trong scipy. tối ưu hóa sử dụng phương pháp của Newton thay vì phương pháp secant. Ưu điểm của phương pháp Newton so với phương pháp thứ hai là nó thường hội tụ đến câu trả lời đúng sau ít lần lặp hơn, vì vậy, nếu hàm f[x] mất một lúc để ước tính, thì phương pháp của Newton có thể đưa ra câu trả lời nhanh hơn

Từ câu trả lời đầu ra, chúng ta có thể tìm thấy mối quan hệ giữa nhiệt độ và bước sóng cực đại. Nhớ lại rằng chúng ta đã định nghĩa


vì vậy chúng ta có thể đảo ngược điều này để cung cấp cho


nơi chúng tôi đã cắm vào x = 4. 9651. Điều này được gọi là Định luật dịch chuyển của Wien

Dấu ngoặc và chia đôi

Mặc dù phương pháp của Newton và phương pháp thứ hai hoạt động trong ví dụ chúng ta vừa thử, nhưng nó cũng có thể gặp sự cố và không có gì đảm bảo rằng nó sẽ tìm ra gốc. Giả sử rằng, thay vì sử dụng 5 như dự đoán ban đầu, chúng tôi đã sử dụng 0. 1. Đây là kết quả

Trong [12]. opt. newton[dbdx, 0. 1]

--------------------------------------------------

RuntimeError                           Tracback [lần gọi gần đây nhất]

Trong[]

----> 1 lựa chọn. newton[dbdx, 0. 1]

/opt/local/Library/Frameworks/Python. khung/Phiên bản/2. 7/lib/python2. 7/gói trang web/scipy/tối ưu hóa/số không. pyc trong newton[func, x0, fprime, args, tol, maxiter, fprime2]

159           q1 = func[*[[p1,] + args]]

160     msg = "Không thể hội tụ sau %d lần lặp, giá trị là %s" % [maxiter, p]

--> 161     tăng RuntimeError[msg]

Lỗi runtime. Không thể hội tụ sau 50 lần lặp lại, giá trị là 6. 92233613637e-08

Vậy phương pháp Newton không tìm được nghiệm. Có chuyện gì? . Phương pháp của Newton về cơ bản có nghĩa là "đi xuống dốc/lên dốc theo độ dốc hiện tại", nhưng sử dụng 0. 1 như dự đoán ban đầu, "xuống dốc" thực sự chỉ ra khỏi giải pháp chứ không phải hướng tới nó. Phương pháp của Newton hoạt động tốt nếu dự đoán ban đầu của chúng ta là "xuống dốc" đưa chúng ta về gốc. Tuy nhiên, nhìn vào chức năng của chúng tôi, rõ ràng sẽ xuống dốc từ 0. 1 sẽ không bao giờ đưa chúng ta đến tận gốc

May mắn thay, chúng ta có thể làm tốt hơn, nếu chúng ta có thể đặt dấu ngoặc gốc. Đặt ngoặc căn có nghĩa là chúng ta có thể xác định được hai giá trị a và b sao cho f[a] và f[b] khác dấu nghĩa là hàm số f[x] [giả sử nó liên tục] phải đi qua 0 với một số x nằm giữa a

Đặt dấu ngoặc gốc là cực kỳ hiệu quả, bởi vì nó cho phép người ta sử dụng một thuật toán được đảm bảo để tìm ra gốc. Phương pháp này là chia đôi. Ý tưởng chia đôi cực kỳ đơn giản và có thể được mô tả bằng các bước sau

  1. Cho hai điểm a và b nằm trong ngoặc một căn [i. e. f[a] và f[b] trái dấu], lấy trung điểm giữa chúng h = [a+b]/2, và đánh giá f[h]
  2. Nếu f[h] nằm trong một số dung sai được chỉ định là 0, thì kết thúc -- chúng tôi đã tìm thấy gốc
  3. Nếu không kiểm tra xem f[h] và f[a] có trái dấu không. Nếu đúng như vậy, thì phải có một nghiệm giữa x = a và x = h, vì vậy hãy đặt b = h và quay lại bước 1
  4. Nếu f[h] và f[a] cùng dấu thì f[h] và f[b] phải trái dấu, vì ta biết rằng f[a] và f[b] trái dấu. Do đó, phải có một gốc giữa h và b, vì vậy hãy đặt a = h và quay lại bước 1

Phương pháp này được đảm bảo để tìm ra gốc, bởi vì nó luôn giữ gốc trong khoảng quan tâm và liên tiếp giảm một nửa khoảng đó cho đến khi chúng ta đủ gần

Vì vậy, làm thế nào để chúng ta ngoặc một gốc? . Nếu đó không phải là một lựa chọn, chẳng hạn như vì bạn cần một thứ gì đó có thể hoạt động mà không cần sự can thiệp của con người, thì giải pháp thay thế là sử dụng quy trình

Trong mọi trường hợp, một khi chúng tôi đã đặt gốc của mình trong ngoặc đơn, chúng tôi có thể tìm thấy nó bằng cách chia đôi như sau

Trong [13]. opt. chia đôi [dbdx, 0. 1, 100]

Ra[13]. 4. 965114231744027

Đối số đầu tiên là hàm có gốc cần tìm, đối số thứ hai là giá trị ngoặc vuông trái [a] và đối số thứ ba là giá trị ngoặc vuông phải [b]. Gọi chia đôi các giá trị a và b sao cho f[a] và f[b] cùng dấu dẫn đến lỗi

Phương pháp Brent

Phương pháp chia đôi được đảm bảo hoạt động, nhưng có thể chậm hơn nhiều so với phương pháp như phương pháp của Newton, bởi vì nó chỉ tiến gần hơn đến câu trả lời theo hệ số 2 mỗi bước. Ngược lại, nếu một hàm khá gần với một đường thẳng, phương pháp của Newton sẽ tiến rất gần đến câu trả lời chỉ trong một bước. Phương pháp của Brent thu được kết quả tốt nhất của cả hai thế giới, bằng cách cố gắng sử dụng secant hoặc một phương pháp nhanh tương tự, nhưng quay trở lại phương pháp chia đôi nếu điều đó không hội tụ về câu trả lời. Nó được đảm bảo để hội tụ đến câu trả lời đúng giống như phép chia đôi, nhưng trong hầu hết các trường hợp thì nhanh gần bằng phương pháp của Newton

[Ghi chú. mặc dù phương pháp của Brent được đảm bảo hội tụ về mặt toán học, nhưng nó vẫn có thể không hội tụ về mặt số học vì trên máy tính, người ta đang sử dụng phép tính số học có độ chính xác hữu hạn và có những trường hợp mà độ chính xác 15 chữ số thập phân mà các số dấu phẩy động thường cung cấp sẽ không đủ để . Việc cố gắng tìm nghiệm của f[x] = e10000000x - 1 bằng số sẽ gặp vấn đề ngay cả với một thuật toán được đảm bảo hoạt động về mặt toán học. ]

các scipy. thư viện tối ưu hóa triển khai phương thức của Brent thông qua quy trình brentq[] và if thường là phương pháp giải phương trình bắt buộc nếu bạn có thể đặt dấu ngoặc gốc. Cú pháp rất giống với phương pháp của Newton, ngoại trừ việc thay vì chỉ định một phỏng đoán ban đầu, thay vào đó, người ta chỉ định các giá trị ngoặc

Trong [14]. opt. brentq[dbdx, 0. 1, 100]

Ra[14]. 4. 965114231743836

Ở đây, đối số đầu tiên là hàm cần tìm gốc, đối số thứ hai là giá trị ngoặc vuông trái [a] và đối số thứ ba là giá trị ngoặc vuông phải [b]. Ngay cả khi các giá trị này không ở gần gốc [như trường hợp ở đây], phương pháp của Brent sẽ tìm thấy nó. Giống như phép chia đôi, việc gọi brentq với các giá trị a và b sao cho f[a] và f[b] không trái dấu dẫn đến lỗi

Người ta có thể thấy sự khác biệt giữa việc sử dụng phương pháp chia đôi và phương pháp của Brent bằng cách gọi chúng với tùy chọn full_output được đặt thành True, trả về một loạt thông tin chẩn đoán cùng với thư mục gốc

Trong [15]. x1, r1 = chọn. chia đôi [dbdx, 0. 1, 100, full_output=True]

Trong [16]. x2, r2 = chọn. brentq[dbdx, 0. 1, 100, full_output=True]

Trong [18]. r1. function_calls

Trong 20]. r2. function_calls

Các trường lặp lại và function_calls mô tả số bước mà hàm phải thực hiện để tìm gốc và số lần hàm phải được gọi trong quy trình. Chúng tôi thấy rằng phép chia đôi mất gần gấp 3 lần số lần gọi hàm và lặp lại để tìm ra câu trả lời. Trong ví dụ này, điều đó không thực sự quan trọng, bởi vì chức năng được đề cập rất tầm thường để đánh giá. Tuy nhiên, nếu bạn muốn tìm gốc của một hàm tốn nhiều thời gian để đánh giá [ví dụ: có thể hàm được biểu thị dưới dạng kết quả của một tích phân đang được đánh giá bằng số], hệ số chênh lệch 3 lần trong số lần gọi hàm

Thử thách lập trình

Bây giờ cho một thử thách lập trình. Định luật dịch chuyển của Wien đưa ra bước sóng tại đó cực đại phát xạ trên mỗi đơn vị bước sóng. Tuy nhiên, tần số tương ứng với bước sóng này KHÔNG giống với tần số mà cực đại phát xạ trên một đơn vị tần số. Sự phát xạ trên mỗi đơn vị tần số được đưa ra bởi


Tìm tần suất mà hàm này đạt cực đại, sử dụng python để giải phương trình bạn thu được bằng số

Tìm nguồn gốc trong nhiều hơn một chiều

Tại sao việc tìm kiếm gốc đa chiều lại khó

Bài toán tìm nghiệm của một hàm nhiều chiều, trong đó có nhiều hơn một biến độc lập hoặc biến phụ thuộc, là một bài toán khó hơn nhiều. Ở dạng tổng quát nhất, đây là bài toán tìm vectơ x thỏa mãn điều kiện f[x] = 0. Trường hợp phổ biến nhất là x và f[x] có cùng số phần tử

Lý do cơ bản khiến đây là một vấn đề khó là, trong nhiều chiều, không có phương pháp nào được đảm bảo hoạt động ngay cả khi nó chậm như chia đôi. Không có cách nào để đặt một gốc và đảm bảo rằng nó nằm ở đâu đó giữa điểm a và điểm b. Để biết tại sao lại như vậy, hãy xem xét trường hợp có hai biến, x và y, và hai hàm f[x, y] và g[x, y]. Trong trường hợp này, chúng tôi tìm kiếm một cặp giá trị [x, y] thỏa mãn



Chúng ta có thể hình dung những gì chúng ta đang hỏi nếu chúng ta coi các hàm f và g biểu thị các bản đồ địa hình, cho chúng ta biết độ cao là một hàm của vị trí. Tìm kiếm các điểm thỏa mãn điều kiện f[x,y] = 0 tương đương với việc tìm kiếm vị trí của mực nước biển trên bản đồ địa hình [hoặc tương đương vị trí của bất kỳ đường đồng mức nào khác có độ cao cố định]

Rõ ràng chúng ta có thể tìm thấy một đường viền bằng không bằng cách đặt ngoặc. nếu chúng ta có một điểm sao cho f[x, y] < 0, và một điểm khác sao cho f[x, y] > 0, và f là một hàm liên tục, thì nếu chúng ta vẽ một đường thẳng giữa chúng, tại một số điểm dọc theo . Nếu chúng ta tìm thấy điểm đó và sau đó đi dọc theo một con đường có độ dốc bằng không [i. e. , chiều cao không đổi], chúng ta có thể vạch ra toàn bộ đường bao trong đó f[x, y] = 0

Càng xa càng tốt. Tuy nhiên, bây giờ chúng tôi cũng yêu cầu rằng g[x, y] = 0 và đây là lúc mọi thứ trở nên tồi tệ. Nếu chúng ta có thể tìm thấy một điểm dưới mực nước biển và một điểm trên mực nước biển trên bản đồ g, chúng ta cũng có thể tìm thấy một đường đồng mức trong đó g[x, y] = 0. Tuy nhiên, không có gì đảm bảo rằng đường bao này sẽ cắt đường bao mà f[x, y] = 0. Cũng không có bất kỳ lý do tại sao nó nên. Nói chung f[x, y] và g[x, y] là các hàm hoàn toàn không liên quan với nhau, vì vậy các đường đồng mức của chúng không có mối quan hệ nào với nhau

Chúng ta có thể minh họa điều này bằng một ví dụ. Hãy xem xét hai chức năng,

Hàm thứ nhất rõ ràng bằng 0 trên đường tròn đơn vị, trong khi hàm thứ hai rõ ràng bằng 0 ở mọi nơi x = a. Chúng ta có thể đặt ngoặc các số 0 của cả hai hàm bằng cách chọn một trong các điểm của chúng ta làm gốc tọa độ và điểm còn lại là x = 2a, y = 0

Để xem tại sao điều này không mua cho chúng ta một giải pháp, hãy tạo các biểu đồ đường bao của hai hàm này cho a = 1/2, chỉ hiển thị đường bao trong đó hàm bằng không

Trong [21]. x = không gian trống [-2,2,100]

Trong [22]. y = không gian trống [-2,2,100]

Trong [23]. xx, yy = lưới lưới[x, y]

Trong [24]. f = 1 - xx**2 - yy**2

Trong [25]. g = xx**2 - 0. 5**2

Trong [26]. đường viền [xx, yy, f, [0], colors='b']

Hết[26]

Trong [27]. đường viền [xx, yy, g, [0], colors='r']

Hết[27]

Trong [28]. gca[]. set_aspect['bằng']


Rõ ràng có bốn giải pháp. Tuy nhiên, giả sử chúng ta đặt a = 1 thay vì. Bây giờ chúng tôi có

Trong [31]. g = xx**2 - 1**2

Trong [32]. đường viền [xx, yy, f, [0], colors='b']

Ra[32]

Trong [33]. đường viền [xx, yy, g, [0], colors='r']

Ra[33]


Đột nhiên bây giờ có 2 giải pháp thay vì 4. Nếu chúng ta thay đổi giá trị của một chút nữa, các giải pháp sẽ biến mất hoàn toàn

Trong [34]. g = xx**2 - 1. 05**2

Trong [35]. đường viền [xx, yy, f, [0], colors='b']

Ra[35]

Trong [36]. đường viền [xx, yy, g, [0], colors='r']

Ra[36]


Rõ ràng là không có cách chung chung nào để nói liệu có tồn tại giải pháp hay không, hoặc có bao nhiêu giải pháp sẽ có, ngay cả đối với các hàm rất đơn giản, hoạt động tốt. Do khó khăn này, các phương pháp tìm nghiệm của các hàm nhiều chiều thường phức tạp hơn nhiều so với các phương pháp tìm nghiệm của các hàm vô hướng của các biến vô hướng, và không có phương pháp nào sẽ thành công trừ khi bạn biết điều gì đó về hàm và vị trí của nó.

Tìm nguồn gốc đa chiều trong Python

Hãy lưu ý về độ khó của vấn đề này sang một bên, scipy. mô-đun tối ưu hóa bao gồm một số phương pháp để tìm gốc của các hàm đa chiều, hầu hết các phương pháp này có thể được truy cập thông qua hàm root[]. Những thứ này có nhiều khả năng bị lỗi hơn so với các chất tương tự một chiều của chúng, đặc biệt nếu bạn sử dụng chúng một cách mù quáng, nhưng chúng cung cấp một nơi để bắt đầu

Đây là một ví dụ. Để bắt đầu, chúng ta hãy xem xét hàm hai chiều của hai biến, được định nghĩa như sau

   . r = sqrt[ xvec[0]**2 + xvec[1]**2 ]

   . phi = arccos[ xvec[0]/r ]

   . fx = r**2 - 1. 0

   . trả về [mảng [[fx, fy]]]

Chúng ta có thể thấy các giải pháp sẽ ở đâu chỉ bằng cách nhìn vào chức năng. Thành phần đầu tiên của nó là r2 - 1 nên rõ ràng nghiệm phải nằm trên đường tròn r = 1. Thành phần thứ hai là cos[phi] nên rõ ràng nghiệm phải nằm ở phi = pi/2 hoặc [3/2] pi, tương ứng với x = 0. Như vậy có hai nghiệm, một tại [0, 1] và một tại [0, -1]

Để tìm kiếm các giải pháp này bằng root, chúng tôi tiến hành như sau

Trong [38]. opt. gốc [fvec, [0. 25, 0. 5]]

qtf. mảng [[ -5. 35354922e-09,  -4. 22230880e-09]]

r. mảng [[-0. 96382325,  0. 02222859,  2. 06183641]]

niềm vui. mảng[[  2. 69748668e-11,  -3. 60626471e-11]]

x. mảng [[ -3. 60626511e-11,   1. 00000000e+00]]

thông điệp. 'Giải pháp hội tụ. '

fjac. mảng [[[-0. 02837482, -0. 99959735],

[ 0. 99959735, -0. 02837482]]]

Đối số đầu tiên cho gốc là hàm có gốc được tìm thấy và đối số thứ hai là dự đoán ban đầu về giải pháp. Có một số từ khóa kiểm soát phương pháp nào được sử dụng để tìm kiếm giải pháp và những thứ tương tự. Hàm trả về một đối tượng với một số phần mô tả liệu nó có thành công trong việc tìm ra giải pháp hay không và nếu có thì ở đâu. Trong ví dụ này, thành công là True, cho biết rằng người giải đã tìm ra giải pháp và x là giải pháp mà nó tìm thấy. Trong trường hợp này, nó đã tìm ra giải pháp [0, 1]

Phương pháp mặc định mà chúng tôi sử dụng ở đây vì chúng tôi không chỉ định khác, được gọi là phương pháp lai của Powell. Chúng tôi sẽ không đi vào chi tiết về cách thức hoạt động của phương pháp này ở đây, nhưng tóm tắt ngắn gọn là nó cố gắng thực hiện một thủ thuật giống như phương pháp của Brent. kết hợp phương pháp của Newton [khái quát cho nhiều chiều] với phương pháp chậm hơn nhưng ít sai sót hơn. Tuy nhiên, không giống như phương pháp của Brent, không có gì đảm bảo rằng phương pháp này sẽ hoạt động

Chỉ định Jacobian

Tìm nghiệm đa chiều giống như tìm nghiệm một chiều ở chỗ sẽ hữu ích nếu bạn có thể chỉ định đạo hàm của hàm mà bạn đang tìm kiếm nghiệm. Trong trường hợp không có đạo hàm được chỉ định về mặt phân tích, phương pháp số phải ước tính đạo hàm, phương pháp này cần nhiều đánh giá hàm bổ sung. Do đó, một điều bạn có thể làm để tăng tốc độ tìm nghiệm đa chiều là xác định đạo hàm theo phương pháp phân tích, nếu bạn có thể

Trong nhiều chiều, người ta cần đưa ra đạo hàm của mọi hàm đối với mọi biến. Do đó, đạo hàm thực sự là một ma trận, được gọi là Jacobian. Cụ thể, cho trước một tập hợp N hàm của N biến,


chúng tôi xác định Jacobian bằng


For our example, the partial derivatives are fairly easy to compute analytically, and we can create a function to specify them as follows

    . r = sqrt[x**2 + y**2]

    . dfydx = y**2 / r**3

    . dfydy = -x*y / r**3

    . jac = mảng[ [[dfxdx, dfxdy], [dfydx, dfydy]] ]

Khi chúng ta đã xác định hàm Jacobian, chúng ta có thể tìm nghiệm như sau

Trong [40]. opt. gốc [fvec, [0. 25, 0. 5], jac=jac]

qtf. mảng [[ -5. 35354938e-09,  -4. 22230996e-09]]

r. mảng [[-0. 96382325,  0. 02222856,  2. 06183641]]

niềm vui. mảng[[  2. 69753109e-11,  -3. 60626471e-11]]

x. mảng [[ -3. 60628051e-11,   1. 00000000e+00]]

thông điệp. 'Giải pháp hội tụ. '

fjac. mảng [[[-0. 02837483, -0. 99959735],

[ 0. 99959735, -0. 02837483]]]

Gốc được tìm thấy giống như trước đây, nhưng bạn sẽ lưu ý rằng chúng tôi đã tìm thấy nó với ít đánh giá chức năng hơn

Chủ Đề