Giải phương trình đạo hàm riêng bằng Python

Cuốn sách này giới thiệu ngắn gọn và nhẹ nhàng về lập trình phần tử hữu hạn trong Python dựa trên thư viện phần mềm FEniCS phổ biến. Sử dụng một loạt các ví dụ, bao gồm phương trình Poisson, phương trình đàn hồi tuyến tính, phương trình Navier–Stokes không nén được và hệ phương trình phản ứng tiến lên–khuếch tán phi tuyến, nó hướng dẫn người đọc các bước cơ bản để nhanh chóng giải PDE trong FEniCS, . Cuốn sách này là truy cập mở theo giấy phép CC BY

từ khóaKhoa học và Kỹ thuật tính toán;

Đây là những chức năng được nhập vào không gian tên chung với

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
7. Chúng được dành cho người dùng sử dụng

pde_separate#

sympy. người giải quyết. pde. pde_separate[eq , vui vẻ, sep, strategy='mul'][source]#

Các biến riêng biệt trong phương trình vi phân từng phần bằng phương pháp tách cộng hoặc nhân. Nó cố gắng viết lại một phương trình sao cho một trong các biến được chỉ định xảy ra ở một phía khác của phương trình so với các biến khác

Thông số .
  • eq – Phương trình vi phân từng phần

  • vui vẻ – Hàm gốc F[x, y, z]

  • sep – Danh sách các hàm tách [X[x], u[y, z]]

  • chiến lược – Chiến lược tách biệt. Bạn có thể chọn giữa tách cộng ['add'] và tách nhân ['mul'], đây là mặc định

ví dụ

>>> from sympy import E, Eq, Function, pde_separate, Derivative as D
>>> from sympy.abc import x, t
>>> u, X, T = map[Function, 'uXT']

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]

Xem thêm

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
8,
>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
9

pde_separate_add#

sympy. người giải quyết. pde. pde_separate_add[eq , vui vẻ, sep][source]#

Chức năng trợ giúp để tìm kiếm các giải pháp có thể phân tách phụ gia

Xét một phương trình gồm hai biến độc lập x, y và một biến phụ thuộc w, ta tìm tích của hai hàm dựa vào các đối số khác nhau

\[w[x, y, z] = X[x] + y[y, z]\]

ví dụ

>>> from sympy import E, Eq, Function, pde_separate_add, Derivative as D
>>> from sympy.abc import x, t
>>> u, X, T = map[Function, 'uXT']

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate_add[eq, u[x, t], [X[x], T[t]]]
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]

pde_separate_mul#

sympy. người giải quyết. pde. pde_separate_mul[eq , vui vẻ, sep][source]#

Hàm trợ giúp để tìm kiếm các giải pháp có thể phân tách nhân

Xét một phương trình gồm hai biến độc lập x, y và một biến phụ thuộc w, ta tìm tích của hai hàm dựa vào các đối số khác nhau

\[w[x, y, z] = X[x]*u[y, z]\]

ví dụ

________số 8

>>> eq = Eq[D[u[x, y], x, 2], D[u[x, y], y, 2]]
>>> pde_separate_mul[eq, u[x, y], [X[x], Y[y]]]
[Derivative[X[x], [x, 2]]/X[x], Derivative[Y[y], [y, 2]]/Y[y]]

pdsolve#

sympy. người giải quyết. pde. pdsolve[eq , func=None, hint='default', dict=False, solvefun=None, **kwargs][source]#

Giải bất kỳ loại phương trình đạo hàm riêng nào [được hỗ trợ]

Cách sử dụng

pdsolve[eq, f[x,y], gợi ý] -> Giải phương trình đạo hàm riêng eq cho hàm f[x,y], sử dụng phương pháp gợi ý

Chi tiết

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
0 có thể là bất kỳ phương trình đạo hàm riêng nào được hỗ trợ [xem

chuỗi tài liệu pde cho các phương thức được hỗ trợ]. Đây có thể là một Đẳng thức hoặc một biểu thức, được coi là bằng 0

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
1 là một hàm của hai biến có đạo hàm trong đó

biến tạo nên phương trình đạo hàm riêng. Trong nhiều trường hợp, không cần thiết phải cung cấp điều này;

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
2 là phương pháp giải mà bạn muốn pdfsolve sử dụng. Sử dụng

