Giả sử đã có hàm truyền Laplace W(p) (của khâu bậc ba hoặc lớn hơn chẳng hạn). Biết tín hiệu vào Uvao=f(t) và điều kiện đầu. Mình muốn tìm đầu ra Y(t) (0<t<T) thì giải thuật thế nào nhỉ nếu tự viết bằng C? (Không dùng MATLAB và các phần mềm tương tự)
Thông báo
Collapse
No announcement yet.
Giải pt vi phân bằng phương pháp số
Collapse
X
-
Những phương pháp số dùng để giải phương trình vi phân có thể tham khảo ở trang sau:
http://mathworld.wolfram.com/Runge-KuttaMethod.html
Phương pháp đơn giản hơn là phương pháp Euler:
http://www.ugrad.math.ubc.ca/coursed...eqs/euler.html
Muốn giải phương trình vi phân áp dụng phương pháp số, thường viết thành dạng:
x_dot = f(x,u,t) (bậc cao thì hạ bậc bằng cách dùng mô hình không gian trạng thái, định nghĩa véc tơ trạng thái x)
trong đó: x là tín hiệu ra, u là tín hiệu vào và t là thời gian. Nếu dùng mô hình không gian trạng thái thì có dạng sau:
x_dot = A*x + Bu
y = C*x + Du
Phương pháp Euler đơn giản:
x_dot(k) = f(x,u,t)(k);
x(k+1) = x(k) + h*x_dot(k);
Trong chương trình phải định nghĩa hàm số, tức là định nghĩa phương trình vi phân, ví dụ dùng hàm số (function) của MATLAB, hoặc Subroutine của Fortran, hoặc dùng Class của Visual C++...
Sau đó đặt điều kiện đầu (initial conditions) cho biến số, cho tín hiệu vào, và thời gian (cũng như những input arguments khác) và áp dụng công thức sau:
x(0) = điều kiện ban đầu
u = tín hiệu vào
t = thời gian
h = chu kỳ lấy mẫu
// ví dụ dùng phương pháp Euler đơn giản:
x_dot = f(x,u,t);
x += h*x_dot;
Áp dụng các phương pháp tích phân số khác cũng tương tự như vậy.
Có một cuốn sách rất có ích cho lập trình là cuốn Numerical Recipes in C (C++) (có cả bản in Fortran nữa) có bản điện tử miễn phí trên Internet ở trang sau:
http://www.library.cornell.edu/nr/bookcpdf.html
Chúc thành công.
H.A.Last edited by HaiAu2005; 25-03-2006, 18:37.
Comment
-
Cám ơn các bạn. Về nguyên tắc thì đúng là như vậy. Vấn đề là ở chỗ với các khâu bậc cao (thậm chí chỉ cần bậc 3 thôi) nếu làm như trên thì lập trình sẽ rất phức tạp. Không biết MATLAB nó làm thế nào mà hệ phức tạp như thế nào thì nó cũng giải được
Comment
-
Chính là trong cuốn sách tính toán số mà anh Hùng giới thiệu, nó chứa các thuật toán tính toán đó. Cuốn sách dó hơi dày, cho nên có thể bạn sẽ gặp khó khăn khi đọc, nhưng mà đọc trong đó bạn sẽ thấy chi tiết các thuật toán tính toán.
Chúc vui.Falleaf
Công ty TNHH Thương mại và Giao nhận R&P
58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
mail@falleaf.net - VP: (04) 36408561 - (08) 38119870
Comment
-
Tôi đã giải thích rồi, nhưng có lẽ ngắn gọn quá chưa rõ, tôi xin giải thích thêm. Đối với những phương trình vi phân bậc cao (nth-order) thì bạn nên dùng mô hình không gian trạng thái (state space model) để hạ bậc trở thành phương trình vi phần bậc 1 thôi (về hình thức). Phương trình bậc n thì bạn phải làm tích phân n lần, tương đương với việc dùng mô hình không gian trạng thái là định nghĩa véc tơ trạng thái (state vector) có n phần tử. Xin lấy ví dụ phương trình bậc 3 minh họa:
a*yddd + b*ydd + c*yd + d*y = k*u (1) (d = dot, tức là biểu diễn đạo hàm bậc 1, dd đạo hàm bậc 2, ddd đạo hàm bậc 3).
hoặc dạng tương đương là:
yddd = -d/a*y -c/a*yd - b/a*ydd + k/a*u (2)
trong đó a, b, c, d, k là các tham số (parameters, hoặc cũng có thể gọi là coefficients), y và u là tín hiệu ra và tín hiệu vào. Nếu bạn định nghĩa véc tơ trạng thái x = transpose of [x1 x2 x3] = transpose of [y yd ydd] (véc tơ cột có ba phần tử, tương ứng với số bậc của phương trình) thì phương trình (1) trên trở thành mô hình không gian trạng thái như sau:
xd = Ax + Bu (3) (phương trình trạng thái, state)
y = Cx + Du (4) (phương trình quan sát, observation)
trong đó x là véc tơ trạng thái được định nghĩa ở trên, xd là đạo hàm của x, tức xd = transpose of [x1d x2d x3d] = transpose of [yd ydd yddd], A, B, C, D là các ma trận tham số, u là véc tơ tín hiệu vào, y là tín hiệu ra (trong trường hợp ví dụ chỉ có một tín hiệu vào u và một tín hiệu ra y)
A = [0 1 0; 0 0 1; -d/a -c/d -b/a] (viết theo lệnh MATLAB, tức là ma trận 3*3 có ba hàng ba cột)
B = transpose of [0 0 -k/a]
u = u
C = [1 0 0] (vì y = x1)
D = 0 (trường hợp này D = 0, D khác không khi vế phải của (1) xuất hiện đạo hàm bậc cao của u).
Qua ví dụ này chúng ta thấy rằng: từ phương trình bậc cao chúng ta áp dụng mô hình không gian trạng thái chúng ta có thể hạ bậc xuống thành bậc 1 và khi áp dụng trong lập trình, việc viết codes sẽ đơn giản hơn nhiều. Trong các ngôn ngữ lập trình chúng ta đều có thể sử dụng việc khai biến mảng (array) để tính toán được. Bạn viết lại những phương trình trên ra giấy theo ký hiệu toán học thông thường sẽ rõ hơn. Xin tham khảo sách về mô hình không gian trạng thái thì bạn sẽ hiểu rõ hơn và sẽ áp dụng được vào trong việc lập trình.
Xin nói thêm: MATLAB (MATrix LABoratory) là chương trình ưu tiên tính toán bằng ma trận, do đó việc giải phương trình vi phần dùng mô hình không gian trạng thái bằng MATLAB không khó khăn lắm. Các chương trình đi kèm MATLAB cũng rất tiện lợn. Chương trình đi kèm với MATLAB là Simulink cũng có thể dùng để giải phương trình vi phân được, Simulink là chương trình lập trình sử dụng các khối (blocks), dạng giống sơ đồ khối trong điều khiển tự động đó. Sử dụng Simulink để giải phương trình vi phân cũng khá đơn giản vì trong Simulink có các khối như Integrator block, Transfer Function block... có thể dùng cho mô hình (phương trình vi phân được. Khi chạy một mô hình Simulink các phương pháp tích phân số như pp Euler, pp Adams, pp Runge-Kutta .v.v... đã có sẵn rồi, chỉ việc lựa chọn phương pháp vi phân số. Trường hợp mà trong thư viện Simulink bạn không thể tìm được khối nào phù hợp cho bài toán của bạn thì bạn có thể dùng S-function block (user-definable block), có thể nói nôm na, đây là một dạng khối mở của Simulink cho người sử dụng có thể định nghĩa (hoặc thêm) khối (block) của mình vào trong thư viện Simulink. S-function block của Simulink cũng giống như lệnh function của MATLAB, Subroutine của Fortran và Class của C++.
H.A.
Comment
-
giải phương trình và hệ phương trình vi phân trong matlab
Em chào anh H.A và các bạn
Hiện tại em đang gặp bài toán phải giải hệ phương trình vi phân cấp hai có sáu ẩn số .Thực sự đây là điều khó khăn đối với em.
anh H.A và các bạn có cách nào mà có thể giải hệ phương trình vi phân bậc cao có nhiều ẩn số không ạ ?
liệu mình có thể giải trên mô hình simulink của matlab không ? nếu có ví dụ thì hay.
mong được sự giúp đỡ.
em cảm ơn.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
-
bởi namlangnhoXin chào mọi người. E có sử dụng 1 cục nguồn tổ ong 12v-30A chạy đèn led xe trà sữa. Mà thợ thi công bị rò điện nên điện rò ra khung xe. E dùng đồng hồ đo điện ở khung xe và cả output thì thấy có dòng điện xoay chiều hơn 100v. Nên chạm...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 00:12 -
-
bởi Manh.n.trCác bác cho em hỏi cách điều chế xung răng cưa sang xung vuông với ạ. Em đang thấy khó ạ...
-
Channel: Kỹ thuật điện tử tương tự
13-12-2024, 20:46 -
-
Trả lời cho hỏi về thiết kế mạch tuần tự trên proteusbởi Hatruong1309
-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
-
bởi Hatruong1309Cho e hỏi là phần chân X thì nối cái j thì mạch mới chạy được ạ và kiểm tra đúng sai kiểu j ạ
Đề bài thiết kế mạch dãy đồng bộ nhận biết dãy tín hiệu vào ở dạng nhị phân được đưa liên tiếp ở đầu vào X và được đồng...-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
Comment