Hàm đa thức - Chương 2: Giải gần đúng phương trình đại số và siêu việt (Phần 2)

Sau khi phân tích xong Pn(x) ta tiếp tục phân tích Pn-2(x) theo phương pháp trên. Các bước tính toán gồm:

 - Chọn các giá trị ban đầu bất kì s0 và p0

 - Tính các giá trị bo,.,bn theo (1)

 - Tính các giá trị co,.,cn theo (2)

 - Tính so và po theo (3) và (4)

 - Tính s1 = s0 + so và p1 = po+ po

 - Lặp lại bước 1 cho đến khi pi+1 = pi = p và si+1 = si = s

 - Giải phương trình x2 - sx + p để tìm 2 nghiệm của đa thức

- Bắt đầu quá trình trên cho đa thức Pn-2(x)

 

doc9 trang | Chuyên mục: Giải Tích | Chia sẻ: tuando | Lượt xem: 458 | Lượt tải: 0download
Tóm tắt nội dung Hàm đa thức - Chương 2: Giải gần đúng phương trình đại số và siêu việt (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
với 	Xi = { si, pi}T và 	Xi+1 = { si+1, pi+1}T
Quan hệ : J(Xi)DX = -F(Xi) với DX = {si+1 - si,pi+1 - pi}T tương ứng với một hệ phương trình tuyến tính hai ẩn số Ds = si+1 - si và Dp = pi+1 - pi :
Theo công thức Cramer ta có :
Để dùng được công thức này ta cần tính được các đạo hàm ,,,. Các đạo hàm này được tính theo công thức truy hồi.
Do bo = ao nên 
b1 = a1 + sbo nên	
b2 = a2 + sb1- pbo nên 	
Mặt khác :	
nên: 	
b3 = a3 + sb2- pb1 nên:	
Nếu chúng ta đặt :
thì :	
co = bo	(2)
	c1 = b1 + sbo = b1 + sco
	c2 = b2 + sc1 - pco
	....................
	ck = bk + sck-1 - pck-2
	cn-1 = bn-1 + scn-2 - pcn-3
Như vậy các hệ số cũng được tính theo cách như các hệ số bk. Cuối cùng với f = bn-1 và g = bn ta được:	
	(3)
	(4)
	Sau khi phân tích xong Pn(x) ta tiếp tục phân tích Pn-2(x) theo phương pháp trên. Các bước tính toán gồm:
	- Chọn các giá trị ban đầu bất kì s0 và p0
	- Tính các giá trị bo,..,bn theo (1)
	- Tính các giá trị co,...,cn theo (2)
	- Tính Dso và Dpo theo (3) và (4)
	- Tính s1 = s0 + Dso và p1 = po+ Dpo
	- Lặp lại bước 1 cho đến khi pi+1 = pi = p và si+1 = si = s
	- Giải phương trình x2 - sx + p để tìm 2 nghiệm của đa thức
- Bắt đầu quá trình trên cho đa thức Pn-2(x)
Ví dụ: Tìm nghiệm của đa thức P4(x) = x4 - 1.1x3 + 2.3x2 + 0.5x2 + 3.3.
Với lần lặp ban đầu ta chọn s = -1 và p =1, nghĩa là tam thức có dạng: x2+x+1
	a0	a1	a2	a3	a4
	1	-1.1	2.3	0.5	3.3
 sbi	-1	2.1	-3.4	0.8
 -pbi-1	-1	2.1	-3.4
 bi	1	-2.1	3.4	-0.8 = bn-1	0.7=bn
 sbi	-1.0	3.1	-5.5
 -pbi-1	-1.0	3.1
	ci	1	-3.1	 5.5	-3.2
s* = -1 + 0.11 = -0.89
p* = 1 + 0.06 = 1.06
Tiếp tục lặp lần 2 với s1 = s* và p1 = p* ta có :
a0	a1	a2	a3	a4
	1	-1.1	2.3	0.5	3.3
 sbi	-0.89	1.77	-2.68	0.06
 -pbi-1	-1.06	2.11	-3.17
 bi	1	-1.99	3.01	-0.07 = bn-1	0.17=bn
 sbi	-0.89	2.56	-4.01
 -pbi-1	-1.0	 3.1
	ci	1	-2.88	4.51	-1.03
s* = -0.89 - 0.01 = -0.9
p* = 1.06 + 0.04 = 1.1
Như vậy: 	
P4(x) = (x2 + 0.9x + 1.1)(x2 + 2x + 3)
Chương trình sau áp dụng lí thuyết vừa nêu để tìm nghiệm của đa thức.
Chương trình 2-10
//phuong phap Bairstow
#include 
#include 
#include 
#include 
#define m 10
void main()
 {
	float a[m],b[m],c[m];
	int i,n,v;
	float s,e1,t,p,q,r,p1,q1;
	clrscr();
	printf("Cho bac cua da thuc n = ");
	scanf("%d",&n);
	printf("Cho cac he so cua da thuc can tim nghiem\n");
	for (i=n;i>=0;i--)
	 {
	printf("a[%d] = ",n-i);
	scanf("%f",&a[i]);
	 }
	printf("\n");
	e1=0.0001;
	if (n<=2)
	 if (n==1)
	{
	 printf("Nghiem cua he\n");
	 printf("%.8f",(a[0]/(-a[1])));
	 getch();
	 exit(1);
	}
	do
	 {
	v=0;
	p=1;
	q=-1;
	b[n]=a[n];
	c[n]=a[n];
	do
	 {
	b[n-1]=b[n]*p+a[n-1];
	c[n-1]=b[n-1]+b[n]*p;
	for (i=n-2;i>=0;i--)
	 {
	b[i]=b[i+2]*q+b[i+1]*p+a[i];
	c[i]=c[i+2]*q+c[i+1]*p+b[i];
	 }
	r=c[2]*c[2]-c[1]*c[3];
	p1=p-(b[1]*c[2]-b[0]*c[3])/r;
	q1=q-(b[0]*c[2]-b[1]*c[1])/r;
	if ((fabs(b[0])<e1)&&(fabs(b[1])<e1))
	 goto tt;
	v=v+1;
	p=p1;
	q=q1;
	 }
	while (v<=40);
	if(v>40)
	 {
	printf("Khong hoi tu sau 40 lan lap");
	getch();
	exit(1);
	 }
	tt:s=p1/2;
	t=p1*p1+4*q1;
	if(t<0)
	 {
	printf("Nghiem phuc\n");
	printf("%.8f+%.8fj\n",s,(sqrt(-t)/2));
	printf("%.8f-%.8fj\n",s,(sqrt(-t)/2));
	printf("\n");
	 }
	else
	 {
	printf("Nghiem thuc\n");
	printf("%.8f\n",(s+sqrt(t)/2));
	printf("%.8f\n",(s-sqrt(t)/2));
	printf("\n");
	 }
	for (i=2;i<=n;i++)
	 a[i-2]=b[i];
	 n=n-2;
	 }
	while ((n>2)&(r!=0.0));
	s=-a[1]/(2*a[2]);
	t=a[1]*a[1]-4*a[2]*a[0];
	if (t<0)
	 {
	printf("Nghiem phuc\n");
	printf("%.8f+%.8fj\n",s,(sqrt(-t)/(2*a[2])));
	printf("%.8f-%.8fj\n",s,(sqrt(-t)/(2*a[2])));
	printf("\n");
	 }
	else
	 {
	printf("Nghiem thuc\n");
	printf("%.8f\n",(s-sqrt(t)/(2*a[2])));
	printf("%.8f\n",(s-sqrt(t)/(2*a[2])));
	printf("\n");
	 }
	getch();
 }
	Dùng chương trình trên để xác định nghiệm của đa thức :
	x6 - 2x5 - 4x4 + 13x3 - 24x2 + 18x - 4 = 0
ta nhận được các nghiệm :
	x1 = 2.61903399
	x2 = -2.73205081
	x3 = 0.732050755
	x4 = 0.381966055
	x5 = 0.500011056 + i*1.3228881
	x6 = 0.500011056 - i*1.3228881
§11. HỆ PHƯƠNG TRÌNH PHI TUYẾN
	Phương pháp Newton có thể được tổng quát hoá để giải hệ phương trình phi tuyến dạng :
hay viết gọn hơn dưới dạng :
	F(X) = 0
Trong đó : 	
X = (x1,x2,x3,.....,xn)
	Với một phương trình một biến, công thức Newton là :
hay :	f'(xi).Dx = -f(xi)
với	Dx = xi+1 - xi
Đối với hệ,công thức lặp là :
 J(Xi)Dx = -F(Xi)
Trong đó J(Xi) là toán tử Jacobi. Nó là một ma trận bậc n ( n - tương ứng với số thành phần trong vectơ X) có dạng :
và	DX = Xi+1 - Xi
	Phương pháp Newton tuyến tính hoá hệ và như vậy với mỗi bước lặp cần giải một hệ phương trình tuyến tính (mà biến là Dxi) xác định bởi công thức lặp cho tới khi vectơ X(x1,x2,x3,.....,xn) gần với nghiệm.
	Dưới đây là chương trình giải hệ phương trình phi tuyến 
Ma trận đạo hàm riêng J(Xi) là :
	Ma trận này được chương trình đọc vào nhờ thủ tục doc.Trong thủ tục này,các hệ số a[i,5] là các hàm fi(x).Vectơ nghiệm ban đầu được chọn là { 0,-1,-1,1}T.Kết quả tính cho ta : x = {0.01328676,-1.94647929,-1.12499779,8.05819031 }T với độ chính xác 0.000001.Vectơ số dư r = { 0.00000536,-0.00000011,-0.00000001,-0.00000006}T.
Chương trình 2-11
//giai he pt phi tuyen
#include 
#include 
#include 
#include 
#define n 4
float a[n+1][n+2];
float x[n+1],y[n+1];
int i,j,k,l,z,r;
float e,s,t;
void main()
 {
	void doc();
 clrscr();
	printf("Cho cac gia tri nghiem ban dau\n");
	for (i=1;i<=n;i++)
	 {
	printf("x[%d] = ",i);
	scanf("%f",&x[i]);
	 }
	e=1e-6;
	z=30;
	for (r=1;r<=z;r++)
	 {
	doc();
	for (k=1;k<=n-1;k++)
	 {
	s=0 ;
	for (i=k;i<=n;i++)
	 {
	t=fabs(a[i][k]);
	if (s<=t)
	 {
	s=t;
	l=i;
	 }
	 }
	for (j=k;j<=n+1;j++)
	 {
	s=a[k][j];
	a[k][j]=a[l][j];
	a[l][j]=s;
	 }
	if (a[1][1]==0)
	 {
	printf("Cac phan tu duong cheo cua ma tran bang khong");
	getch();
	exit(1);
	 }
	else
	 {
	if (fabs(a[k][k]/a[1][1])<(1e-08))
	 {
	printf("Ma tran suy bien");
	goto mot;
	 }
	 }
	for (i=k+1;i<=n;i++)
	 {
	if (a[k][k]==0)
	 {
	printf("Cac phan tu duong cheo cua ma tran bang khong\n");
	goto mot;
	 }
	s=a[i][k]/a[k][k];
	a[i][k]=0;
	for (j=k+1;j<=n+1;j++)
	 a[i][j]=a[i][j]-s*a[k][j];
	 }
	y[n]=a[n][n+1]/a[n][n];
	for (i=n-1;i>=1;i--)
	 {
	s=a[i][n+1];
	for (j=i+1;j<=n;j++)
	 s=s-a[i][j]*y[j];
	if (a[i][i]==0)
	 {
	printf("Cac phan tu duong cheo cua ma tran bang khong\n");
	goto mot;
	 }
	y[i]=s/a[i][i];
	 }
	 }
	if (r!=1)
	 for (i=1;i<=n;i++)
	{
	 if (fabs(y[i])<e*fabs(x[i]))
	goto ba;
	}
	for (i=1;i<=n;i++)
	 x[i]=x[i]-y[i];
	printf("\n");
	 }
	printf("Khong hoi tu sau %d lan lap\n",z);
	goto mot;
	clrscr();
	ba:printf("Vec to nghiem\n");
	for (i=1;i<=n;i++)
	 printf("%.5f\n",(x[i]-y[i]));
	printf("\n");
	printf("Do chinh xac cua nghiem la %.5f: \n", e);
	printf("\n");
	printf("Vec to tri so du :\n");
	for (i=1;i<=n;i++)
	 printf("%.5f\n",(a[i][n+1]));
	mot:printf("\n");
	getch();
 }
void doc()
 {
	a[1][1]=3*x[1]*x[1]-3*x[2]*x[4];
	a[1][2]=-3*x[2]*x[2]-3*x[1]*x[4];
	a[1][3]=0;
	a[1][4]=-3*x[1]*x[2];
	a[1][5]=x[1]*x[1]*x[1]-x[2]*x[2]*x[2]-3*x[1]*x[2]*x[4]-8;
	a[2][1]=1;
	a[2][2]=1;
	a[2][3]=1;
	a[2][4]=1;
	a[2][5]=x[1]+x[2]+x[3]+x[4]-5;
	a[3][1]=-x[1]/sqrt(25-x[1]*x[1]);
	a[3][2]=0;
	a[3][3]=8;
	a[3][4]=0;
	a[3][5]=sqrt(25-x[1]*x[1])+8*x[3]+4;
	a[4][1]=2*x[2]*x[3];
	a[4][2]=2*x[1]*x[3];
	a[4][3]=2*x[1]*x[2];
	a[4][4]=-1;
	a[4][5]=2*x[1]*x[2]*x[3]-x[4]+8;
 }

File đính kèm:

  • docham_da_thuc_chuong_2_giai_gan_dung_phuong_trinh_dai_so_va_si.doc