Thông báo

Collapse
No announcement yet.

Giải pt vi phân bằng phương pháp số

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giải pt vi phân bằng phương pháp số

    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ự)

  • #2
    Bác thử thay P=(1/Tc)((z-1)/(z+1)) Tc là chu kì cắt mẫu, em không nhớ chi tiết, bác về tra lại sách ĐKTĐ có nói cả mà.

    Comment


    • #3
      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


      • #4
        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


        • #5
          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


          • #6
            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


            • #7
              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


              • #8
                Chào bạn Hoangminh, bạn phải hỏi rõ hơn mới được, pt của bạn như thế nào ? Bạn muốn giải nghiệm hay giải số. Như vậy thì người được hỏi mới hiểu câu hỏi của bạn

                Comment

                Về tác giả

                Collapse

                dqhuy74 Tìm hiểu thêm về dqhuy74

                Bài viết mới nhất

                Collapse

                Đang tải...
                X