Chủ Đề 4: THUẬT TOÁN XÁC ĐỊNH CÔNG THỨC TÍNH GIÁ TRỊ CỦA ĐA THỨC, GHI Ở DẠNG CHÍNH TẮC, TRÊN CƠ SỞ DÙNG CÔNG THỨC NỘI SUY LAGRANGE Giảng viên hướng dẫn: TS.. TRỊNH CÔNG DIỆU Nhóm thực hi
Trang 1Chủ Đề 4:
THUẬT TOÁN XÁC ĐỊNH CÔNG THỨC TÍNH GIÁ TRỊ CỦA ĐA THỨC, GHI Ở DẠNG CHÍNH TẮC, TRÊN CƠ SỞ DÙNG CÔNG THỨC NỘI SUY LAGRANGE
Giảng viên hướng dẫn: TS TRỊNH CÔNG DIỆU
Nhóm thực hiện:
1 Ma Xuân Út
2 Lê Thị Diễm Kiều
3 Nguyễn Văn Tùng
Tháng 12/2014
Trang 2NỘI DUNG TRÌNH BÀY
Trang 31 ĐẶT VẤN ĐỀ:
Cho P là một hàm đa thức bậc bé hơn hoặc bằng n Khi P cho ở dạng chính tắc 0
n i i i
a x
=
∑
,
ta đã có thể tính giá trị của đa thức tại α ∈ℜdễ dàng.
Yêu cầu đặt ra: giải quyết bài toán bằng công thức nội suy Lagrane Tuy nhiên, việc tính giá trị của P(x) tại α ∈ℜ nào đó với công thức dạng Lagrane gặp nhiều khó khăn
hơn so với việc tính giá trị khi đa thức ở dạng chính tắc Một cách tự nhiên, ta tìm hiểu
xem có phương pháp nào có thể tính giá trị của P(x),∀ ∈ℜx khi biết một số giá trị
( )i , 0,1, 2, , n
P x i= trong đó x i là các giá trị đôi một khác nhau bằng công thức dạng chính tắc hay không
Một trong những cách có thể thực hiện điều này là dựa vào công thức nội suy Lagrane với mục tiêu là tìm thuật toán biến đổi đa thức từ dạng Lagrane về dạng chính tắc
Để thuận lợi trong việc kí hiệu và trình bày thuật toán, nhóm xin
chọn cách viết dạng chính tắc của hàm đa thức P ở dạng:
0
n
i
P x a x − a x a x − a
=
với a a0, , 1 a n∈ℜ
2 CƠ SỞ LÝ LUẬN:
2.1 Định lí 1:
Cho các cặp (x y i i, i), =0,n với x i ≠x j nếu i≠ j Khi đó tồn tại duy nhất P(x) là đa thức
bậc nhỏ hơn hoặc bằng n sao cho y i =P x i( )i , =0,n
CM:
Điều kiện cần và đủ để tồn tại duy nhất đa thức P(x) bậc nhỏ hơn hoặc bằng n sao cho
( ), 0,
y =P x i= n là hệ n+1 phương trình (I): ( )
0
0,
n
n i
i
y a x − i n
=
theo các ẩn a a0, , , a1 n có nghiệm duy nhất
Gọi A là ma trận hệ số của (I) Ta có:
1
0 0
1
1 1
1
1 1
1
x x
x x
A
x x
−
−
−
Xét
Trang 40 0
1
1
1
n n
n
B
, 0,
i j n
x x
=
(Định thức Vandermond) , hay detB 0≠ Tùy theo giá trị của n, ta có det( )A =det B( )
hoặc det( )A = −det B( ) , do đó Hệ (I) có
(n+1) phương trình, (n+1) ẩn với định thức ma trận các hệ số khác 0 nên là hệ Crame Hệ này
có nghiệm duy nhất
Định lí đã được chứng minh
2.2 Định lý 2: (Định lý Bezout):
Cho α ∈ℜ, P x( )∈R x[ ]là đa thức ở dạng chính tắc ( ) 1
0
n n i i
P x a x −
=
=∑
Khi đó dư của phép chia P(x) cho (x−α) là P( )α
CM:
Nếu ta chia P(x) cho (x−α) dư hoặc bằng 0 hoặc một đa thức bậc 0 vì bậc (x−α) bằng 1
Vậy dư là một phần tử r∈ℜ Ta có P x( ) (= −x α) ( )q x +r
Thay x bằng αta được: P( )α =0.q x( ) +r hay P( )α =r
2.3 Định lý 3:
Cho P(x) là một đa thức dạng chính tắc
1 0
n n i i
a x −
=
∑
, αlà một số thực bất kỳ Khi đó, ta có đẳng
thức: ( ) 1 1 ( )
P x a x − − b x − − x α b
Trong đó:
0 0
1,i 1, 2, , n
b a
b a αb−
=
Chứng minh:
Theo định lý Bezout thì đẳng thức trên tồn tại
Ta chỉ cần chứng minh đẳng thức truy hồi:
1
VP − b x − − αb x − − b b x − b x − b αb x − b x b αb x −
−
Đồng nhất hệ số của hai vế, ta có:
0 0
1,i 1, 2, , n
b a
b a αb−
=
Hệ quả:
Trang 5Cho Q(x) là đa th c h s th c có d ng chính t cứ ệ ố ự ạ ắ
1
1 0
,
n
n i i i
a x α
−
− −
=
∈ℜ
∑
Khi đó, ta có đẳng thức:
1 1 ( )
a x x α a b x
−
(I) + Bi n đ i t v trái sang v ph i c a (I) đó chính là dùng ph ng phápế ổ ừ ế ế ả ủ ươ dùng sơ đồ hoocner ngược với các hệ số cho bởi :
0 0
1,i 1, 2, , n
b a
b a αa−
=
+ Bi n đ i t v ph i sang v trái (ế ổ ừ ế ả ế I) đó chính là phương pháp dùng sơ đồ hoocner với các
hệ số cho bởi
0 0
1 b ,i 1, 2, , n
a b
a αa−
=
2.4 Cách xây dựng đa thức nội suy Lagrange:
Cho n+1 mốc nội suy ( , ) n n
i i
x y ∈R xR với x i ≠ x jnếu i≠ j,i, j 1, 2, , n= Ta xây dựng đa thức P(x) bậc bé hơn hoặc bằng n sao cho y i =P x i( )i , =1, 2, ,n
Theo định lý 2, P(x) tồn tại và duy nhất
- Ta xây dựng P(x), với nhận xét ( ) ( )
0
n
i i i
P x y Q x
=
=∑
(1), với Q x là đa thức có bậc i( )
n
≤ và Q x i( )
thỏa tinh chất :
( ) 10
i
khi j i
Q x
khi j i
=
i j, =1, 2, ,n
Ta thấy x x0, , ,1 x x i−1, i+1, ,x n
là nghiệm của phương trình Q x i( ) =0 Theo tính ch t c a đa th c :ấ ủ ứ
( ) ( 0) ( 0) ( 1) ( 1) ( ) ( ) ( ) ( )
0
n
j
j i
Q x x x x x x x− x x+ x x P x x x R x
=
≠
Do b c c a ậ ủ Q x i( )
là nghiệm nên R x i( ) =C i,∀x
Mặt khác khi x i =x j thì Q x i( ) =1 vậy ta có:
( ) ( )
0
.C 1
n
j
j i
Q x x x
=
≠
0
1
j
j i
C
x x
=
≠
−
∏
V y ta có công th c d i d ng t ng quát c a P(x) là ậ ứ ướ ạ ổ ủ
Trang 6( )
0 0
0 ( )
j
j i n
j i
j i
j
x x
P x y
x x
≠
=
=
≠
=
−
=
−
∏
∑ ∏
3 THUẬT TOÁN:
Thuật toán xác định P(x) ở dạng chính tắc trên cơ sở dùng công thức nội suy Lagrange
3.1 Nhận xét:
a) Để tìm được P(x) ở dạng chính tắc: ( )
0
n
n i
i
P x a x −
=
=∑
bằng cách giải hệ phương trình
tuyến tính ( ) ( )
0
, 1, 2, ,
n
n k
k
y P x a x − i n
=
b) Từ công thức nội suy Lagrange:
( )
( ) ( )
0 0 0
n
j
j i n j
i n i
j i j
x x
P x y
x x
≠
=
=
≠
=
−
=
−
∏
∑
∏
Bằng thuật toán nhân chia cộng trừ đa thức, và rút gọn ta cũng thu được một biểu thức P(x) được biểu diễn dưới dạng chính tắc , nhưng thuật tón này cần nhiều phép tính, các phép tính dài , phức tạp dễ gây sai sót trong quá trình tính toán
c) Do đó chúng ta tìm một phương pháp sao cho các thao tác tính toán đơn giản hơn , có thể viết được thành một chương trình mà có thể dùng máy tính ứng dụng
3.2 Xây dựng thuật toán xác định dạng chính tắc của
đa thức trên cơ sở dùng công thức nội suy Lagrange:
Cho
( )
0
0
;
n
j
j i
j
n k
j i j
x x
P x a x y
x x
≠
=
−
≠
=
−
−
∏
∏
(a chưa biết) k:
Ta đặt: ( ) ( )
0
n
j j
W x x x
=
( ) ( )
0
n
j
j i
W x x x
=
≠
Trang 7Ta có:
( ) ( ( ) ), , 0,
i
W x
W x x x i n
x x
−
( ) ( )
0
n
j
j i
W x x x
=
≠
Như vậy ta viết P(x) như sau:
( ) ( ) ( ( ) )
0
n
W x
P x y x x
W x
=
Sau đó ta dùng ý tưởng sau để chuyển P(x) về dạng chính tắc
Bước 1:
Tìm dạng biểu diễn chính tắc của ( ) 1 1
0
n
n k k k
W x + t x + −
=
=∑
bằng sơ đồ hoocner ngược, ta làm nhưa sau: W x( ) (= −x x0) (x x− 1) ( x x− i) ( x x− n),i 0, n=
Từ công thức:
( )
1
1
a x x α a b x
−
(I)
0 0
1,i 1, 2, , n
b a
b a αa−
=
i) Ta chọn :
( ) 1 1
0
n
n i i
i
Q x − a x − −
=
=∑
trong (I) là: x x− 0và αlà x1 Vậy ( ) ( ) 2 2
0
k k k
x x x x λ x −
=
Với λ00 =1,λ01= −x0
10 00
1 1 0 0
10 00
11 1 00 01 1 0
12 1 01 1 0
1
, 1, 2 1
:
Hay x x x
x x x
ii) Ta tiến hành lặp như vậy đến (n-1) bước thì ta được:
( ) 1 1
0
n
n k k k
W x + t x + −
=
=∑
Với
( )
0 1 0
1 1 1
n
t
t x
λ
−
− − −
=
Bước 2: Ta tìm dạng chính tắc của
Trang 8( )
0
, 0,
n
n k
k
W x b x − i n
=
Được suy ra từ W(x) bằng sơ đồ hoocner
( ) ( ) ( )
( )
1
W x x x W x
t x b x x x
+
= −
Với
0 0
1
i
b t
b x b − t
=
Bước 3: Ta tính
( )
W x =l
Bằng sơ đồ Hoocner và định lý Bezout
( ) ( ) ( )
W x =T x x x− +l
Ta có:
( )
W x =l
Với
0 0
1
l b
l x c − b
=
Bước 4:
Ta tính các hệ số
1 1 0
, , , ,
n n
x x − x x
Của đa thức:
( ) ( )i i , 0,
i i
y
W x i n
Lần lượt là:
, , 0,
i
ik
in
y
b k n
l =
Bước 5: Ta cộng các hệ số của
, 0,
n k
x − k = n
Thì ta được các hệ số
, 0,
k
a k = n
Của dạng biểu diễn chính tắc:
( )
y
P x a x a b k n
l
−
Trang 9III Biểu diễn thuật toán dưới dạng bảng tổng hợp sau:
Bước 1
0
1
x
x
−
1 1
x
λ
−
12 λ
i
x
−
1
a
b
1
i
x+
…
n
x
… t n+1 W x( )
in
y b
i i in
y b
l ….
i in in
y b l
0
0
x
x
00 1
00 1
b l
=
=
01 01
b
0
n n
b
( ) ( )
0
0 0
W x
W x
0 00
in
y b l
0 01
in
y b
0
0n
in
y b l
…
i
i
x
x
… 0 0
i i
b l
=
…
c e
…
2
i i
d x c t
x e d
( ) ( )
i i
i i
W x
W x
… 0
i i in
y b l
… 1
i i in
y b l
i in in
y b l
n
n
x
…
…
…
nn
l
( ) ( )
n
W x
W x 0
n n in
y b l
n m in
y b l
n nn in
y b l
Trang 10Tính tổng.
Trang 11BẢNG 1:
0
1
x
x
−
1 1
x
λ
−
12 λ
i
x
−
1
a
b
1
i
x+
…
n
x
… t n+1
BẢNG 2:
0
0
0
x
x
00 1
00 1
b l
=
=
01 01
b
0
n n
b
…
i
i
x
x
… 0 0
i i
b l
=
…
c e
…
2
i i
d x c t
x e d
…
n
n
x
…
…
…
nn
l
BẢNG 3:
0
i i in
y b
i i in
y b
l ….
i in in
y b l
( )
( )
0
0 0
W x
W x
0 00
in
y b l
0 01
in
y b
0
0n
in
y b l
…
( )
( )
i i
i i
W x
W x
… 0
i i in
y b l
… 1
i i in
y b l
i in in
y b l
( )
( )
n
W x
W x 0
n n in
y b l
n m in
y b l
n nn in
l
k
Trang 123.3 VÍ DỤ:
Cho
( ) 2 3 3 2 2
P x = x − x − +x
Các mốc nội suy:
i
i
(x y i i, i), =0,3
Lập Bảng 1: Dùng sơ đồ hoocner ngược để tìm dạng chính tắc của
( ) ( 1) ( 1) ( 2)
W x = +x x− x x−
− =x0 1 1 1
1 0
x
2 1
x
3 2
x
( ) 4 2 3 2 2
W x x x x x
Lập Bảng 2: Dùng sơ đồ hoocner để tìm
W x andW x i i( ) i( )i , =0,λ
( )hoocner i( )hoocner i( )i
W x W x W x
0 1
0 1
1 0
1 0
Trang 132 1
2 1
3 2
3 2
( ) 3 3 ( ) 3 3
W x b x − W x b x−
( ) 3 3 ( ) 3 3
W x b x − W x b x −
Dùng Bảng 3 để tính
( )
0
, 0,
n
i
y
W x
=
( ik
b
là các hệ số của
( )
i
W x
ở dạng chính tắc )
i
i i in
y b
i i in
y b
i i in
y b
i i in
y b l
0
.1 3 6
6
−
2 0 0 6
− 1
.1 1
2 = 2 2( ) 2
2 − = − 2 1( ) 1
2 − = − 2.2 2
2 = 2
.1 0
2 =
2 − =
2 − =
−
0 0 0
2 =
− 2
.1
6 =3 4.0 0
6 = 4 1( ) 2
6 − = −3 4.0 0
6 =
k
a
( ) 2 3 3 2 2
P x x x x
Trang 144 MÃ GIẢ
a.Tên thuật toán: NoiSuyLagrange
b Input:
- n { số mốc nội suy }
- x x0, , ,1 x n { giá trị các mốc nội suy}
- y0, y , , y1 n {giá trị của hàm số P tại các mốc nội suy}
c Output: Các hệ số của dạng chính tắc của P: a a0, , ,1 a n
d Giải thuật:
Bước 1: Nhập n
Bước 2: Cho i chạy từ 0 đến n: nhập x i
Bước 3: Cho i chạy từ 0 đến n: nhập y i
Bước 4:
0
1 0 1
2 0 1
1
c
c x x
c x x
=
= − −
=
Bước 5: Cho i chạy từ 3 tới n+1:
- Gán: c i:= −x c i−1 i−1
- Cho j chạy từ i−1 đến 1 gán: c j:= −c j x c i−1 j−1 Bước 6: Cho i tăng từ 0 tới n ta làm phép gán
- b i0 =c0
- l i0 =b i0
- Cho j chạy từ 1 đến n tính:
( ) ( )
1 1
ij j i i j
ij ij i i j
b c x b
l b x l
−
−
= +
= +
Bước 7: Cho i chạy từ 0 đến n
- a i =0
- Cho j chạy từ 0 đến n : a =ai i+(y /l )*bj jn ji
Bước 8: Cho i chạy từ 0 đến n: xuất a i
Trang 155 CHƯƠNG TRÌNH
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
float *a,*c,*x,*y;
int n,k,s,so;
cout<<"================NHOM 8A================="<<endl;
cout<<"Nhap n (So moc noi suy): ";
cin>>so;
n=so-1;
a=new float[n+1]; float **b;
float **l;
b = new float*[n+1];
l= new float*[n+1];
for(int i=0;i<=n;i++)
{
b[i]=new float[n+1];
l[i]=new float[n+1];
}
c=new float[n+2];
x=new float[n+1];
y=new float[n+1];
cout<<"Nhap cac moc noi suy x:\n";
for(int i =0;i<=n;i++)
{
cout<<"x["<<i<<"]= ";
cin>>x[i];
}
cout<<endl<<endl;
cout<<"Nhap gia tri cua ham so tai cac moc noi suy P: \n";
for(int i=0;i<=n;i++)
{
k=i+1;
cout<<"y["<<i<<"]= ";
cin>>y[i];
}
cout<<endl<<endl;
c[0]=1;
c[1]=-x[0]-x[1];
c[2]=x[0]*x[1];
for(int i=3;i<= n+1;i++)
{
Trang 16c[i]=-x[i-1]*c[i-1];
for(int j= i-1; j>=1;j )
{
c[j] = c[j]-x[i-1]*c[j-1];
}
}
for(int i=0;i<=n;i++)
{
b[i][0]=c[0];
l[i][0]=b[i][0];
for(int j=1;j<=n;j++)
{
b[i][j] = c[j] + x[i]*b[i][j-1];
l[i][j] = b[i][j] + x[i]*l[i][j -1];
}
}
for(int i=0;i<=n;i++)
{
a[i] = 0;
for(int j=0;j<=n;j++)
{
a[i]+=(y[j]/l[j][n])*b[j][i];
}
cout<<"a["<<i<<"]= "<<a[i]<<endl;
}
cin>>n;
}