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ính 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
f(x1)
= f1
f(x2)
= f2
Qua 3 điểm này ta có một đường parabol:
y
= av2 + bv + c
Ta tìm các hệ số a,b,c từ các giá trị đã
biết v:
Từ đó ta có :
Sau đó ta tìm nghiệm của phương trình av2
+ bv + c = 0 và có :
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 f(x0)
= -0.0907 h1 = 0.2
x1
= 2.2 f(x1)
= -0.2915 h2 = 0.2
x2
= 1.8 f(x2)
= 0.07385 g = 1
Vậy thì :
Ta có nghiệm gần x0 nhất là :
Với lần lặp thứ hai ta có :
x0 =
1.89526 f(x0) = 1.9184´10-4 h1
= 0.10474
x1
= 2.0 f(x1)
= -0.0907 h2 = 0.09526
x2
= 1.8 f(x2)
= 0.07385 g = 0.9095
Vậy thì :
Ta có nghiệm gần x0 nhất là :
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 như sau:
Chương trình 2-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);
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;
}
}
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);
}
Tags:
Phương Pháp Tính