Viết chương trình Giải hệ phương trình tuyến tính

Lý thuyết:

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.

Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính

Thuật toán là như sau: khử 

Viết chương trình Giải hệ phương trình tuyến tính
 trong tất cả các phương trình bên dưới 
Viết chương trình Giải hệ phương trình tuyến tính
, sau đó khủ 
Viết chương trình Giải hệ phương trình tuyến tính
 trong tất cả các phương trình bên dưới 
Viết chương trình Giải hệ phương trình tuyến tính
. 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ử 

Viết chương trình Giải hệ phương trình tuyến tính
 từ 
Viết chương trình Giải hệ phương trình tuyến tính
 bằng cộng 
Viết chương trình Giải hệ phương trình tuyến tính
 vào 
Viết chương trình Giải hệ phương trình tuyến tính
, và sau đó khử 
Viết chương trình Giải hệ phương trình tuyến tính
 từ 
Viết chương trình Giải hệ phương trình tuyến tính
 bằng cộng 
Viết chương trình Giải hệ phương trình tuyến tính
 vào 
Viết chương trình Giải hệ phương trình tuyến tính
. Công thức hóa:

Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính

Kết quả là:

Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính

Bây giờ ta khử 

Viết chương trình Giải hệ phương trình tuyến tính
 từ 
Viết chương trình Giải hệ phương trình tuyến tính
 bằng cách cộng 
Viết chương trình Giải hệ phương trình tuyến tính
 vào 
Viết chương trình Giải hệ phương trình tuyến tính
:

Viết chương trình Giải hệ phương trình tuyến tính

Kết quả là:

Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính
Viết chương trình Giải hệ phương trình tuyến tính

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ằng

Viết chương trình Giải hệ phương trình tuyến tính

Sau đó, thế 

Viết chương trình Giải hệ phương trình tuyến tính
 vào 
Viết chương trình Giải hệ phương trình tuyến tính
, giải dễ dàng để có

Viết chương trình Giải hệ phương trình tuyến tính

Kế tiếp, 

Viết chương trình Giải hệ phương trình tuyến tính
 và 
Viết chương trình Giải hệ phương trình tuyến tính
 có thể được thế vào 
Viết chương trình Giải hệ phương trình tuyến tính
, có thể được giải để có

Viết chương trình Giải hệ phương trình tuyến tính

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 

Viết chương trình Giải hệ phương trình tuyến tính
không có trong 
Viết chương trình Giải hệ phương trình tuyến tính
 và 
Viết chương trình Giải hệ phương trình tuyến tính
 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:

Viết chương trình Giải hệ phương trình tuyến tính

mà, cuối cùng của phần 1 của thuật toán ta sẽ có:

Viết chương trình Giải hệ phương trình tuyến tính

Cuối cùng của thuật toán, ta có được

Viết chương trình Giải hệ phương trình tuyến tính

Đó là dạng bậc thang tối giản.

Phép khử Gauss trên một ma trận n × n cần khoảng 2n3 / 3 phép tính toán. Do đó nó có độ phức tạp  

Viết chương trình Giải hệ phương trình tuyến tính
.

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.

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
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(); } }

}