Giáo trình Lập trình Turbo C (Phần 2)

Ch¬ng 8 : Gi¶i gÇn ®óng ph¬ng tr×nh ®¹i sè  
vµ siªu viÖt  
§1.Kh¸i niÖm chung  
NÕu ph¬ng tr×nh ®¹i sè hay siªu viÖt kh¸ phøc t¹p th× Ýt khi t×m ®îc nghiÖm  
®óng.Bëi vËy viÖc t×m nghiÖm gÇn ®óng vµ íc lîng sai sè lµ rÊt cÇn thiÕt.  
Ta xÐt ph¬ng tr×nh :  
f(x) = 0  
(1)  
víi f(x) lµ hµm cho tríc cña biÕn x.Chóng ta cÇn t×m gi¸ trÞ gÇn ®óng cña nghiÖm cña  
ph¬ng tr×nh nµy.  
Qu¸ tr×nh gi¶i thêng chia lµm hai bíc: bíc s¬ bé vµ bíc kiÖn toµn nghiÖm.  
Bíc gi¶i s¬ bé cã 3 nhiÖm vô:v©y nghiÖm, t¸ch nghiÖm vµ thu hÑp kho¶ng chøa  
nghiÖm.  
V©y nghiÖm lµ t×m xem c¸c nghiÖm cña ph¬ng tr×nh cã thÓ n»m trªn nh÷ng ®o¹n  
nµo cña trôc x.T¸ch nghiÖm lµ t×m c¸c kho¶ng chøa nghiÖm soa cho trong mçi kho¶ng chØ  
cã ®óng mét nghiÖm.Thu hÑp kho¶ng chøa nghiÖm lµ lµm cho kho¶ng chøa nghiÖm cµng  
nhá cµng tèt.Sau bíc s¬ bé ta cã kho¶ng chøa nghiÖm ®ñ nhá.  
Bíc kiÖn toµn nghiÖm t×m c¸c nghiÖm gÇn ®óng theo yªu cÇu ®Æt ra.  
Cã rÊt nhiÒu ph¬ng ph¸p x¸c ®Þnh nghiÖm cña (1).Sau ®©y chóng ta xÐt tõng ph¬ng  
ph¸p.  
§2.Ph¬ng ph¸p lÆp ®¬n  
Gi¶ sö ph¬ng tr×nh (1) ®îc ®a vÒ d¹ng t¬ng ®¬ng :  
x = g(x)  
tõ gi¸ trÞ xo nµo ®ã gäi lµ gi¸ trÞ lÆp ®Çu tiªn ta lËp d·y xÊp xØ b»ng c«ng thøc :  
xn = g(xn-1) (3)  
(2)  
víi n = 1,2,....  
Hµm g(x) ®îc gäi lµ hµm lÆp.NÕu d·y xn → α khi n →∝ th× ta nãi phÐp lÆp (3) héi  
tô.  
x1  
xo  
xo x1  
H×nh b  
H×nh a  
Ta cã ®Þnh lÝ:XÐt ph¬ng ph¸p lÆp (3),gi¶ sö :  
- [a,b] lµ kho¶ng ph©n li nghiÖm α cña ph¬ng tr×nh (1) tøc lµ cña (2)  
- mäi xn tÝnh theo (3) ®Òu thuéc [a,b]  
- g(x) cã ®¹o hµm tho¶ m·n :  
87  
g (x) q <1 ,a < x < b  
(4)  
trong ®ã q lµ mét h»ng sè th× ph¬ng ph¸p lÆp (3) héi tô  
Ta cã thÓ minh ho¹ phÐp lÆp trªn b»ng h×nh vÏ a vµ b.  
C¸ch ®a ph¬ng tr×nh f(x) = 0 vÒ d¹ng x = g(x) ®îc thùc hiÖn nhsau:ta thÊy f(x)  
= 0 cã thÓ biÕn ®æi thµnh x = x + λf(x) víi λ ≠ 0.Sau ®ã ®Æt x + λf(x) = g(x) sao cho ®iÒu  
kiÖn (4) ®îc tho¶ m·n.  
VÝ dô:xÐt ph¬ng tr×nh  
x3 + x - 1000 = 0  
Sau bíc gi¶i s¬ bé ta cã nghiÖm x1 ( 9,10 )  
NÕu ®a ph¬ng tr×nh vÒ d¹ng:  
x = 1000 - x3 = g(x)  
th× dÔ thÊy | g'(x) | > 1 trong kho¶ng ( 9,10 ) nªn kh«ng tho¶ m·n ®iÒu kiÖn (4)  
Chóng ta ®a ph¬ng tr×nh vÒ d¹ng  
x = 3 1000 x  
th× ta thÊy ®iÒu kiÖn (4) ®îc tho¶ m·n.X©y dùng d·y xÊp xØ  
3
=
xn+1 1000xn  
víi xo chän bÊt k× trong ( 9,10 )  
Trªn c¬ së ph¬ng ph¸p nµy chóng ta cã c¸c ch¬ng tr×nh tÝnh to¸n sau:  
Ch¬ng tr×nh gi¶i ph¬ng tr×nh exp((1/3)*ln(1000-x)) víi sè lÇn lÆp cho tríc  
Ch¬ng tr×nh 8-1  
//lap don  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
void main()  
{
int i,n;  
float x,x0;  
float f(float);  
clrscr();  
printf("Cho so lan lap n = ");  
scanf("%d",&n);  
printf("Cho gia tri ban dau cua nghiem x0 = ");  
scanf("%f",&x0);  
x=x0;  
for (i=1;i<=n;i++)  
x=f(x);  
printf("Nghiem cua phuong trinh la :%.4f",x);  
getch();  
}
float f(float x)  
{
float a=exp((1./3.)*log(1000-x));  
return(a);  
88  
}
vµ ch¬ng tr×nh gi¶i bµi to¸n b»ng ph¬ng ph¸p lÆp víi sai sè cho tríc  
Ch¬ng tr×nh 8-2  
//lap don  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
void main()  
{
int i;  
float epsi,x,x0,y;  
float f(float);  
clrscr();  
printf("Cho sai so epsilon = ");  
scanf("%f",&epsi);  
printf("Cho gia tri ban dau cua nghiem x0 = ");  
scanf("%f",&x0);  
x=x0;  
y=f(x);  
if (abs(y-x)>epsi)  
{
x=y;  
y=f(x);  
}
printf("Nghiem cua phuong trinh la %.6f",y);  
getch();  
}
float f(float x)  
{
float a=exp((1./3.)*log(1000-x));  
return(a);  
}
Cho gi¸ trÞ ®Çu xo = 1.KÕt qu¶ tÝnh to¸n x = 9.966555  
§3.Ph¬ng ph¸p chia ®«i cung  
89  
Gi¶ sö cho ph¬ng tr×nh f(x) = 0 víi f(x)  
liªn tôc trªn ®o¹n [a,b] vµ f(a).f(b) < 0.Chia ®o¹n  
[a,b] thµnh 2 phÇn bëi chÝnh ®iÓm chia (a + b)/2.  
1.NÕu f((a+b)/2) = 0 th× ξ = (a+b)/2  
2.NÕu f((a+b)/2) 0 th× chän [ a,(a + b)/2 ]  
hay [ (a + b)/2,b ] mµ gi¸ trÞ hµm hai ®Çu tr¸i dÊu  
vµ kÝ hiÖu lµ [a1,b1].§èi víi [a1,b1] ta l¹i tiÕn hµnh  
nh[a,b]  
y
b
a
ξ
b1  
x
C¸ch lµm trªn ®îc m« t¶ trong ch¬ng  
tr×nh sau dïng ®Ó t×m nghiÖm cña ph¬ng tr×nh :  
x4 + 2x3 - x - 1 = 0  
trªn ®o¹n [0,1]  
Ch¬ng tr×nh 8-3  
//chia doi cung  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#define epsi 0.00001  
void main()  
{
float x0,x1,x2;  
float y0,y1,y2;  
float f(float);  
int maxlap,demlap;  
clrscr();  
printf("Tim nghiem cua phuong trinh phi tuyen");  
printf("\nbang cach chia doi cung\n");  
printf("Cho cac gia tri x0,x1,maxlap\n");  
printf("Cho gia tri x0 = ");  
scanf("%f",&x0);  
printf("Cho gia tri x1 = ");  
scanf("%f",&x1);  
printf("Cho so lan lap maxlap = ");  
scanf("%d",&maxlap);  
y0=f(x0);  
y1=f(x1);  
if ((y0*y1)>0)  
{
printf("Nghiem khong nam trong doan x0 - x1\n");  
printf(" x0 = %.2f\n",x0);  
printf(" x1 = %.2f\n",x1);  
printf(" f(x0) = %.2f\n",y0);  
printf(" f(x1) = %.2f\n",y1);  
}
demlap=0;  
do  
{
90  
x2=(x0+x1)/2;  
y2=f(x2);  
y0=f(x0);  
if (y0*y2>0)  
x0=x2;  
else  
x1=x2;  
demlap=demlap+1;  
}
while(((abs((y2-y0))>epsi)||(demlap<maxlap)));  
if (demlap>maxlap)  
{
printf("Phep lap khong hoi tu sau %d lan lap ",maxlap);  
printf(" x0 = %.2f\n",x0);  
printf(" x1 = %.2f\n",x1);  
printf(" f(x2) = %.2f\n",y2);  
}
else  
{
printf("Phep lap hoi tu sau %d lan lap\n",demlap);  
printf("Nghiem x = %.2f",x2);  
}
getch();  
}
float f(float x)  
{
float a=x*x*x*x+2*x*x*x-x-1 ;  
return(a);  
}
KÕt qu¶ tÝnh cho nghiÖm:x = 0.87  
§4.Ph¬ng ph¸p d©y cung  
Gi¶ sö f(x) liªn tôc trªn trªn ®o¹n [a,b] vµ f(a).f(b) < 0.CÇn t×m nghiÖm cña f(x) =  
0.§Ó x¸c ®Þnh ta xem f(a) < 0 vµ f(b) > 0.Khi ®ã thay v× chia ®«i ®o¹n [a,b] ta chia [a,b] theo  
tØ lÖ -f(a)/f(b).§iÒu ®ã cho ta nghiÖm gÇn ®óng :  
x1 = a + h1  
Trong ®ã  
f(a)  
f(a)+f(b)  
=
(ba)  
h1  
TiÕp theo dïng c¸ch ®ã víi ®o¹n [ a,x1] hay [ x1,b] mµ hai ®Çu hµm nhËn gi¸ trÞ tr¸i  
dÊu ta ®îc nghiÖm gÇn ®óng x2 v.v.  
VÒ mÆ h×nh häc,ph¬ng ph¸p nµy cã nghÜa lµ kÎ d©y cung cña ®êng cong f(x) qua hai ®iÓm  
A[a,f(a)] vµ B[b,f(b)].ThËt vËy ph¬ng tr×nh d©y cung AB cã d¹ng :  
91  
x a  
y f (a)  
b a f (b) f (a)  
=
Cho x = x1 y = 0 ta cã  
B
b
f(a)  
f(b)f(a)  
=
(ba)  
x1 a−  
Trªn c¬ së cña ph¬ng ph¸p ta cã ch¬ng tr×nh  
tÝnh nghiÖm cña ph¬ng tr×nh  
x4 + 2x3 - x - 1 = 0  
a
x1  
ξ
trªn ®o¹n [0,1]  
A
Ch¬ng tr×nh 8-4  
//phuong phap day cung  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#define epsi 0.00001  
void main()  
{
float a,b,fa,fb,dx,x;  
float f(float);  
clrscr();  
printf("Tim nghiem cua phuong trinh phi tuyen\n");  
printf("bang phuong phap day cung\n");  
printf("Cho cac gia tri a,b\n");  
printf("Cho gia tri cua a = ");  
scanf("%f",&a);  
printf("Cho gia tri cua b = ");  
scanf("%f",&b);  
fa=f(a);  
fb=f(b);  
dx=fa*(b-a)/(fa-fb);  
while (fabs(dx)>epsi)  
{
x=a+dx;  
fa=f(x);  
if((fa*fb)<=0)  
a=x;  
else  
b=x;  
fa=f(a);  
fb=f(b);  
dx=fa*(b-a)/(fa-fb);  
}
92  
printf("Nghiem x = %.3f",x);  
getch();  
}
float f(float x)  
{
float e=x*x*x*x+2*x*x*x-x-1;  
return(e);  
}
KÕt qu¶ tÝnh cho nghiÖm:x = 0.876  
§5.Ph¬ng ph¸p lÆp Newton  
Ph¬ng ph¸p lÆp Newton (cßn gäi lµ  
ph¬ng ph¸p tiÕp tuyÕn) ®îc dïng nhiÒu v× nã héi  
tô nhanh.Gi¶ sö f(x) cã nghiÖm lµ ξ ®· ®îc t¸ch  
trªn ®o¹n [a,b] ®ång thêi f'(x) vµ f"(x) liªn tôc vµ  
gi÷ nguyªn dÊu trªn ®o¹n [a,b].Khi ®· t×m ®îc  
xÊp xØ nµo ®ã xn [a,b] ta cã thÓ kiÖn toµn nã theo  
ph¬ng ph¸p Newton.Tõ mót B ta vÏ tiÕp tuyÕn víi  
®êng cong.Ph¬ng tr×nh ®êng tiÕp tuyÕn lµ  
a
x1  
b=xo  
y f (x0 ) = f (b)(x x0 )  
TiÕp tuyÕn nµy c¾t trôc hoµnh t¹i ®iÓm cã  
y=0,nghÜa lµ :  
f(x0 ) = f (b)(x1 x0 )  
hay :  
f(x0 )  
x1 = x0 −  
f (x0 )  
Tõ x1 ta l¹i tiÕp tôc vÏ tiÕp tuyÕn víi ®êng cong th× giao ®iÓm xi sÏ tiÕn tíi nghiÖm cña  
ph¬ng tr×nh.  
ViÖc chän ®iÓm ban ®Çu xo rÊt quan träng.Trªn h×nh vÏ trªn ta thÊy nÕu chän ®iÓm  
ban ®Çu xo = a th× tiÕp tuyÕn sÏ c¾t trôc t¹i mét ®iÓm n»m ngoµi ®o¹n [a,b].Chän xo = b sÏ  
thuËn lîi cho viÖc tÝnh to¸n.Chóng ta cã ®Þnh lÝ :  
NÕu f(a).f(b) < 0 ; f(x) vµ f"(x) kh¸c kh«ng vµ gi÷ nguyªn dÊu x¸c ®Þnh khi x [a,b]  
th× xuÊt ph¸t tõ xo[a,b] tho¶ m·n ®iÒu kiÖn f(xo).f(xo) > 0 cã thÓ tÝnh theo ph¬ng ph¸p  
Newton nghiÖm ξ duy nhÊt víi ®é chÝnh x¸c tuú ý.  
Khi dïng ph¬ng ph¸p Newton cÇn lÊy xo lµ ®Çu mót cña ®o¹n [a,b] ®Ó t¹i ®ã  
f(xo).f"(xo) > 0.¸p dông lÝ thuyÕt trªn chóng ta x©y dùng ch¬ng tr×nh tÝnh sau:  
Ch¬ng tr×nh 8-5  
//phuong phap Newton  
#include <conio.h>  
#include <stdio.h>  
93  
#include <math.h>  
#include <stdlib.h>  
#define n 50  
#define epsi 1e-5  
void main()  
{
float t,x0;  
float x[n];  
int i;  
float f(float);  
float daoham(float);  
clrscr();  
printf("Tim nghiem cua phuong trinh phi tuyen\n");  
printf("bang phuong phap lap Newton\n");  
printf("Cho gia tri cua x0 = ");  
scanf("%f",&x0);  
i=1;  
x[i]=x0;  
do  
{
x[i+1] = x[i]-f(x[i])/daoham(x[i]);  
t = fabs(x[i+1]-x[i]);  
x[i]=x[i+1];  
i=i+1;  
if (i>100)  
{
printf("Bai toan khong hoi tu\n");  
getch();  
exit(1);  
}
else  
;
}
while (t>=epsi);  
printf("Nghiem x = %.5f",x[i]);  
getch();  
}
float f(float x)  
{
float a=x*x-x-2;  
return(a);  
}
float daoham(float x)  
{
float d=2*x-1;  
return(d);  
94  
}
Ch¬ng tr×nh nµy ®îc dïng x¸c ®Þnh nghiÖm cña hµm ®· ®îc ®Þnh nghÜa trong  
function.Trong trêng hîp nµy ph¬ng tr×nh ®ã lµ:x2 - x -1 = 0.KÕt qu¶ tÝnh víi gi¸ trÞ ®Çu xo  
= 0 cho nghiÖm x = 2.  
§6.Ph¬ng ph¸p Muller  
Trong ph¬ng ph¸p d©y cung khi t×m nghiÖm trong ®o¹n [a,b] ta xÊp xØ hµm b»ng  
mét ®êng th¼ng.Tuy nhiªn ®Ó gi¶m lîng tÝnh to¸n vµ ®Ó nghiÖm héi tô nhanh h¬n ta cã  
thÓ dïng ph¬ng ph¸p Muller.Néi dung cña ph¬ng ph¸p nµy lµ thay hµm trong ®o¹n [a,b]  
b»ng mét ®êng cong bËc 2 mµ ta hoµn toµn cã thÓ t×m nghiªm chÝn x¸c cña nã.Gäi c¸c  
®iÓm ®ã cã hoµnh ®é lÇn lît lµ a = x2,b = x1 vµ ta chän thªm mét ®iÓm x0 n»m trong ®o¹n  
[x2,x1].Gäi  
h1 = x1 - x0  
h2 = x0 - x2  
v = x - x0  
f(x0) = f0  
x0,f0  
x1,f1  
f(x1) = f1  
f(x2) = f2  
f(x)  
h2  
γ =  
h1  
av2+bv+c  
Qua 3 ®iÓm nµy ta cã mét ®êng parabol :  
x2,f2  
h1  
h2  
y = av2 + bv + c  
Ta t×m c¸c hÖ sè a,b,c tõ c¸c gi¸ trÞ ®· biÕt v:  
v = 0(x = x0 ) a(0)2 + b(0) + c = f0  
v = h1(x = x1 ) ah12 + bh1 + c = f1  
v = h2 (x = x2 ) ah22 + bh2 + c = f2  
Tõ ®ã ta cã :  
γf1 f0 (1+ γ) + f2  
a =  
γh12 (1+ γ)  
f1 f0 ah12  
b =  
h1  
c = f0  
Sau ®ã ta t×m nghiÖm cña ph¬ng tr×nh av2 + bv + c = 0 vµ cã :  
2c  
n1,2 = x0 −  
b ± b2 4ac  
TiÕp ®ã ta chän nghiÖm gÇn x0 nhÊt lµm mét trong 3 ®iÓm ®Ó tÝnh xÊp xØ míi.C¸c ®iÓm nµy  
®îc chän gÇn nhau nhÊt.  
TiÕp tôc qu¸ tr×nh tÝnh ®Õn khi ®¹t ®é chÝnh x¸c yªu cÇu th× dõng l¹i.  
VÝ dô:T×m nghiÖm cña hµm f(x) = sin(x) - x/2 trong ®o¹n [1.8,2.2].Ta chän x0 = 2  
Ta cã :  
x0 = 2  
x1 = 2.2  
x2 = 1.8  
f(x0) = -0.0907  
f(x1) = -0.2915  
f(x2) = 0.07385  
h1 = 0.2  
h2 = 0.2  
γ = 1  
VËy th× :  
95  
1×(0.2915) (0.0907)×(1+1) + 0.07385  
1×0.22 ×(1+1)  
a =  
b =  
= −0.45312  
0.2915 (0.097) (0.45312)×0.22  
= −0.91338  
0.2  
c = −0.0907  
Ta cã nghiÖm gÇn x0 nhÊt lµ :  
2×(0.0907)  
0.91338 (0.91338)2 4×(0.45312)×(0.0907)  
n1 = 2.0 −  
= 1.89526  
Víi lÇn lÆp thø hai ta cã :  
x0 = 1.89526  
x1 = 2.0  
x2 = 1.8  
f(x0) = 1.9184×10-4  
h1 = 0.10474  
f(x1) = -0.0907  
f(x2) = 0.07385  
h2 = 0.09526  
γ = 0.9095  
VËy th× :  
0.9095×(0.0907) (1.9184×104 )×1.9095 + 0.07385  
0.9095×0.104742 ×1.9095  
a =  
= −0.4728  
0.0907 1.9184×104 (0.4728)×0.104742  
b =  
= −0.81826  
0.10474  
c = 1.9184×104  
Ta cã nghiÖm gÇn x0 nhÊt lµ :  
2×1.9184×104  
n1 = 1.89526 −  
= 1.89594  
0.81826 (0.81826)2 4×(0.4728)×1.9184×104  
Ta cã thÓ lÊy n1 = 1.895494 lµm nghiÖm cña bµi to¸n  
Ch¬ng tr×nh gi¶i bµi to¸n b»ng ph¬ng ph¸p Muller nhsau:  
Ch¬ng tr×nh 8-6  
//phuong phap Muller  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
void main()  
{
float x0,x1,x2,h1,h2,eps;  
float a,b,c,gamma,n1,n2,xr;  
int dem;  
float f(float);  
clrscr();  
printf("PHUONG PHAP MULLER\n");  
printf("\n");  
printf("Cho khoang can tim nghiem [a,b]\n");  
printf("Cho gia tri duoi a = ");  
scanf("%f",&x2);  
96  
printf("Cho gia tri tren b = ");  
scanf("%f",&x1);  
if (f(x1)*f(x2)>0)  
{
printf("\n");  
printf("Nghiem khong nam trong doan nay\n");  
getch();  
exit(1);  
}
eps=1e-5;  
x0=(x1+x2)/2;  
dem=0;  
do  
{
dem=dem+1;  
h1=x1-x0;  
h2=x0-x2;  
gamma=h2/h1;  
a=(gamma*f(x1)-  
f(x0)*(1+gamma)+f(x2))/(gamma*(h1*h1)*(1+gamma));  
b=(f(x1)-f(x0)-a*(h1*h1))/h1;  
c=f(x0);  
if ((a==0)&&(b!=0))  
{
n1=-c/b;  
n2=n1;  
}
if ((a!=0)&&(b==0))  
{
n1=(-sqrt(-c/a));  
n2=(sqrt(-c/a));  
}
if ((a!=0)&&(b!=0))  
{
n1=x0-2*c/(b+(sqrt(b*b-4*a*c)));  
n2=x0-2*c/(b-(sqrt(b*b-4*a*c)));  
}
if (fabs(n1-x0)>fabs(n2-x0))  
xr=n2;  
else  
xr=n1;  
if (xr>x0)  
{
x2=x0;  
x0=xr;  
}
else  
{
x1=x0;  
x0=xr;  
97  
}
}
while (fabs(f(xr))>=eps);  
printf("\n");  
printf("Phuong trinh co nghiem x = %.5f sau %d lan lap",xr,dem);  
getch();  
}
float f(float x)  
{
float a=sin(x)-x/2;  
return(a);  
}
§7.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 α 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 α ta chia ®a thøc Pn(x) cho (x  
- α) 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 ph¬ng tr×nh sai ph©n ϕ cã d¹ng nhsau :  
ϕ = aoyk+n + a1yk+n-1 +.....+ anyk = 0  
§©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  
(1)  
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µ  
k
xi  
=
yi  
NÕu yi lµ c¸c nghiÖm cña ph¬ng tr×nh sai ph©n lµ tuyÕn tÝnh (1),th×  
k
k
k+....+  
(3)  
=
+
yk  
c1x1 c2 x2  
cn xn  
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 lµ sao cho :  
| x1| | x2 | ...| xn|  
VËy th×  
vµ  
k
k[1  
]
c1 x2  
=
+...  
+ c2 x1  
(
yk  
)
c1 x1  
=
k+1 +...  
k+1  
c1 x1  
+ c1 x2  
yk+1  
[1  
(
)
]
c2 x1  
98  
k+1 +...  
k +...  
c2 x2  
(
[1+  
[1+  
do ®ã :  
)
]
yk+1  
yk  
c1 x1  
=
x1  
c2 x2  
(
)
]
c1 x1  
do  
nªn:  
x1 > x2  
k
,
k.......→  
x2  
x1  
x2  
x1  
k→∞  
(
) (  
)
0 khi  
vËy th× :  
yk+1  
yk  
→∞ khi k→∞  
yk+1  
yk  
NghÜa lµ :  
=
x1 lim  
k→∞  
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)  
= − 1  
+ ...+  
yk+n  
y
y
)
an  
(a1  
k+n1  
k
ao  
VÝ dô:TÝnh nghiÖm cña ®a thøc Pn(x) = P3(x) = x3 - 10x2 + 31x - 30.NhvË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 8-7  
//phuong phap Bernoulli  
#include <conio.h>  
#include <stdio.h>  
99  
#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;  
100  
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  
§8.Ph¬ng ph¸p lÆp Birge - Viette  
C¸c nghiÖm thùc,®¬n gi¶n cña mét ®a thøc Pn(x) ®îc tÝnh to¸n khi sö dông ph¬ng  
ph¸p Newton  
(x )  
(1)  
Pn  
i
=
xi+1 xi  
P (x  
)
n
i
§Ó b¾t ®Çu tÝnh to¸n cÇn chän mét gi¸ trÞ ban ®Çu xo.Chóng ta cã thÓ chän mét gi¸ trÞ  
xo nµo ®ã,vÝ dô :  
an  
= −  
xo  
a
n1  
vµ tÝnh tiÕp c¸c gi¸ trÞ sau :  
(x )  
Pn  
o
=
x1 xo  
P (x  
)
n
o
(x )  
Pn  
1
=
x2 x1  
P (x  
)
n
1
TiÕp theo cã thÓ ®¸nh gi¸ Pn(xi) theo thuËt to¸n Horner :  
P0 = a0  
P1 = P0xi + a1  
P2 = P1xi + a2  
P3 = P2xi + a3  
..................  
(2)  
(3)  
P(xi) = Pn = Pn-1xi + an  
MÆt kh¸c khi chia ®a thøc Pn(x) cho mét nhÞ thøc (x - xi) ta ®îc :  
Pn(x) = (x - xi)Pn-1(x) + bn  
víi bn = Pn(xi).§a thøc Pn-1(x) cã d¹ng :  
Pn-1(x) = boxn-1 + b1xn-2+p3xn-3 +..+ bn-2x + bn-1  
(4)  
§Ó x¸c ®Þnh c¸c hÖ sè cña ®a thøc (4) ta thay (4) vµo (3) vµ c©n b»ng c¸c hÖ sè víi ®a  
thøc cÇn t×m nghiÖm Pn(x) mµ c¸c hÖ sè ai ®· cho:  
(x - xi)( boxn-1 + b1xn-2+b3xn-3 +..+ bn-2x + bn-1 ) + bn  
= aoxn + a1xn-1 + a2xn-2 +...+ an-1x + an  
(5)  
Tõ (5) rót ra :  
bo = ao  
b1 = a1 + boxi  
b2 = a2 + b1xi  
......  
(6)  
bk = ak + bk-1xi  
.......  
101  
bn = an + bn-1xi = Pn(xi)  
§¹o hµm (3) ta ®îc :  
Pn (x) = (x xi )Pn1(x) + Pn1(x)  
vµ  
Pn (xi ) = Pn1(xi )  
(7)  
NhvËy víi mét gi¸ trÞ xi nµo ®ã theo (2) ta tÝnh ®îc Pn(xi) vµ kÕt hîp (6) víi (7)  
tÝnh ®îc Pn(xi).Thay c¸c kÕt qu¶ nµy vµo (1) ta tÝnh ®îc gi¸ trÞ xi+1.Qu¸ tr×nh ®îc tiÕp tôc  
cho ®Õn khi | xi+1 - xi | < ε hay Pn(xi+1) 0 nªn α1xi+1 lµ mét nghiÖm cña ®a thøc.  
PhÐp chia Pn(x) cho (x - α1) cho ta Pn-1(x) vµ mét nghiÖm míi kh¸c ®îc t×m theo  
c¸ch trªn khi chän mét gi¸ trÞ xo míi hay chän chÝnh xo = α1.Khi bËc cña ®a thøc gi¶m  
xuèng cßn b»ng 2 ta dïng c¸c c«ng thøc t×m nghiÖm cña tam thøc ®Ó t×m c¸c nghiÖm cßn  
l¹i.  
VÝ dô:t×m nghiÖm cña ®a thøc P3(x) = x3 - x2 -16x + 24  
ao = 1  
a1 = -1  
a2= -16  
a3 = 24  
Chän xo = 3.5 ta cã :  
Po = ao = 1  
P1 = a1 + pox0 = -1 + 3.5*1 = 2.5  
P2 = a2 + p1x0 = -16 + 3.5*2.5 = -7.25  
P3 = a3 + p2x0 = 24 + 3.5*(-7.25) = - 1.375  
b0 = a0 = 1;  
b1 = a1 + box0 = -1 + 3.5*1 = 2.5  
b2 = a2 + b1x0 = -16 + 3.5*2.5 = -7.25  
P2(3.5) = b0x2 + b1x + b2 = 13.75  
Pn (x0 )  
1.375  
13.75  
x1 = x0 −  
= 3.5 +  
= 3.6  
Pn (x0 )  
LÆp l¹i bíc tÝnh trªn cho x1 ta cã:  
Po = ao = 1  
P1 = a1 + pox1 = -1 + 3.6*1 = 2.6  
P2 = a2 + p1x1 = -16 + 3.6*2.6 = -6.64  
P3 = a3 + p2x1 = 24 + 3.6*(-6.64) = - 0.096  
bo = ao = 1  
b1 = a1 + box1 = -1 + 3.6*1 = 2.6  
b2 = a2 + p1x1 = -16 + 3.6*2.6 = -6.64  
P2(3.6) = b0x2 + b1x + b2 = 15.68  
Pn (x1 )  
0.096  
15.68  
x2 = x1 −  
= 3.6 +  
= 3.606  
Pn (x1 )  
Qu¸ tr×nh cø thÕ tiÕp tôc cho ®Õn khi sai sè chÊp nhËn ®îc.Ch¬ng tr×nh díi ®©y m« t¶  
thuËt tÝnh trªn.  
Ch¬ng tr×nh 8-8  
//phuong phap Birge-Viette  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#define max 20  
102  
void main()  
{
float a[max],p[max],d[max],x[max];  
int k,j,i,n;  
float e1,e2,x0,x1;  
clrscr();  
printf("Cho bac cua da thuc n = ");  
scanf("%d",&n);  
e1=0.0001;  
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]);  
}
x0=a[0];  
for (i=0;i<=n;i++)  
a[i]=a[i]/x0;  
printf("Nghiem cua phuong trinh : \n");  
tt:x0=-a[n]/a[n-1];  
j=0;  
do  
{
j=j+1;  
p[1]=x0+a[1];  
d[1]=1.0;  
for (k=2;k<=n;k++)  
{
p[k]=p[k-1]*x0+a[k];  
d[k]=d[k-1]*x0+p[k-1];  
}
x1=x0-p[n]/d[n];  
e2=fabs(x1-x0);  
if (e2>e1)  
x0=x1;  
}
while((j<=50)||(e2>=e1));  
if (e2>=e1)  
printf("Khong hoi tu");  
else  
printf(" x = %.4f\n",x1);  
n=n-1;  
if (n!=0)  
{
for (k=1;k<=n;k++)  
a[k]=p[k];  
goto tt;  
}
103  
getch();  
}
Dïng ch¬ng tr×nh trªn ®Ó t×m nghiÖm cña ®a thøc x4 + 2x3 - 13x2 - 14x + 24 ta ®îc  
c¸c nghiÖm lµ:-4 ; 3 ; -2 vµ 1.  
§9.Ph¬ng ph¸p ngo¹i suy Aitken  
XÐt ph¬ng ph¸p lÆp :  
x = f(x)  
(1)  
víi f(x) tho¶ m·n ®iÒu kiÖn héi tô cña phÐp lÆp,nghÜa lµ víi mäi x[a,b] ta cã :  
| f’(x) | q < 1  
NhvËy :  
(2)  
xn+1 = f(xn)  
xn = f(xn-1)  
(3)  
(4)  
Trõ (3) cho (4) vµ ¸p dông ®Þnh lÝ Lagrange cho vÕ ph¶i víi c [a,b] ta cã :  
xn+1- xn = f(xn) - f(xn-1) = (xn - xn-1)f’(c)  
V× phÐp lÆp (1) nªn :  
(5)  
(6)  
| xn+1- xn | q | xn - xn-1 |  
104  
Do (6) ®óng víi mäi n nªn cho n = 1 , 2 , 3 , . . . ta cã :  
| x2 - x1 | q | x1 - xo |  
| x3 - x2 | q | x2 - x1 |  
. . . . . . . . . . . . . . . . . . .  
| xn+1 - xn | q | xn - xn-1 |  
§iÒu nµy cã nghÜa lµ d·y xi+1 - xi , mét c¸ch gÇn ®óng,lµ mét cÊp sè nh©n . Ta còng  
coi r»ng d·y xn - y víi y lµ nghiÖm ®óng cña (1) , gÇn ®óng nhmét cÊp sè nh©n cã c«ng sai  
q . NhvËy :  
xn+1 y  
xn y  
= q < 1  
(7)  
hay :  
xn+1 y = q(xn y)  
xn+2 y = q(xn+1 y)  
(8)  
(9)  
T¬ng tù ta cã :  
Tõ (8) vµ (9) ta cã :  
xn+2 xn+1  
q =  
(10)  
(11)  
xn+1 xn  
Thay gi¸ trÞ cña q võa tÝnh ë (10) vµo biÓu thøc cña q ë trªn ta cã :  
2
(
)
xn xn+1  
xn 2xn+1 + xn+1  
y = xn −  
C«ng thøc (11) ®îc gäi lµ c«ng thøc ngo¹i suy Adam.NhvËy theo (11) tríc hÕt ta dïng  
ph¬ng ph¸p lÆp ®Ó tÝnh gi¸ trÞ gÇn ®óng xn+2,xn+1,xn cña nghiÖm vµ sau ®ã theo (11) t×m  
®îc nghiÖm víi sai sè nhá h¬n.  
§Ó lµm vÝ dô chóng ta xÐt ph¬ng tr×nh :  
lnx - x2 + 3 = 0  
Ta ®a vÒ d¹ng lÆp :  
x = ln(x) + 3  
1
f (x) =  
2x lnx + 3  
PhÐp lÆp héi tô trong ®o¹n [0.3,].Ta cho x1 = 1 th× tÝnh ®îc :  
x2 = 1,7320508076  
x3 = 1.883960229  
x4 = 1.90614167  
y = 1.909934347  
§Ó gi¶m sai sè ta cã thÓ lÆp nhiÒu lÇn  
Ch¬ng tr×nh 8-9  
//phuong phap Aitken  
#include <conio.h>  
#include <stdio.h>  
#include <math.h>  
#define m 5  
void main()  
{
float x[m];  
105  
float epsi,n,y;  
int i,z;  
float f(float);  
clrscr();  
printf("Cho tri so ban dau x[1] = ");  
scanf("%f",&x[1]);  
printf("Cho tri so sai so epsilon = ");  
scanf("%f",&epsi);  
printf("\n");  
printf( "Ngoai suy Aitken cua ham\n");  
z=0;  
while (z<=20)  
{
for (i=2;i<=4;i++)  
x[i]=f(x[i-1]);  
n=x[4]-2*x[3]+x[2];  
if ((fabs(n)<1e-09)||(fabs(x[1]-x[2])<epsi*fabs(x[1])))  
z=20;  
else  
{
y=x[2]-(x[3]-x[2])*(x[3]-x[2])/n;  
if (z>20)  
printf("Khong hoi tu sau hai muoi lan lap\n");  
x[1]=y;  
}
z=z+1;  
}
printf("Nghiem cua phuong trinh y = %.6f",y);  
getch();  
}
float f(float x)  
{
float s=sqrt(log(x)+3);  
return(s);  
}
Víi gi¸ trÞ ban ®Çu lµ 1 vµ sai sè lµ 1e-8,ch¬ng tr×nh cho kÕt qu¶ y = 1.9096975944  
§10.Ph¬ng ph¸p Bairstow  
Nguyªn t¾c cña ph¬ng ph¸p Bairstow lµ trÝch tõ ®a thøc Pn(x) mét tam thøc Q2(x) =  
x2 - sx + p mµ ta cã thÓ tÝnh nghiÖm thùc hay nghiÖm phøc cña nã mét c¸ch ®¬n gi¶n b»ng  
c¸c ph¬ng ph¸p ®· biÕt.  
ViÖc chia ®a thøc Pn(x) cho tam thøc Q2(x) ®a tíi kÕt qu¶ :  
Pn(x) = Q2(x).Pn-2(x) + R1(x)  
víi  
Pn(x) = aoxn + a1xn-1 + a2xn-2 +...+ an  
Q2(x) = x2 - sx + p  
106  
Tải về để xem bản đầy đủ
pdf 158 trang yennguyen 13/04/2022 5640
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình Turbo C (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_turbo_c_phan_2.pdf