Hướng dẫn tính tích phân trên Stata 16

Sử dụng lớp Quadrature()

Bên cạnh lớp LinearProgram() để giải bài toán tối ưu trong quy hoạch tuyến tính hay bài toán ma trận cơ bản, công cụ Mata ở Stata còn có nhiều lớp đối tượng hữu ích khác. Một trong những lớp được sử dụng phổ biến là lớp Quadrature() được sử dụng để tính tích phân của hàm. Tối thiểu, bạn phải thiết lập cho Mata biết hàm cần lấy tích phân cũng như các cận của nó. Bạn cũng có thể thiết lập kỹ thuật lấy tích phân, số lần lặp tối đa được phép, tiêu chí hội tụ, các đối số được truyền…

Hướng dẫn tính tích phân các hàm đại số qua lớp Quadrature() trên Mata của Stata 16
Hướng dẫn tính tích phân các hàm đại số qua lớp Quadrature() trên Mata của Stata 16

Tính tích phân với lớp Quadrature()

Tích phân của hàm f(x) với x chạy từ a đến b (a luôn nhỏ hơn b), có dạng:

$$\int_a^b {f\left( x \right)} dx$$

Tương tự lớp LinearProgram(), mỗi cặp hàm của lớp Quadrature() cũng bao gồm một hàm q.set chỉ định các thiết lập và hàm q.get trả về thiết lập hiện tại.

Xem thêm:

Sau đây là một số cặp hàm thường được sử dụng trong bài toán lấy tích phân ở mỗi bước thực hiện:

Bước 1: Khởi tạo đối tượng

q = Quadrature()

Bước 2: Thiết lập bài toán tích phân

  • Thiết lập hàm trong dấu tích phân: setEvaluator()q.getEvaluator()
  • Thiết lập hai cận tích phân: setLimits() và q.getLimits()
  • Thiết lập kỹ thuật lấy tích phân: setTechnique() và q.getTechnique() có thể là “gauss” phương pháp adaptive Gauss–Kronrod (mặc định) và phương pháp “simpsonadaptive Simpson.
  • Thiết lập số lần lặp tối đa: setMaxiter() và q.getMaxiter(). Mặc định là 16000 lần lặp.
  • Thiết lập dung sai hội tụ tuyệt đối setAbstol(), q.getAbstol() và tương đối q.setReltol(), q.getReltol()
  • Thiết lập truyền đối số: setArgument(i, arg): thiết lập arg cho đối số bổ sung thứ i (i là số nguyên từ 1 đến 9)

Bước 3: Tính tích phân

Hàm tính tích phân: q.integrate()

Bước 4: Trình bày kết quả

  • value() trả về giá trị tích phân được tính (trả về một giá trị missing lỗi tính toán).
  • iterations() trả về số lần lặp (bằng 0 nếu tích phân chưa chưa được tính).
  • converged() trả về 1 nếu hội tụ và 0 nếu không.
  • errortext() trả về một thông báo lỗi tương ứng với mã lỗi được tạo khi tính toán (trả về một chuỗi rỗng nếu không tìm thấy lỗi).

Minh họa tính tích phân

Ví dụ 1: Tính tích phân \(q = \int_0^\pi {\sin \left( x \right)} dx\)

Đầu tiên, chúng ta phải định nghĩa một hàm trong dấu tích phân (evaluator function)

. *Ví dụ 1
. mata
------------------------------------------------- mata (type end to exit) -----------------------------
: real scalar f(real scalar x) {
>      return(sin(x))
> }

Tiếp đến, khởi tạo lớp q

: q = Quadrature()

Thiết lập tính tích phân

: q.setEvaluator(&f())
: q.setLimits((0, pi()))

Lưu ý, kí tự ‘&’ là con trỏ xác định vị trí hàm trong dấu tích phân (hàm đánh giá)

Tính tích phân

: q.integrate()
  2
: end

Kết quả: \(\int_0^\pi {\sin \left( x \right)} dx = 2\)

Ví dụ 2: Tính tích phân \(q = \int_0^{ + \infty } {\exp \left( { – x} \right)} dx\)

. mata
------------------------------------------------- mata (type end to exit) -----------------------------
: real scalar f1(real scalar x) {
>      return(exp(-x))
> }
: q.setEvaluator(&f1())
: q.setLimits((0, .))
: q.integrate()
  .9999999997
: end

Kết quả: \(\int_0^{ + \infty } {\exp \left( { – x} \right)} dx = 0.9999999997\)

Ví dụ 3: Tính tích phân \(q = \int_{ – \infty }^{ + \infty } {\exp \left( { – {x^2}} \right)} dx\)

. mata
------------------------------------------------- mata (type end to exit) -----------------------------
: real scalar f2(real scalar x) {
>      return(exp(-x*x))
> }
: q.setEvaluator(&f2())
: q.setLimits((., .))
: q.integrate()
  1.772453852
: end

Kết quả: \(\int_{ – \infty }^{ + \infty } {\exp \left( { – {x^2}} \right)} dx = 1.772\)

Ví dụ 4: Truyền giá trị cho đối số bổ sung, z

\(q = \int_0^1 {\left( {{x^2} + {z^2}} \right)} dx\) khi z = 5

. *Ví dụ 4:
. mata
------------------------------------------------- mata (type end to exit) -----------------------------
: real scalar f3(real scalar x, real scalar z) {
> return(x*x + z*z)
> }
: q.setEvaluator(&f3())
: q.setLimits((0, 1))

Thực hiện truyền giá trị 5 cho đối số đầu tiên (chỉ có 1 đối số bổ sung, z)

. *Ví dụ 4:
: q.setArgument(1, 5)
: q.integrate()
  25.33333333
: end

Ví dụ 5: Vector các tích phân

Chúng ta có thể tính toán đồng thời nhiều đối tượng tích phân trong lớp Quadrature() bằng cách khởi tạo đối tượng vector dòng n đối tượng. Ví dụ, tính các tích phân sau:

$$\begin{array}{lllllllllllllll}{qv1}&{ = \int_0^1 {\sqrt x } dx}\\{qv2}&{ = \int_1^2 {\exp \left( x \right)} dx}\\{qv3}&{ = \int_0^{0.5} {\frac{1}{{\sqrt x }}} dx}\end{array}$$

Chúng ta thực hiện như sau:

Định nghĩa hàm lấy tích phân

. *Ví dụ 5:
. mata
------------------------------------------------- mata (type end to exit) -----------------------------
: real scalar f4(real scalar x) {
>      return(sqrt(x))
> }
: real scalar f5(real scalar x) {
>      return(exp(x))
> }
: real scalar f6(real scalar x) {
>      return(1/sqrt(x))
> }

Khởi tạo đối tượng vector dòng

: qv = Quadrature(3)

Thiết lập tính tích phân

: qv[1].setEvaluator(&f4())
: qv[1].setLimits((0, 1))
: qv[2].setEvaluator(&f5())
: qv[2].setLimits((1, 2))
: qv[3].setEvaluator(&f6())
: qv[3].setLimits((0, 0.5))

Thực hiện tính tích phân

: qv[1].integrate()
  .6666666667
: qv[2].integrate()
  4.67077427
: qv[3].integrate()
  1.414213562
: end

Thuyết Nguyễn

- Giảng dạy Kinh tế lượng ứng dụng, PPNCKH - Chuyên gia phân tích dữ liệu với Stata - Dành hơn 15000 giờ nghiên cứu Kinh tế lượng ứng dụng - Đam mê nghiên cứu, học hỏi cái mới; - Làm việc độc lập & tự học cao.

Bài liên quan

Back to top button