MỞ ĐẦU1Trong khoa học và công nghệ có rất nhiều bài toán được chuyển thành bài toán giải hệ phươngtrình, đặc biệt là việc ứng dụng giải hệ phương trình trong chuyên nghành khoa học máy tính.Tuy nhiên, có một vấn đề là các phương trình đại số dạng phức tạp thì phần lớn ta không thểtìm được nghiệm đúng. Vì vậy, cần phải có những phương pháp tìm nghiệm gần đúng, đồngthời ước lượng được sai số của chúng là rất cần thiết. Có nhiều phương pháp xác định nghiệmgần đúng dựa trên mức sai số cho phép. Nhìn chung, các phương pháp này thường sẽ trải quaba nhiệm vụ chính đó là vây nghiệm, tách nghiệm và thu hẹp khoảng chứa nghiệm. Chúng ta sẽđi tìm hiểu về phương pháp lặp Newton hay còn được gọi là phương pháp tiếp tuyến và đi vàoxây dựng chương trình tìm nghiệm gần đúng của phương trình một ẩn ở dạng cụ thể. Phươngpháp này có ưu điểm lớn khi so sánh với các phương pháp khác. Ưu điểm là nó cho ta được tốcđộ hội tụ nhanh giúp giảm số lần lặp đáng kể, nhanh chống cho ta kết quả nghiệm tương đốichính xác, còn nhược điểm là biết , để tính ta phải tính giá trị của hàm và giá trị củahàm tại điểm
Trang 1TRƯỜNG ĐẠI HỌC ĐỒNG THÁP
KHOA KỸ THUẬT – CÔNG NGHỆ
NHÓM: Dương Tấn Thành, Lê Hồ Hoàng Huy, Nguyễn Thị Thiện Vy, Hồ Ngọc Vinh Quang
BÁO CÁO TỔNG KẾT NGHIÊN CỨU CHUYÊN ĐỀ
CHƯƠNG TRÌNH GIẢI GẦN ĐÚNG PHƯƠNG TRÌNH MỘT ẨN BẰNG PHƯƠNG PHÁP NỘI SUY NEWTON
NGÀNH: KHOA HỌC MÁY TÍNH LỚP: ĐHCNTT18a
GIẢNG VIÊN HƯỚNG DẪN: Ths NGUYỄN THỊ THÙY LINH
Đồng Tháp, 26 tháng 11 năm 2019
Trang 2DANH SÁNH SINH VIÊN NHÓM
ST
T
ĐT:039 919 8294 E-mail:duongthanh6959@gmail.com
2 0018410639 Lê Hồ Hoàng Huy
3 0018410683 Nguyễn Thị Thiện
Vy
4 0018413050 Hồ Ngọc Vinh
Quang
Bảng phân công công việc:
1 Lập trình viên, sưu tầm thuật toán Làm Demo bằng C++
2 Trình bài nội dung pp Newton, cho bài
tập ví dụ
3 Trình bài nội dung pp Newton
Trang 3MỤC LỤC
1 Mở đầu……… trang 3
2 Nội dung đề tài……… trang 3 2.1 Kiến thức tổng quan………trang 3 2.1.1 Khái niệm và công thức phương pháp Newton………trang 3 2.1.2 Bài tập ví dụ……… trang 5 2.2 Chương trình ứng dụng………trang 6 2.2.1 Đặt vấn đề……… trang 6 2.2.2 Phương pháp giải quyết vấn đề……… trang 6 2.2.3 Thiết kế và cài đặt thuật toán……….trang 8 2.2.4 Demo chương trình C++……….……….trang 8
3 Kết luận……… trang 12 3.1 Kết quả đạt được………trang 12 3.2 Hạn chế……… trang 12 3.3 Hướng phát triển………trang 12 Tài liệu tham khảo……… …trang 13 Phụ lục……….trang 14
1 MỞ ĐẦU
Trang 4Trong khoa học và công nghệ có rất nhiều bài toán được chuyển thành bài toán giải hệ phương trình, đặc biệt là việc ứng dụng giải hệ phương trình trong chuyên nghành khoa học máy tính Tuy nhiên, có một vấn đề là các phương trình đại số dạng phức tạp thì phần lớn ta không thể tìm được nghiệm đúng Vì vậy, cần phải có những phương pháp tìm nghiệm gần đúng, đồng thời ước lượng được sai số của chúng là rất cần thiết Có nhiều phương pháp xác định nghiệm gần đúng dựa trên mức sai số cho phép Nhìn chung, các phương pháp này thường sẽ trải qua
ba nhiệm vụ chính đó là vây nghiệm, tách nghiệm và thu hẹp khoảng chứa nghiệm Chúng ta sẽ
đi tìm hiểu về phương pháp lặp Newton hay còn được gọi là phương pháp tiếp tuyến và đi vào xây dựng chương trình tìm nghiệm gần đúng của phương trình một ẩn ở dạng cụ thể Phương pháp này có ưu điểm lớn khi so sánh với các phương pháp khác Ưu điểm là nó cho ta được tốc
độ hội tụ nhanh giúp giảm số lần lặp đáng kể, nhanh chống cho ta kết quả nghiệm tương đối chính xác, còn nhược điểm là biết xn 1, để tính xnta phải tính giá trị của hàm f và giá trị của
hàm f tại điểm xn 1
2 NỘI DUNG ĐỀ TÀI
2.1 Ki n th c t ng quan ế ứ ổ
2.1.1 Khái niệm và công thức phương pháp Newton[1]
Cho phương trình f (x ) = 0, x (a, b)∈
Gọi x* là nghiệm gần đúng, x là nghiệm chính xác
Áp dụng công thức Taylor:
) (
) (
) )(
( )
( )
(
0
) (
) )(
( )
(
)
(
*
*
*
*
*
*
*
*
*
*
x f
x f x
x
x x x f x
f x f
x x o x
x x f x
f
x
f
) (
1
1 1
n
n n
n
x f
x
f x
x
Trang 5Từ công thức Newton suy ra:
) )(
( )
(
0 f xn1 f xn1 xn xn1
Từ đây ta có thể suy ra cách xác định xn
từ xn1
như sau: từ điểm ( xn1, f ( xn1))
trên
đồ thị, ta vẽ tiếp tuyến với đồ thị tại điểm này, xn là giao điểm của tiếp tuyến này với trục
hoành
Phương pháp Newton còn gọi là phương pháp tiếp tuyến Phương pháp Newton sử dụng công thức sai số
tổng quát sau:
m
x f x x
n
n
) (
Với m =
) ( min
] , [
x f
b x
Nếu xem phương pháp Newton như lặp đơn, khi đó: g ) ( x x
2
)]
( [
) ( ) ( ) (
)
(
)
(
x f
x f x f x g
x
f
x
f
Nhận thấy g(x)= 0, nếu chọn x0thích hợp thì phương pháp Newton sẽ hội tụ nhanh (nhờ hệ
số co nhỏ), nhưng nếu chọn x0không phù hợp phương pháp Newton có thể không hội tụ
)
1
)
(
( g x
Định lý
Giả sử f(x) có đạo hàm liên tục đến cấp 2 và các đạo hàm f ( x ), f ( x ) không đổi dấu trên đoạn [a, b] khi đó nếu chọn x0
thỏa f ( x0) f ( x0) 0 thì phương pháp lặp Newton hội tụ
Chú ý:
Điều kiện Fourier chỉ là điều kiện cần không đủ f x ( ) 0 là điều kiện tiên quyết
Trang 6Nếu f ( a ) f ( a ) 0 , chọn x 0 a
Nếu f ( a ) f ( a ) 0 , chọn x 0 b
Nếu f ( a ) 0 , xét f ( b ) f ( b )
+ Ưu điểm của phương pháp tiếp tuyến là tốc độ hội tụ nhanh
+ Nhược điểm của phương pháp tiếp tuyến là biết xn 1, để tính xn
ta phải tính giá trị của hàm
f và giá trị của đạo hàm f tại điểm xn1
2.1.2 Ví dụ giải phương trình một ẩn bằng phương pháp Newton (Giải BT kèm theo)
Ta có f(0)>0, f(0.5)<0,
] 5 0 , 0 [ , 0 3 3
)
f và f (x)6x0,f(0.5)f(0.5)0 nên chọn x0 0
Ta xây dựng dãy (x n) theo công thức
3
3
1
2
3 3
1 3
) (
) (
2
1
3
1
3 1 1
3 1 1 1
1 1
n
n
n
n n
n n
n n
n
x
x
x
x x
x x
f
x f
x
x
Ta có fx f m
4
9 } ) 5 0 ( min{
)
(
Do đó nghiệm gần đúng x nđược đánh giá sai số so với nghiệm chính xác x như sau
n n
n n
m
x
f
x
4 / 9
1 3 )
Trang 72.2 Ch ươ ng trình ng d ng ứ ụ
2.2.1 Đặt vấn đề
Ta sẽ đi xét phương trình một ẩn dạng tổng quát như sau e xaxbcos(x) c0 Ưu thế để sử dụng phương trình này là ta dễ dàng xác định được x0 với giá trị tương đối đơn giản và nhỏ, nhằm dễ dàng để xét điểm hội tụ chính xác Phương trình cũng đủ độ phức tạp khi ta không thể tìm ra nghiệm chính xác thông qua quá trình tính toán thông thường Một phần nữa là ta dễ dàng giải các phương trình có dạng tương tự thông qua việc thay đổi hệ số a, b, c Vì thế, phương trình hội tụ đủ các yếu tố để ta áp dụng phương pháp Newton vào xây dựng chương trình và đáp ứng các yêu cầu mà giảng viên đã đề ra
2.2.2 Phương pháp giải quyết vấn đề
Để xây dựng chương trình giải gần đúng phương trình một ẩn bằng phương pháp
Newton, trước hết nhóm sẽ nghiên cứu quá trình hội tụ của bài toán trên trục x, y Tiếp đến sẽ
đi tìm hiểu chi tiết các bước mà một chương trình máy tính thực hiện thông các thuật toán và lưu đồ thuật toán Sau cùng, nhóm sẽ xây dựng và trình bày phần Demo Code *.cpp chương trình và trình diễn chạy thử thông qua các dữ liệu vào được liệt kê và xuất ra màn hình dữ liệu
ra để đối chiếu với kết quả thực tế
Để giải bài toán tìm nghiệm gần đúng nói chung, ta cần dữ kiện là lời giải tìm nghiệm xấp xỉ của phương trình Từ lời giải này ta thực hiện lập đi lập lại để tìm nghiệm gần đúng Qua mỗi lần lập như vậy, trả về cho ta độ hội tụ nghiệm nhỏ dần cho tới khi nghiệm này thõa mãn yêu cầu sai số của bài toán thì dừng lại
Để giải phương trình tìm nghiệm gần đúng bằng phương pháp Newton ta trải qua ba bước dưới đây:
Hình 1.1[3]
Trang 8Bước 1: Vẽ đường tiếp tuyến y = f(x) tại p1( x1, y1) và thu được điểm x2 là giao của đường tiếp tuyến và trục x Theo hình 1.1
Bước 2: Vẽ đường tiếp tuyến y = f(x) tại p2 (x2, y2) và thu được điểm x3 là giao của đường tiếp tuyến và trục x Ở bước này đường tiếp tuyến được thực hiện lặp lại gần với kết quả cần tìm Theo hình 1.1
Bước 3: Sự khác nhau giữa các giá trị xấp xỉ gần kề nhau thu được trong bước 2 được so sánh với độ chính xác của giá trị hội tụ được xác định trước Thực hiện lặp lại bước 1 và 2 cho tới khi sự khác nhau này nhỏ hơn giá trị hội tụ được xác định trước
Ghi chú: Đạo hàm của hàm số chính là độ dốc của đường tiếp tuyến có giá trị
Ck
Cđ
tan
Nên công thức xác định đường tiếp tuyến tổng quá là: ( )
) (
1
k
k k
k
x f
x f x x
2.2.3 Thiết kế và cài đặt thuật toán
Lưu đồ thuận toán[3]
Hình 1.2
Bắt đầu
0 K
Số lần lặp lại lớn nhất: Kmax
Đưa ra xk + 1
K + 1 K
xk +1 - xk : ﻉ
K : Kmax
Kết thúc
Giá trị ban đầu F (x) = 0 : x0
>
f (xk )x2 f’ (xk )
xk +1
xk - Giá trị hội tụ: ﻉ
Không hội tụ
>
Trang 92.2.4 Demo chương trình C++ giải gần đúng phương trình một ẩn xác định[4]
+ Ghi chú: Ta gọi tên x0 ở thuật toán phía trên là x1 trong chương trình chính
/* * * * * Chương trình chính * * * * */
#include<iostream>
#include<cmath>
#include<conio.h>
#include<iomanip>
#include<windows.h>
using namespace std;
double x, x1, e, fx, fx1; /*Khai báo các biến toàn cục*/
float a, b, c;
double f(double x); //Khởi tạo hàm f(x)
double f(double x) //Cài đặt cấu trúc hàm phương trình e^x+a^(-x)+b*cos(x)-c=0 {
double A=pow(2.718281828, x)+pow(a, -x)+b*cos(x)-c;
return A;
}
double fprime(double x); //Khởi tạo hàm f '(x)
double fprime(double x) //Cài đặt hàm tính f'(x)
{
double B=pow(2.718281828, x)-pow(a, -x)*log(a)-b*sin(x);
return B;
}
void Nhap(){ //Khai báo thủ tục nhập vào
cout<<"Giai pt: e^x+a^(-x)+b*cos(x)-c=0\n";
cout<<"Nhap vao hang so a, b, c: ";
cin>>a>>b>>c;
cout<<"pt: e^x+"<<a<<"^(-x)+"<<b<<"*cos(x)-"<<c<<"=0\n";
//Xuất ra màn hình pt cần tính cout<<"Nhap vao x1: ";
Trang 10cin>>x1; //Lưu nghiệm x1
cout<<"Nhap vao do chinh xac mong muon [VD: 0.0001] :";
cin>>e; //Lưu sai số nhập vào
cout.precision(10); //Độ chính xác lớn nhất cho phép là 10 chữ số
cout.setf(ios::fixed);
}
void XuatBang(){ //Khai báo thủ tục xuất ra bảng xét nghiệm
int n =-1;
cout<<"\n\t\t\tBANG XET NGHIEM\n\n";
cout<<"Buoc\t"<<" x{i}"<<"\t\t\t "<<"x{i+1}"<<"\t\t\t"<<"|x{i+1}-x{i}|"<<"\n";
//Tại danh mục bảng
do //Khai báo lệnh vòng lặp do - while
{
n++; //Số bước thực hiện tăng lên 1 đơn vị x=x1;
//Gán x tăng lên giá trị gần đúng tiếp theo (Giá trị hội tụ giảm dần)
fx=f(x);
//Xử lý f(x) và gán giá trị vừa tìm được vào fx fx1=fprime(x);
//Xử lý hàm f '(x) và gán giá trị vừa tìm được vào fx1 x1=x-(fx/fx1);
//Tính giá trị Xn=(Xn-1)-(f(Xn-1)/f '(Xn-1)) cout<<n<<"\t|"<<x<<"\t\t|"<<x1<<"\t\t|"<<abs(x1-x)<<"\n";
//Xuất kết quả ra danh sách }while (fabs(x1-x)>=e);
//Khi thỏa điều kiện |x{i+1}-x{i}|>=e thì dừng lại Nếu không, lặp lại các bước trên
}
void XuatKQ(){ //Khai báo thủ tục xuất kết quả ra màn hình
cout<<"\n=====> NGHIEM TIM DUOC VOI SAI SO TOI THIEU "<<e<<" la: "<<x;
//Xuất kết quả cuối cùng }
int main(){
Trang 11system("color F1"); //Sử dụng màu cho cửa sổ Console
cout<<"====== Giai phuong trinh 1 an dang pt: e^x+a^(-x)+b*cos(x)-c=0 su dung phuong phap Newton ======\n\n";
cout<<" * * * * * \n";
Nhap();
XuatBang();
XuatKQ();
getch();
return 0;
}
Dữ liệu mẫu Input cho 3 bộ kèm theo đáp án
**
Input: f(x)e x2x2cosx 6 Nhập x1 là 2, sai số là 105
Output:
Hình 2.1
Input: f(x)e x4,5x3,2cos(x) 9,78 Nhập x1 là 7, sai số là 106
Trang 12Output:
Hình 2.2
Input: f(x)e x19x79cos(x) 66 Nhập x1 là 18, sai số 107
Output:
Hình 2.3
3 KẾT LUẬN
3.1 K t qu đ t đ ế ả ạ ượ c
Qua việc tìm hiểu nghiên cứu đề tài thông qua các tài liệu tham khảo được tìm thấy Nhóm xác định được phương pháp Newton có thể áp dụng để tìm ra nghiệm chính xác và sử dụng ít bộ nhớ hơn các phương pháp khác nhờ vào số vòng lặp nhỏ, do phương pháp này cho ta tốc độ hội
tụ nhanh Các yêu cầu công việc và nhiệm vụ về cơ bản đã được hoàn thành tốt Để xây dựng hoàn chỉnh chương trình, nhóm đã gặp không ít khó khăn và luôn tìm hướng giải quyết thông qua các ý kiến của các bạn trong nhóm tích góp xây dựng Mặc khác, nhóm chúng em đã rút ra được rất nhiều kinh nghiệm quý báo trong việc xây dựng chương trình ứng dụng giải thuật của
Trang 13bài toán trong thực tế Mặc dù còn nhiều hạn chế trong chương trình, nhưng chúng em sẽ tiếp tục tìm tòi để khắc phục chúng nhằm hỗ trợ tốt hơn quá trình tự học tập, tự nghiên cứu sau này
3.2 H n ch ạ ế
Chương trình chỉ giải được một dạng cấu trúc xác định Do hạn chế của phương pháp Newton
ta phải xác định x1 thích hợp để xét điểm hội tụ Trường hợp ít khi xảy ra là nếu ta nhập vào chỉ số x1 không phù hợp, có thể là quá lớn Thì chương trình có thể không cho ra kết quả chính xác
3.3 H ướ ng phát tri n ể
Ta sẽ xây dựng thêm thủ tục xét khoảng ly nghiệm cụ thể từ dữ liệu Input đưa vào, tức là xuất
ra màn hình khoảng ly nghiệm của phương trình sau khi người dùng nhập vào hệ số a, b, c Giúp thao tác nhập nghiệm x1 được dễ dàng hơn và khắc phục được lỗi không thể tìm ra
nghiệm chính xác
TÀI LIỆU THAM KHẢO
[1] Nguyễn Hồng Lộc, SỐ GẦN ĐÚNG VÀ SAI SỐ, Khoa khoa học ứng dụng, Trường Đại học Bách Khoa TP HCM - 2013
[2] Tailieu.vn: tác giả Nguyễn Nhi, ngày đăng 27.7.2011,
https://tailieu.vn/doc/phuong-phap-tinh-voi-c-chuong-2-742961.html, ngày truy cập 17.11.2019
Trang 14[3] Tieuluan.info: Cấu trúc dữ liệu 1, cấu trúc dữ liệu là gì? ngày cập nhật 15.12.2018,
http://tieuluan.info/cu-trc-d-liu-1-cu-trc-d-liu-l-g-2.html?page=5, ngày truy cập 18.11.2019
[4] Youtube.com: Phys Whiz, 11.7.2016, NEWTON-RAPHSON METHOD - C++ PROGRAM [EXPLAINED], https://www.youtube.com/watch?v=IugJKfNhbew, ngày truy cập 18.11.2019
PHỤ LỤC
Hướng dẫn cài đặt:
Chương trình Demo được viết trên DEV C++ phiên bản 5.11 Nên chạy tốt trên trình biên dịch này
Code xử lý tiêu biểu:
do
//Khai báo lệnh vòng lặp do-while
Trang 15//Số bước thực hiện tăng lên 1 đơn vị
x=x1;
//Gán x tăng lên giá trị gần đúng (Độ hội tụ giảm dần)
fx=f(x);
//Xử lý hàm f(x) và gán giá trị vừa tìm được vào fx
//Xử lý hàm f’(x) và gán giá trị vừa tìm được vào fx1
x1=x-(fx/fx1);
//Tính giá trị x n ((x n1) (f(x 1 )/ f(x n 1))
n
cout<<n<<"\t"<<x<<"\t\t"<<x1<<"\t\t"<<abs(x1-x)<<"\n";
//Xuat ket qua ra danh sach
}while (fabs(x1-x)>=e);
//Khi thõa điều kiện |x{i+1}-x{i}|>=e thì dừng lại Nếu không, lặp lại các bước trên
cout<<"\nNGHIEM TIM DUOC VOI SAI SO TOI THIEU "<<e<<" la: "<<x;
//Xuất ra màn hình kết quả cuối cùng
return 0;
}
THE END