class_pde[eq, f[x,y]] để nhận tất cả các gợi ý có thể có cho PDE. Gợi ý mặc định, 'default', sẽ sử dụng bất kỳ gợi ý nào được trả về trước bởi classclass_pde[]. Xem Gợi ý bên dưới để biết thêm các tùy chọn mà bạn có thể sử dụng cho gợi ý

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
3 là quy ước được sử dụng cho các hàm tùy ý được trả về

bởi bộ giải PDE. Nếu không được đặt bởi người dùng, nó được đặt theo mặc định là F

gợi ý

Ngoài các phương pháp giải khác nhau, còn có một số gợi ý meta mà bạn có thể chuyển đến pdsolve[]

"mặc định"

Điều này sử dụng bất kỳ gợi ý nào được trả về trước bởi class_pde[]. Đây là đối số mặc định cho pdfsolve[]

"tất cả các"

Để làm cho pdsolve áp dụng tất cả các gợi ý phân loại có liên quan, hãy sử dụng pdsolve[PDE, func, hint=”all”]. Điều này sẽ trả về một từ điển gợi ý. điều khoản giải pháp. Nếu một gợi ý khiến pdsolve tăng NotImplementedError, giá trị của khóa của gợi ý đó sẽ là đối tượng ngoại lệ được nâng lên. Từ điển cũng sẽ bao gồm một số phím đặc biệt

  • trật tự. Thứ tự của PDE. Xem thêm ode_order[] trong deutils. py

  • mặc định. Giải pháp sẽ được trả về theo mặc định. Đây là cái được tạo bởi gợi ý xuất hiện đầu tiên trong bộ được trả về bởi class_pde[]

“all_Integral”

Điều này cũng giống như “tất cả”, ngoại trừ nếu gợi ý cũng có gợi ý “_Integral” tương ứng, thì nó chỉ trả về gợi ý “_Integral”. Điều này rất hữu ích nếu “tất cả” khiến pdfsolve[] bị treo do một tích phân khó hoặc không thể. Siêu gợi ý này cũng sẽ nhanh hơn nhiều so với “tất cả”, bởi vì tích hợp [] là một quy trình tốn kém

Xem thêm chuỗi tài liệu Sort_pde[] để biết thêm thông tin về các gợi ý và chuỗi tài liệu pde để biết danh sách tất cả các gợi ý được hỗ trợ

Lời khuyên
  • Bạn có thể khai báo đạo hàm của một hàm chưa biết theo cách này

    >>> from sympy import E, Eq, Function, pde_separate, Derivative as D
    >>> from sympy.abc import x, t
    >>> u, X, T = map[Function, 'uXT']
    
    4

  • Xem test_pde. py cho nhiều bài kiểm tra, đây cũng là một tập hợp các ví dụ về cách sử dụng pdsolve[]

  • pdsolve luôn trả về một lớp Bình đẳng [ngoại trừ trường hợp gợi ý là “all” hoặc “all_Integral”]. Lưu ý rằng không thể có nghiệm rõ ràng cho f[x, y] như trong trường hợp của ODE

  • Hãy giúp đỡ [pde. pde_hintname] để được trợ giúp thêm thông tin về một gợi ý cụ thể

ví dụ

>>> from sympy import E, Eq, Function, pde_separate, Derivative as D
>>> from sympy.abc import x, t
>>> u, X, T = map[Function, 'uXT']
5

phân loại_pde#

sympy. người giải quyết. pde. classify_pde[eq , func=None, dict=False, *, prep=True, **kwargs][source]#

Trả về một bộ các phân loại pdsolve[] có thể có cho một PDE

The tuple is ordered so that first item is the classification that pdsolve[] uses to solve the PDE by default. In general, classifications near the beginning of the list will produce better solutions faster than those near the end, though there are always exceptions. To make pdsolve use a different classification, use pdsolve[PDE, func, hint=]. See also the pdsolve[] docstring for different meta-hints you can use.

Nếu

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
4 là true, class_pde[] sẽ trả về từ điển gợi ý. phù hợp với điều khoản biểu thức. Điều này được dành cho sử dụng nội bộ bởi pdsolve[]. Lưu ý rằng vì các từ điển được sắp xếp tùy ý, điều này rất có thể sẽ không theo cùng thứ tự với bộ dữ liệu

Bạn có thể nhận trợ giúp về các gợi ý khác nhau bằng cách thực hiện trợ giúp [pde. pde_hintname], trong đó tên gợi ý là tên của gợi ý không có “_Integral”

