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

PHƯƠNG PHÁP LẶP NEWTON



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à x đã đượ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à

Tiếp tuyến này cắt trục hoành tại điểm có y = 0, nghĩa là:
hay :
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 x 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 2-5


//phuong phap Newton
#include <conio.h>
#include <stdio.h>
#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);
  }

                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.

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

Đăng nhận xét

Bài đăng phổ biến