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
Tags:
Phương Pháp Tính