xem sympy. pde. allhints hoặc sympy. pde docstring để biết danh sách tất cả các gợi ý được hỗ trợ có thể được trả về từ Class_pde

ví dụ

>>> from sympy import E, Eq, Function, pde_separate, Derivative as D
>>> from sympy.abc import x, t
>>> u, X, T = map[Function, 'uXT']
7

checkpdesol#

sympy. người giải quyết. pde. checkpdesol[pde , sol, func=None, solve_for_func=True][source]#

Kiểm tra xem giải pháp đã cho có thỏa mãn phương trình đạo hàm riêng không

pde là phương trình đạo hàm riêng có thể được đưa ra dưới dạng phương trình hoặc biểu thức. sol là giải pháp mà pde sẽ được kiểm tra. Điều này cũng có thể được đưa ra trong một phương trình hoặc một dạng biểu thức. Nếu chức năng không được cung cấp, chức năng trợ giúp _pre process từ deutils được sử dụng để xác định chức năng

Nếu một chuỗi các giải pháp được thông qua, cùng một loại vùng chứa sẽ được sử dụng để trả về kết quả cho từng giải pháp

Các phương pháp sau hiện đang được triển khai để kiểm tra xem giải pháp có đáp ứng PDE hay không

  1. Trực tiếp thay thế giải pháp trong PDE và kiểm tra. Nếu giải pháp chưa được giải cho f, thì nó sẽ giải được cho f với điều kiện là solution_for_func chưa được đặt thành Sai

Nếu giải pháp thỏa mãn PDE, thì một bộ [True, 0] được trả về. Mặt khác, một bộ [Sai, expr] trong đó expr là giá trị thu được sau khi thay thế giải pháp trong PDE. Tuy nhiên, nếu một giải pháp đã biết trả về Sai, thì có thể do doit[] không có khả năng đơn giản hóa nó thành 0

ví dụ

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
0

Phương pháp gợi ý #

Các chức năng này có nghĩa là để sử dụng nội bộ. Tuy nhiên, chúng chứa thông tin hữu ích về các phương pháp giải khác nhau

pde_1st_linear_constant_coeff_homogeneous#

sympy. người giải quyết. pde. pde_1st_linear_constant_coeff_homogeneous[eq , func, order, match, solvefun][source]#

Giải phương trình đạo hàm riêng tuyến tính thuần nhất bậc nhất với hệ số không đổi

Dạng tổng quát của phương trình đạo hàm riêng này là

\[a \frac{\partial f[x,y]}{\partial x} + b \frac{\partial f[x,y]}{\partial y} + c f[x,y] = 0\]

ở đâu \[a\] , \[b\] and \[c\] are constants.

Giải pháp chung có dạng

\[f[x, y] = F[- a y + b x ] e^{- \frac{c [a x + b y]}{a^2 + b^2}}\]

và có thể tìm thấy trong SymPy với

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
5

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
1

ví dụ

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
2

Người giới thiệu

  • Viktor Grigoryan, “Partial Differential Equations” Math 124A - Fall 2010, pp. 7

pde_1st_linear_constant_coeff#

sympy. người giải quyết. pde. pde_1st_linear_constant_coeff[eq , func, order, match, solvefun][source]#

Giải phương trình đạo hàm riêng tuyến tính bậc nhất với hệ số không đổi

Dạng tổng quát của phương trình đạo hàm riêng này là

