PHƯƠNG PHÁP LẶP BERNOULLI



PHƯƠNG PHÁP LẶP BERNOULLI
                Có nhiều phương pháp để tìm nghiệm của một đa thức. Ta xét phương trình:
                aoxn + a1xn-1 + ××× + an = 0
Nghiệm của phương trình trên thoả mãn định lí: Nếu max{| a1 |, | a2 |,..., |an |} = A thì các nghiệm của phương trình thoả mãn điều kiện | x | < 1 + A/ | a0|

                Phương pháp Bernoulli cho phép tính toán nghiệm lớn nhất a của một đa thức Pn(x) có n nghiệm thực phân biệt. Sau khi tìm được nghiệm lớn nhất a ta chia đa thức Pn(x) cho (x-a) và nhận được đa thức mới Qn-1(x). Tiếp tục dùng phương pháp Bernoulli để  tìm  nghiệm  lớn nhất của Qn-1(x).
 Sau đó lại tiếp tục các bước trên cho đến khi tìm hết các nghiệm của Pn(x).
                Chúng ta khảo sát phương trình sai phân j có dạng như sau :
                                j = aoyk+n + a1yk+n-1 +.....+  anyk = 0                                                                   (1)
Đây là một phương trình sai phân tuyến tính hệ số hằng. Khi cho trước các giá trị đầu yo, y1,..yn-1 ta tìm được các giá trị yn, yn+1,.. Chúng được gọi là nghiệm của phương trình sai phân tuyến tính (1).
Đa thức
Pn(x) = a0xn + a1xn-1 +..+an-1x + an                                                                                    (2)
với cùng một hệ số ai như (1) được gọi là đa thức đặc tính của phương trình sai phân tuyến tính (1). Nếu (2) có n nghiệm phân biệt x1, x2,.., xn thì (1) có các nghiệm riêng là
Nếu yi là các nghiệm của phương trình sai phân là tuyến tính (1),thì
                                                                                                                       (3)
với các hệ số ci bất kì cũng là nghiệm của phương trình sai phân tuyến tính hệ số hằng (1).
Nếu các nghiệm cần sao cho :
                | x1|  ³ | x2 |  ³...| xn|
Vậy       
 
 và          
do đó : 
do           x1 > x2   >...> xn
nên:       
vậy:        
Nghĩa là :            
                Nếu phương trình vi phân gồm n+1 hệ số, một nghiệm riêng yk có thể được xác định từ n giá trị yk-1, yk-2,...,yn-1. Điều cho phép tính toán bằng cách
truy hồi các nghiệm riêng của phương trình vi phân.
                Để tính nghiệm lớn nhất của đa thức, ta xuất phát từ các nghiệm riêng y1 = 0, y1 = 0,.., yn =1  để tính yn+1. Cách tính này được tiếp tục để tính yn+2 xuất phát từ y1 = 0, y2 = 0,..,yn+1 và tiếp tục cho đến khi yk+1/yk không biến đổi nữa. Trị số của yk+n được tính theo công thức truy hồi :
                                                                                          (4)
Ví dụ: Tính nghiệm của đa thức Pn(x) = P3(x) =  x3 - 10x2 + 31x - 30.
Như vậy ao = 1, a1 = -10,a2 = 31 và a3 = -30.
Phương trình sai phân tương ứng là :
yk+3 -10yk+2 + 31yk+1 - 30yk = 0
Ta cho trước các giá trị y1 = 0; y2 = 0 và y3 = 1. Theo (4) ta tính được :
y4 = - (-10y3 + 31y2 - 30y1) = 10
y5 = - (-10y4 + 31y3 - 30y2) = 69
y6 = - (-10y5 + 31y5 - 30y3) = 410
y7 = - (-10y6 + 31y5 - 30y4) = 2261
y8 = - (-10y7 + 31y6 - 30y5) = 11970
y9 = - (-10y8 + 31y7 - 30y6) = 61909
y10 = - (-10y9 + 31y8 - 30y8) = 315850
y11 = - (-10y10 + 31y9 - 30y8) = 1598421
y12 = - (-10y11 + 31y10 - 30y9) = 8050130
y13 = - (-10y12 + 31y11 - 30y10) = 40425749
y14 = - (-10y13 + 31y12 - 30y11) = 202656090
y15 = - (-10y14 + 31y13 - 30y12) = 1014866581
y16 = - (-10y15 + 31y14 - 30y13) = 5079099490
y17 = - (-10y16 + 31y15 - 30y14) = 24409813589
y18 = - (-10y17 + 31y16 - 30y15) = 127092049130
y19 = - (-10y18 + 31y17 - 30y16) = 635589254740
Tỉ số các số yk+1/yk lập thành dãy :
                10 ; 6.9 ; 5.942 ; 5.5146 ; 5.2941 ; 5.172 ; 5.1018 ; 5.0607 ; 5.0363 ; 5.0218 ; 5.013 ; 5.0078 ; 5.0047 ; 5.0028 ; 5.0017 ; 5.001
nghĩa là chúng sẽ hội tụ tới nghiệm lớn nhất là 5 của đa thức.

Chương trình 2-7


//phuong phap Bernoulli
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define max  50

void main()
  {
                float a[max],y[max];
                int k,j,i,n,l;
                float s,e1,e2,x0,x1,x;

                clrscr();
                printf("Cho bac cua da thuc can tim nghiem n = ");
                scanf("%d",&n);
                e1=1e-5;
                printf("Cho cac he so cua da thuc can tim nghiem\n");
                for (i=0;i<=n;i++)
                  {
                                printf("a[%d] = ",i);
                                scanf("%f",&a[i]);
                  }
                for (k=0;k<=n;k++)
                  a[k]=a[k]/a[0];
                  tt: x1=0;
                for (k=2;k<=n;k++)
                  y[k]=0;
                y[1]=1;
                l=0;
                do
                  {
                                l=l+1;
                                s=0;
                                for (k=1;k<=n;k++)
                                  s=s+y[k]*a[k];
                                y[0]=-s;
                                x=y[0]/y[1];
                                e2=fabs(x1 - x);
                                x1=x;
                                for (k=n;k>=1;k--)
                                y[k]=y[k-1];
                  }
                while((l<=50)||(e2>=e1));
                if(e2>=e1)
                  {
                                printf("Khong hoi tu");
                                getch();
                                exit(1);
                  }
                else
                  printf("Nghiem x = %.4f\n",x);
                n=n-1;
                if (n!=0)
                  {
                                a[1]=a[1]+x;
                                for (k=2;k<=n;k++)
                                  a[k]=a[k]+x*a[k-1];
                                goto tt;
                  }
                getch();
  }

Kết quả nghiệm của đa thức  x3 - 10x2 + 31x - 30 là:5 ; 3 và 2
Ntech Developers

Programs must be written for people to read, and only incidentally for machines to execute.

Post a Comment

Previous Post Next Post