C#: Giải Hệ Phương Trình Tuyến Tính Bằng Phép Khử Gauss

VN SEEDER

Chắc chắn là có đủ....

Menu
  • Tin học - Lập trình
    • Lập trình căn bản
    • Lập trình đồ họa
    • Cấu trúc dữ liệu & giải thuật
    • C# và SQL Server
    • Thủ thuật máy tính
  • Kiến thức
    • Có thể bạn chưa biết
    • Làm thế nào
    • Nuôi dạy con
    • Sức khỏe
  • Đọc
    • Hạt giống tâm hồn
    • Truyện cổ tích
    • Truyện cười
    • Truyện ngụ ngôn
    • Tony buổi sáng
    • Phật học
  • Ebook
    • English Ebook
    • Vietnamese Ebook
Trang chủ >>Unlabelled C#: Giải hệ phương trình tuyến tính bằng phép khử Gauss C#: Giải hệ phương trình tuyến tính bằng phép khử Gauss Từ khóa

Lý thuyết:Trong đại số tuyến tính, phép khử Gauss là một thuật toán có thể được sử dụng để tìm nghiệm của một hệ phương trình tuyến tính, tìm hạng(hay rank) của một ma trận, để tínhma trận nghịch đảo của một ma trận vuông khả nghịch. Phép khử Gauss được đặt theo tên của nhà toán học Đức là Carl Friedrich Gauss.Các thao tác cơ bản trên hàng được sử dụng trong suốt thuật toán. Thuật toán có 2 phần, mỗi phần đều xem xét các hàng của ma trận theo thứ tự. Phần đầu biến ma trận vềdạng hàng bậc thang trong khi phần thứ 2 biến ma trận về dạng hàng bậc thang tối giản. Phần đầu là đủ cho nhiều áp dụng.Một thuật toán khác liên quan là phép khử Gauss–Jordan, đưa ma trận về dạng hàng bậc thang tối giản trong 1 lần duyệt.Giả sử mục đích là tìm và miêu tả nghiệm (nếu có) của hệ phương trình tuyến tính sau:2x + y - z = 8 \quad (L_1)-3x - y + 2z = -11 \quad (L_2)-2x + y + 2z = -3 \quad (L_3)Thuật toán là như sau: khử x trong tất cả các phương trình bên dưới L_1, sau đó khủ y trong tất cả các phương trình bên dưới L_2. Việc này sẽ làm hệ trở thành dạng tam giác. Sau đó, sử dụng phép thay thế ngược, các ẩn số có thể được giải.Trong ví dụ, ta khử x từ L_2 bằng cộng \begin{matrix}\frac{3}{2}\end{matrix} L_1 vào L_2, và sau đó khử x từ L_3 bằng cộng L_1 vào L_3. Công thức hóa:L_2 + \frac{3}{2}L_1 \rightarrow L_2L_3 + L_1 \rightarrow L_3Kết quả là:2x + y - z = 8 \, \frac{1}{2}y + \frac{1}{2}z = 1 \, 2y + z = 5 \, Bây giờ ta khử y từ L_3 bằng cách cộng -4L_2 vào L_3:L_3 + -4L_2 \rightarrow L_3Kết quả là:2x + y - z = 8 \, \frac{1}{2}y + \frac{1}{2}z = 1 \, -z = 1 \, Kết quả này là một hệ phương trình tuyến tính dưới dạng tam giác, do đó phần 1 của thuật toán là xong.Phần thứ 2, thay thế ngược, là giải cho các ẩn số trong thứ tự ngược lại. Do đó, chúng ta có thể dễ dàng thấy rằngz = -1 \quad (L_3)Sau đó, thế z vào L_2, giải dễ dàng để cóy = 3 \quad (L_2)Kế tiếp, zy có thể được thế vào L_1, có thể được giải để cóx = 2 \quad (L_1)Do vậy, hệ phương trình đã được giải.Thuật toán này dùng được trên mọi hệ phương trình tuyến tính. Có thể là hệ không thể được đưa về dạng tam giác, tuy nhiên vẫn có ít nhất một lời giải có giá trị: ví dụ, nếu ykhông có trong L_2L_3 sau bước thứ 1 ở trên, thuật toán sẽ không thể đưa hệ về dạng tam giác. Tuy nhiên, nó vẫn đưa hệ về dạng bậc thang. Trong trường hợp này, hệ không có nghiệm duy nhất, và sẽ có vô số nghiệm, vì nó có ít nhất một biến tự do.Trong thực tế, người ta thường không sử dụng hệ phương trình không mà sử dụng ma trận mở rộng (dễ dàng giải trên máy tính). Sau đây là thuật toán của phép khử Gauss áp dụng trên ma trận mở rộng của hệ bên trên, bắt đầu với: \begin{bmatrix} 2 & 1 & -1 & 8 \\ -3 & -1 & 2 & -11 \\ -2 & 1 & 2 & -3 \end{bmatrix} mà, cuối cùng của phần 1 của thuật toán ta sẽ có: \begin{bmatrix} 2 & 1 & -1 & 8 \\ 0 & \frac{1}{2} & \frac{1}{2} & 1 \\ 0 & 0 & -1 & 1 \end{bmatrix} Đó là dạng bậc thang.Cuối cùng của thuật toán, ta có được \begin{bmatrix} 1 & 0 & 0 & 2 \\ 0 & 1 & 0 & 3 \\ 0 & 0 & 1 & -1 \end{bmatrix} Đó là dạng bậc thang tối giản.Phép khử Gauss trên một ma trận n×ncần khoảng 2n3/ 3 phép tính toán. Do đó nó cóđộ phức tạp\mathcal{O}(n^3)\,.Thuật toán này có thể được sử dụng trên máy tính với hàng ngàn hệ phương trình và ẩn số. Tuy nhiên, phương pháp này không thích hợp với hệ có hàng triệu phương trình. Những hệ lớn như vậy thường được giải bằng các phương pháp lặp lại (iterative method). Có những phương pháp đặc biệt nếu như hệ số theo một khuôn mẫu nào đó.Phép khử Gauss có thể được tiến hành trên bất cứ trường nào.Phép khử Gauss là ổn định về phương pháp số cho các ma trận diagonally dominant hay positive-definite. Cho ma trận tổng quát, phép khử Gauss là ổn định nếu như sử dụng partial pivoting.[1]Video:Code:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GiaiHeKhuGauss{ class Gauss { int n; double[,] a; double[] x; public void Nhap() { Console.Write("So luong phuong trinh cua he ? "); n = int.Parse(Console.ReadLine()); a = new double[n, n + 1]; x = new double[n]; Console.WriteLine("Nhap cac phan tu theo thu tu dong: "); for (int i = 0; i < n; i++) { Console.Write("Dong thu " + (i + 1) + " : "); //nhap cac phan tu cach nhau bang phim Tab string[] tmp = Console.ReadLine().Split('\t'); for (int j = 0; j <= n ; j++) { a[i, j] = double.Parse(tmp[j]); } } } public void InHe() { for (int i = 0; i < n; i++) { for (int j = 0; j <= n; j++) Console.Write("{0,-10}",a[i, j]); Console.WriteLine(); } } public void SapThuTu() { //sap xep thu tu cac phuong trinh for (int i = 0; i < n-1; i++) for (int k = i+1; k < n; k++) if (a[i, i] < a[k, i]) for (int j = 0; j <= n ; j++) { double t = a[i, j]; a[i, j] = a[k, j]; a[k, j] = t; } } public void KhuGauss() { //muc dich sap thu tu de tim ma tran bac thang cho de //tim ma tran bac thang la phep khu gauss for (int i = 0; i < n-1; i++) for (int k = i+1; k < n; k++) { double t = a[k,i] / a[i,i]; for (int j = 0; j <= n ; j++) a[k, j] = a[k, j] - t * a[i, j]; } } public void GiaiHe() { for (int i = n-1; i >= 0 ; i--) { x[i] = a[i, n]; for (int j = 0; j <n; j++) if (i != j) x[i] = x[i] - a[i, j] * x[j]; x[i] = x[i] / a[i, i]; } for (int i = 0; i < n; i++) Console.WriteLine( x[i]); } } class Program { static void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; Console.WriteLine("Giải hệ phương trình tuyến tính bằng phép khử Gauss"); Gauss gauss = new Gauss(); gauss.Nhap(); Console.WriteLine("Hệ phương trình vừa nhập: "); gauss.InHe(); Console.WriteLine("Sắp thứ tự hệ: "); gauss.SapThuTu(); gauss.InHe(); Console.WriteLine("Hệ sau khi khử Gauss: "); gauss.KhuGauss(); gauss.InHe(); Console.WriteLine("Kết quả tìm nghiệm của hệ: "); gauss.GiaiHe(); Console.ReadLine(); } }}

Bài liên quan

Bài liên quan

>

Thể loại

Cổ tích Có thể bạn chưa biết Nuôi - Dạy con TonyBuổi Sáng-TnBS Sức khỏe Máy tính Lập trình căn bản Làm thế nào Ngẫm Cấu trúc dữ liệu và giải thuật Hạt giống tâm hồn C# và SQL Server Phật học Truyện ngụ ngôn Giáo dục

Ebook Tiếng Anh

CSharp Facebook SEO Windows

Bài xem nhiều

  • Lập trình căn bản C: Tìm ước chung lớn nhất, bội chung nhỏ nhất của 2 số a, b
  • Lập trình căn bản C: Rút gọn phân số
  • Lập trình căn bản C: Xét trúng tuyển thi đại học
  • Những lần xê dịch
  • Lập trình căn bản C: In ra n số nguyên tố đầu tiên
  • Chuyện tiền chuyện bạc (phần 2)
  • Lập trình căn bản C: in tam giác số đối đỉnh
  • Lập trình căn bản C: tìm số m lớn nhất sao cho tổng từ một đến m nhỏ hơn bằng n
  • Làm Menu lựa chọn bằng mũi tên di chuyển lên xuống C/C++
  • Đảo ngược số nguyên dương bằng cách sử dụng đệ quy (có trả về kết quả)
top

Từ khóa » Cách Khử Gauss