intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Phương pháp tính với C++ - Chương 4

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:45

1.020
lượt xem
72
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

GIẢI HỆ PHƯƠNG TRÌNH ĐẠI SỐ  TUYẾN TÍNH    §1. PHƯƠNG PHÁP GAUSS    Có  nhiều  phương  pháp  để  giải  một  hệ  phương  trình  tuyến  tính  dạng  AX = B. 

Chủ đề:
Lưu

Nội dung Text: Phương pháp tính với C++ - Chương 4

  1. CHƯƠNG 4 : GIẢI HỆ PHƯƠNG TRÌNH ĐẠI SỐ  TUYẾN TÍNH    §1. PHƯƠNG PHÁP GAUSS    Có  nhiều  phương  pháp  để  giải  một  hệ  phương  trình  tuyến  tính  dạng  AX  =  B.  Phương  pháp  giải  sẽ  đơn  giản  hơn  nếu  ma  trận  A  có  dạng  tam  giác  nghĩa là có dạng :  ⎛ a11 0 0⎞ ⎛ a11 a 12 a 13 ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ a 21 a 22 0 ⎟        hay       ⎜ 0 a 22 a 23 ⎟       ⎜a ⎟ ⎜0 0 a 33 ⎟ ⎝ 31 a 32 a 33 ⎠ ⎝ ⎠   Trong  trường  hợp đầu  tiên,  ma  trận được  gọi  là  ma  trận  tam  giác  dưới  và  trường  hợp  thứ  hai  ma  trận  được  gọi  là  ma  trận  tam  giác  trên.  Phương  trình tương ứng với ma trận tam giác dưới có dạng tường minh là :  ⎧a 11 x 1 + 0 x 2 + 0 x 3 = b 1 ⎪ ⎨a 21 x 1 + a 22 x 2 + 0 x 3 = b 2     ⎪a x + a x +a x = b ⎩ 31 1 32 2 33 3 3 Với phương trình dạng này chúng ta sẽ giải phương trình từ trên xuống.  Chương trình giải phương trình ma trận tam giác dưới là :    Chương trình 4‐1    #include   #include   #include   #include   #include   #define max  10    void main()    {    float a[max][max];    float b[max],x[max];    int i,j,k,n,t;    float s,c;    char tl;    clrscr();  83
  2.   printf(ʺCho so phuong trinh n = ʺ);    scanf(ʺ%dʺ,&n);    printf(ʺCho cac phan tu cua ma tran a\nʺ);    for (i=1;i
  3.   printf(ʺ\nʺ);    for (i=1;i
  4.   printf(ʺ\nʺ);    for (i=1;i
  5. Chương trình 4‐2    #include   #include   #include   #include   #include   #define max  10    void main()    {    float a[max][max];    float b[max],x[max];    int i,j,k,n,t;    float s,c;    char tl;        clrscr();    printf(ʺCho so phuong trinh n = ʺ);    scanf(ʺ%dʺ,&n);  printf(ʺCho cac phan tu cua ma tran a :\nʺ);      for (i=1;i
  6.   t=1;    flushall();    while (t)      {      printf(ʺCo sua ma tran a khong(c/k)?ʺ);      scanf(ʺ%cʺ,&tl);      if (toupper(tl)==ʹCʹ)        {        printf(ʺCho chi so hang can sua : ʺ);        scanf(ʺ%dʺ,&i);        printf(ʺCho chi so cot can sua : ʺ);        scanf(ʺ%dʺ,&j);        printf(ʺa[%d][%d] = ʺ,i,j);        scanf(ʺ%fʺ,&a[i][j]);        }      if (toupper(tl)==ʹKʹ)        t=0;      }    printf(ʺMa tran a ban dauʺ);    printf(ʺ\nʺ);    for (i=1;i
  7.   printf(ʺ\nʺ);    flushall();    t=1;    while (t)      {      printf(ʺCo sua ma tran b khong(c/k)?ʺ);      scanf(ʺ%cʺ,&tl);      if (toupper(tl)==ʹCʹ)        {        printf(ʺCho chi so hang can sua : ʺ);        scanf(ʺ%dʺ,&i);        printf(ʺb[%d] = ʺ,i);        scanf(ʺ%fʺ,&b[i]);        }      if (toupper(tl)==ʹKʹ)        t=0;      }    printf(ʺ\nʺ);    printf(ʺMa tran b ban dau\nʺ);    printf(ʺ\nʺ);    for (i=1;i=1;i‐‐)        {          s=0;          for (k=i+1;k
  8.          s=s+a[i][k]*x[k];          x[i]=(b[i]‐s)/a[i][i];        }       printf(ʺ\nʺ);       printf(ʺNghiem cua he da cho la\nʺ);       printf(ʺ\nʺ);       for (i=1;i
  9. a 31 a a a′33 = a 33 − b′2 = b 2 − 21 b 1     b′3 = b 3 − 31 b 1     a 13     a 11 a 11 a 11 Ta  loại  trừ  số  hạng  chứa  x3  trong  dòng  thứ  3  bằng  cách  tương  tự.Ta  nhân  hàng  thứ  2  trong  hệ  AʹX  =  Bʹ  với  a,32/a,22  và đem  trừ  đi  hàng  thứ  3  trong  hệ  mới.  Như  vậy  số  hạng  chứa  x3  biến  mất  và  ta  nhận được  ma trận tam giác  trên.  ⎛ a′′ a′′ a ′′ ⎞ ⎛ x 1 ⎞ ⎛ b′′ ⎞ ⎟ ⎜ ⎟ ⎜ 1⎟ ⎜ 11 12 13 ⎜ 0 a′22 a ′23 ⎟ × ⎜ x 2 ⎟ = ⎜ b′2 ⎟   ′ ′ ′ 0 a ′33 ⎟ ⎜ x 3 ⎟ ⎜ b′3 ⎟ ⎜0 ′ ⎠ ⎝ ⎠ ⎝ ′⎠ ⎝ với  a ′′ = a′   a ′′ = a ′   a ′′ = a′   b′′ = b′   a ′22 = a′22   a ′23 = a′23   ′ ′ 11 11 12 12 13 13 1 1 a′ a′   b′2 = b′2         a ′33 = a′33 − 32 a ′23         b′3 = b′3 − 33 b 2              ′ ′ ′ ′    a′22 a′22 Các phép tính này chỉ thực hiện được khi a11 ≠ 0 và a,11 ≠ 0.  Với  một  hệ  có  n  phương  trình,  thuật  tính  hoàn  toàn  tương  tự.  Sau  đây  là  chương trình giải hệ phương trình n ẩn số bằng phương pháp loại trừ Gauss.    Chương trình 4‐3    #include   #include   #include   #include   #include   #define max  10    void main()    {    float b[max],x[max];    float a[max][max];    int i,j,k,n,t;    float c,s,d;    char tl;      clrscr();    printf(ʺCho so phuong trinh n = ʺ);    scanf(ʺ%dʺ,&n);    printf(ʺCho cac phan tu cua ma tran a :\nʺ);  91
  10.   for (i=1;i
  11.     for (j=1;j
  12.   for (k=1;k
  13.   Xét  hệ  phương  trình  AX=B.  Khi  giải  hệ  bằng  phương  pháp  Gauss  ta  đưa  nó  về  dạng  ma  trận  tam  giác  sau  một  loạt  biến  đổi.  Phương  pháp  khử  Gauss‐Jordan cải tiến khử Gauss bằng cách đưa hệ về dạng  :  EX = B*   và  khi đó  nghiệm  của  hệ  chính  là  B*.  Trong  phương  pháp  Gauss‐Jordan  mỗi  bước tính phải tính nhiều hơn phương pháp Gauss nhưng lại không phải tính  nghiệm. Để  đưa  ma  trận  A  về  dạng  ma  trận  E  tại  bước  thứ  i  ta  phải  có  aii  =  1  và aij = 0. Như vậy tại lần khử thứ i ta biến đổi :    1.aij = aij/aii  (j = i + 1, i + 2,..., n)    2.k = 1, 2,..., n      akj  = akj ‐ aijaki      (j = i + 1, i + 2,..., n)      bk = bk ‐ biaki   Ví dụ : Cho hệ  ⎛8 4 2 0 ⎞ ⎛ x1 ⎞ ⎛ 24 ⎞ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ 4 10 5 4 ⎟ ⎜ x 2 ⎟ ⎜ 32 ⎟ ⎜ 2 5 6.5 4 ⎟ × ⎜ x ⎟ = ⎜ 26 ⎟       ⎜ ⎟ ⎜ 3⎟ ⎜ ⎟ ⎜0 4 4 9 ⎟ ⎜ x 4 ⎟ ⎜ 21 ⎟ ⎝ ⎠⎝ ⎠⎝ ⎠ Biến đổi lần 1: ta chia hàng 1 cho a11 = 8; nhân hàng 1 vừa nhận được với 4 và  lấy  hàng  2  trừ  đi;  nhân  hàng  1  vừa  nhận được  với  2  và  lấy  hàng  3  trừ  đi;  giữ  nguyên hàng 4 vì phần tử đầu tiên đã bằng 0 ta có   ⎛ 1 0.5 0.25 0 ⎞ ⎛ x1 ⎞ ⎛ 3 ⎞ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ 4 ⎟ ⎜ x 2 ⎟ ⎜ 20 ⎟ 08 4 × =   ⎜0 4 4 ⎟ ⎜ x 3 ⎟ ⎜ 20 ⎟ 6 ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜0 4 9 ⎟ ⎜ x 4 ⎟ ⎜ 21 ⎟ 4 ⎝ ⎠⎝ ⎠⎝ ⎠   Biến đổi  lần  2  :  ta  chia  hàng 2 cho a22 = 8; nhân hàng 2 vừa nhận được với 0.5  và  lấy  hàng  1  trừ  đi;  nhân  hàng  2  vừa  nhận được  với  4  và  lấy  hàng  3  trừ  đi;  nhân hàng 2 vừa nhận được với 4 và lấy hàng 4 trừ đi ta có :  ⎛ 1 0 0 − 0.25 ⎞ ⎛ x1 ⎞ ⎛ 1.75 ⎞ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ 0 1 0.5 0.5 ⎟ ⎜ x 2 ⎟ ⎜ 2.5 ⎟ × =   ⎜0 0 4 2 ⎟ ⎜ x 3 ⎟ ⎜ 10 ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜0 0 2 7 ⎟ ⎜ x 4 ⎟ ⎜ 11 ⎟ ⎝ ⎠⎝ ⎠⎝ ⎠ Biến  đổi  lần  3:  Ta  chia  hàng  3  cho  a33  =  4;  giữ  nguyên  hàng  1;  nhân  hàng  3  vừa nhận được với 0.5 và lấy hàng 2 trừ đi; nhân hàng 3 vừa nhận được với 2  và lấy hàng 4 trừ  đi ta có :  95
  14. ⎛ 1 0 0 − 0.25 ⎞ ⎛ x1 ⎞ ⎛ 1.75 ⎞ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ 0 1 0 0.25 ⎟ ⎜ x 2 ⎟ ⎜ 1.25 ⎟ × =   ⎜0 0 1 0.5 ⎟ ⎜ x 3 ⎟ ⎜ 2.5 ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜0 0 0 6 ⎟ ⎜ x4 ⎟ ⎜ 6 ⎟ ⎝ ⎠⎝ ⎠⎝ ⎠   Biến đổi  lần  4:  Ta  chia  hàng  4  cho  a44  =  6;  nhân  hàng  4  vừa  nhận được  với ‐ 0.25  và  lấy  hàng  1  trừ  đi;  nhân  hàng  4  vừa  nhận được  với  0.25  và  lấy  hàng  2  trừ đi; nhân hàng 4 vừa nhận được với 0.5 và lấy hàng 3 trừ đi ta có :  ⎛ 1 0 0 0 ⎞ ⎛ x1 ⎞ ⎛ 2 ⎞ ⎜ ⎟⎜ ⎟ ⎜⎟ ⎜ 0 1 0 0 ⎟ ⎜ x2 ⎟ ⎜ 1 ⎟ ⎜0 0 1 0⎟ × ⎜x ⎟ = ⎜2⎟   ⎜ ⎜0 0 0 1⎟ ⎜ x ⎟ ⎜ 1⎟ 3 ⎟⎜ ⎟ ⎜⎟ ⎝ ⎠ ⎝ 4⎠ ⎝ ⎠ và ta có ngay vec tơ nghiệm.    Chương trình 4‐4    #include   #include   #include   #include   #include   #define  spt  10    void main()    {    float a[spt][2*spt];    float b[spt];    int i,j,k,n,m,t;    float max,c;    char tl;      clrscr();    printf(ʺCho so phuong trinh n = ʺ);    scanf(ʺ%dʺ,&n);    printf(ʺCho cac phan tu cua ma tran a :\nʺ);    for (i=1;i
  15.     {        printf(ʺa[%d][%d] = ʺ,i,j);        scanf(ʺ%fʺ,&a[i][j]);      }    printf(ʺ\nʺ);    printf(ʺMa tran a ma ban da nhapʺ);    printf(ʺ\nʺ);    for (i=1;i
  16.     printf(ʺ\nʺ);      }    printf(ʺ\nʺ);    printf(ʺCho cac phan tu cua ma tran b : \nʺ);    for (i=1;i
  17.   flushall();    i=1;    while (t)      {      if (a[i][i]==0)        {        max=0;        m=i;        for (k=i+1;k
  18.       for (k=1;k
  19.   void main()    {    float a[max][max],r[max][max];    float b[max],x[max],y[max];    int i,j,k,l,n,t;    float s;    char tl;      clrscr();    printf(ʺCho so phuong trinh n = ʺ);    scanf(ʺ%dʺ,&n);    printf(ʺCho cac phan tu cua ma tran a : \nʺ);    for (i=1;i
  20.       scanf(ʺ%dʺ,&i);        printf(ʺCho chi so cot can sua : ʺ);        scanf(ʺ%dʺ,&j);        printf(ʺa[ʺ,i,ʺ,ʺ,j,ʺ] = ʺ);        scanf(ʺ%fʺ,&a[i][j]);        }      if (toupper(tl)==ʹKʹ)        t=0;      }    printf(ʺMa tran a\nʺ);    printf(ʺ\nʺ);    for (i=1;i
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2