Thứ Bảy, 6 tháng 12, 2014

PHƯƠNG PHÁP MULLER



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 = x1và 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) = f
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 x0nhấ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);
  }

Không có nhận xét nào:

Đăng nhận xét

Bài đăng phổ biến