\[a \frac{\partial f[x,y]}{\partial x} + b \frac{\partial f[x,y]}{\partial y} + c f[x,y] = G[x

ở đâu \[a\] , \[b\] and \[c\] are constants and \[G[x, y]\] can be an arbitrary function in \[x\] and \[y\].

Giải pháp chung của PDE là

\[\begin{split}f[x, y] = \left. \left[F[\eta] + \frac{1}{a^2 + b^2} \int\limits^{a x + b y} G\left[\frac{a \xi + b \eta}{a . _{\substack{\eta=- a y + b x\\ \xi=a x + b y }}\, ,\end{split}\]

trong đó \[F[\eta]\] là một hàm có giá trị đơn tùy ý. Giải pháp có thể được tìm thấy trong SymPy với

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
5.

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
3

ví dụ

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
4

Người giới thiệu

  • Viktor Grigoryan, “Partial Differential Equations” Math 124A - Fall 2010, pp. 7

pde_1st_linear_variable_coeff#

sympy. người giải quyết. pde. pde_1st_linear_variable_coeff[eq , func, order, match, solvefun][source]#

Giải phương trình đạo hàm riêng tuyến tính bậc nhất với hệ số thay đổi. Dạng tổng quát của phương trình đạo hàm riêng này là

\[a[x, y] \frac{\partial f[x, y]}{\partial x} + b[x, y] \frac{\partial f[x, y]}{\partial y} +

ở đâu \[a[x, y]\] , \[b[x, . PDE này được chuyển đổi thành ODE bằng cách thực hiện chuyển đổi sau. , \[c[x, y]\] and \[G[x, y]\] are arbitrary functions in \[x\] and \[y\]. This PDE is converted into an ODE by making the following transformation:

  1. \[\xi\]\[x\]

  2. \[\eta\] là hằng số trong nghiệm của phương trình vi phân \[\frac{dy}{dx} =

Thực hiện các thay thế trước đó làm giảm nó thành ODE tuyến tính

\[a[\xi, \eta]\frac{du}{d\xi} + c[\xi, \eta]u - G[\xi, \eta] = 0\]

mà có thể được giải quyết bằng cách sử dụng

>>> eq = Eq[D[u[x, t], x, 2], D[u[x, t], t, 2]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='mul']
[Derivative[X[x], [x, 2]]/X[x], Derivative[T[t], [t, 2]]/T[t]]
7

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
5

ví dụ

>>> eq = Eq[D[u[x, t], x], E**[u[x, t]]*D[u[x, t], t]]
>>> pde_separate[eq, u[x, t], [X[x], T[t]], strategy='add']
[exp[-X[x]]*Derivative[X[x], x], exp[T[t]]*Derivative[T[t], t]]
6

Người giới thiệu

  • Viktor Grigoryan, “Partial Differential Equations” Math 124A - Fall 2010, pp. 7

Thông tin về mô-đun pde#

Mô-đun này chứa hàm pdsolve[] và các hàm trợ giúp khác mà mô-đun này sử dụng. Nó được lấy cảm hứng rất nhiều từ mô-đun ode và do đó cơ sở hạ tầng cơ bản vẫn giữ nguyên

Các chức năng trong mô-đun này

Đây là các chức năng người dùng trong mô-đun này

  • pdsolve[] - Giải quyết PDE

  • class_pde[] - Phân loại các PDE thành các gợi ý có thể có cho dsolve[]

  • pde_separate[] - Tách các biến trong phương trình đạo hàm riêng bằng

    phương pháp tách cộng hoặc nhân

Đây là các chức năng trợ giúp trong mô-đun này

  • pde_separate_add[] - Hàm trợ giúp để tìm kiếm các giải pháp có thể phân tách phụ gia

  • pde_separate_mul[] - Hàm trợ giúp để tìm kiếm phép nhân

    giải pháp có thể tách rời

Các phương pháp giải hiện đang được triển khai

Các phương pháp sau đây được thực hiện để giải phương trình đạo hàm riêng. Xem tài liệu về các hàm pde_hint[] khác nhau để biết thêm thông tin về từng hàm [chạy trợ giúp [pde]]

Python có thể giải phương trình vi phân từng phần không?

py-pde là gói Python dùng để giải phương trình đạo hàm riêng [PDEs]. Gói này cung cấp các lớp cho các lưới trên đó có thể xác định các trường vô hướng và tensor. Các toán tử vi phân liên quan được tính toán bằng cách sử dụng triển khai các sai phân hữu hạn được biên dịch bởi tê tê.

Python có thể giải phương trình vi phân không?

Phương trình vi phân được giải bằng Python với Scipy. tích hợp gói bằng hàm odeint hoặc Solve_ivp . t. Các mốc thời gian mà tại đó giải pháp sẽ được báo cáo. Các điểm nội bộ bổ sung thường được tính toán để duy trì độ chính xác của giải pháp nhưng không được báo cáo.

Nêu các phương pháp giải phương trình đạo hàm riêng?

Ba phương pháp số được sử dụng rộng rãi nhất để giải PDE là phương pháp phần tử hữu hạn [FEM], phương pháp thể tích hữu hạn [FVM] và phương pháp sai phân hữu hạn [FDM], as well other kind of methods called Meshfree methods, which were made to solve problems where the aforementioned methods are limited.

Phương trình đạo hàm riêng có khó không?

Nói chung, phương trình đạo hàm riêng khó giải tích hơn nhiều so với phương trình vi phân thông thường .

Chủ Đề