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 Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi nguyendinhvanTheo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
Cách đơn giản...-
Channel: Điện thanh
hôm nay, 00:04 -
-
bởi Ng.Phuong.5Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
Mấy con...-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 22:44 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
-
Channel: Điện tử công suất
Hôm qua, 19:02 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi tuyennhanChủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
-
Channel: Điện tử công suất
Hôm qua, 15:43 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi tuyennhanLoa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
-
Channel: Điện thanh
Hôm qua, 15:28 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi mèomướpDạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
-
Channel: Điện thanh
Hôm qua, 11:44 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi viettinhNó không phải cái loa rời. Chả nhẽ đèo thêm 2 con loa tép ngoài thì kỳ lắm....
-
Channel: Điện thanh
Hôm qua, 09:45 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi mèomướpDạ chú mua thêm loa tép nối tiếp qua con tụ rồi mắc vào cùng loa trung là được ạ...
-
Channel: Điện thanh
07-01-2025, 19:53 -
-
Trả lời cho Tìm datasheet linh kiện điện tử.bởi mèomướpDạ cháu hỏi bạn cháu thì bạn ấy trả lời như thế này ạ. Cháu cũng hông bít có đúng hông nữa ạ
Linh kiện điện tử với mã "943BA" và "W58BAL" là một loại cầu chì tự động (circuit breaker) do TE Connectivity sản...-
Channel: Điện tử dành cho người mới bắt đầu
07-01-2025, 19:50 -
-
bởi viettinhChuyện là mình mới đập hộp con loa kéo Sony SRS-XV900. Do khu vực mình k có sẵn hàng để trải nghiệm thực tế nên chỉ tham khảo các kênh revew online.
Mua về sử dụng thì thấy hơi buồn về chất âm, Mở max k to bằng cái loa kéo china, bass...-
Channel: Điện thanh
07-01-2025, 17:18 -
Comment