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 về test hipot cao ápbởi nguyendinhvanCách nghĩ của bạn là theo duy tâm thôi. Còn trong công việc thì phải theo duy lý.
Bạn vào goggle và gõ từ : tiêu chuẩn an toàn cách điện.
Bạn sẽ thấy vô vàn các quy định, VN cũng có , quốc tế cũng có. Mỗi vùng , mỗi khu vực,...-
Channel: Điện tử dành cho người mới bắt đầu
02-11-2024, 20:04 -
-
bởi lamvu0677Chào mọi người, ai làm về điện, đặc biệt biến áp xung, mâý con nho nhỏ gắn vào mạch nguồn, cho e hỏi tí ą, e cũng làm trong ty về biển áp thì đo kiểm thành phẩm sẽ kiểm cao áp, tức là kiểm xem có phóng điện giữa các cuộn dây với...
-
Channel: Điện tử dành cho người mới bắt đầu
01-11-2024, 21:05 -
-
bởi AaaabbbbbEm chào các anh chị ,cô chú . Em đang có 1 đề tài: Mô phỏng điều khiển động cơ 1 chiều và bộ điều khiển điện áp tự động (AVR) sử dụng MATLAB/Simulink và Arduino . Anh chị có thế giải thích hoặc định hướng giúp em với được không ạ . Em xin cảm ơn !!...
-
Channel: Vi điều khiển AVR
30-10-2024, 16:38 -
-
bởi 2embeyeuem mới nhập môn, bác nào có sơ đồ của mạch này và cách cắm mạch trên panel cho em xin với, em cảm ơn ạ
-
Channel: Điện tử dành cho người mới bắt đầu
30-10-2024, 15:52 -
-
bởi dqt21091997Hi mọi người,
Team mình hiện là đối tác phân phối cho 1 dịch vụ Proxy US chuẩn bị mở mang tên Proxy Compass. Mọi người có thể trải nghiệm ở đây: https://proxycompass.com/vi/free-trial/
Điểm mạnh của Proxy Compass là:
- 50 địa chỉ IP proxy
...-
Channel: Tổng quan về ngành viễn thông
30-10-2024, 14:46 -
-
Trả lời cho Thắc mắc về kiến thức điện xoay chiềubởi SteinsKMình nhớ là do điện AC không có chia cực cố định như DC, thêm vào đó thì ổ điện loại mà 2 lỗ thì cũng không có phân biệt chiều cắm, thành ra mình cắm chiều nào cũng được. Đây là em hiểu như vậy, có bác nào có ý kiến khác không ạ....
-
Channel: Điện tử dành cho người mới bắt đầu
30-10-2024, 09:57 -
-
bởi tivungvechào mọi người, em là sinh viên mới tìm hiểu về điện em có thắc mắc là tại sao điện AC ở nhà dùng có phích cắm khi cắm vào ổ điện thì cắm chiều nào cũng được, mà em đọc trên mạng thấy điện AC có dây trung tính và dây pha mà nhỉ...
-
Channel: Điện tử dành cho người mới bắt đầu
27-10-2024, 14:25 -
Comment