giải gần đúng phương trình giải tích số, tìm hệ số hồi quy bằng pp bình phương cực tiểu
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN TOÁN ỨNG DỤNG & TIN HỌC
——————— * ———————
LẬP TRÌNH TÍNH TOÁN
ĐỒ ÁN I
Chuyên ngành: TOÁN TIN ỨNG DỤNG
Giảng viên hướng dẫn: Th.S NGUYỄN THÁI BÌNH Sinh viên thực hiện: NGUYỄN TUẤN ANH
Lớp: Toán Tin 2 - K55
HÀ NỘI 4 - 2014
Trang 2NHẬN XÉT CỦA THẦY HƯỚNG DẪN
1 Mục đích và nội dung của đồ án:
2 Kết quả đạt được:
3 Ý thức làm việc của sinh viên:
Hà Nội, ngày tháng năm 2014
Thầy hướng dẫn (Kí và ghi rõ họ tên)
NGUYỄN THÁI BÌNH
Trang 3Mục lục
LỜI MỞ ĐẦU 4
1 Phần Mở Đầu 5 1.1 Đối tượng nghiên cứu 5
1.2 Mục đích nghiên cứu 5
1.3 Phương pháp nghiên cứu 5
1.4 Ý nghĩa 6
2 Ước lượng hệ số hồi quy dạng: Y = aX + b, sử dụng phương pháp bình phương cực tiểu 7 2.1 Bài toán 7
2.2 Giải thuật giải bài toán 7
2.3 Source code Java giải bài toán 8
2.4 Màn hình kết quả chạy chương trình 10
3 Tính nghiệm gần đúng 11 3.1 Bài toán: Viết chương trình tìm nghiệm gần đúng của chương trình 11
3.2 Giải thuật giải bài toán 12
3.3 Điều kiện hội tụ và sai số 13
3.4 Source code Java giải bài toán ( áp dụng cho hàm f(x) = x 5 − x − 1) 13
3.5 Màn hình kết quả chạy chương trình 18
3.5.1 So sánh kết quả 2 phương pháp và rút ra nhận xét 19
Trang 4LỜI NÓI ĐẦUNgày này cùng với sự phát triển vượt bậc của khoa học kỹ thuật thì công nghệthông tin là một trong những lĩnh vực có nhiều đóng góp thiết thực nhất, côngnghệ thông tin có mặt trong hầu hết các lĩnh vực của cuộc sống đặc biệt công nghệthông tin là một công cụ hỗ trợ rất đắc lực trong việc giải các bài toán Chúng ta
dễ dàng thấy được việc đưa tin học vào trong các bài toàn giúp ta có thể giải bàitoán một cách nhanh chóng và chính xác
Java là một nền tảng phát triển các ứng dụng phần mềm có vị trí rất lớn trongnhững năm cuối thế kỉ 20, đầu thế kỉ 21 Đánh dấu sự trưởng thành của mô hìnhlập trình hướng đối tượng, nó được coi là một nền tảng mang tính cách mạng trongngành phần mềm Mô hình máy ảo Virtual Machine đã cho phép các ứng dụngviết bằng Java có thể chạy trên nhiều hệ điều hành khác nhau
Trong đồ án này,em dùng ngôn ngữ lập trình Java trên công cụ hỗ trợ Eclipse
để ứng dụng vào môn học giải tích số,cụ thể là áp dụng vào những bài toán sau:
“1.Ước lượng hệ số hồi quy dạng Y =aX + b, sử dụng phương pháp bình phương
cực tiểu ” và “Viết chương trình tính nghiệm gần đúng của phương trình bằng
phương pháp chia đôi và phương pháp tiếp tuyến”
Do thời gian gấp rút, chưa có nhiều kinh nghiệm nên bài báo cáo khộng thểtránh những sai sót Mong thầy cô, bạn đọc góp ý để bài báo cáo được trọn vẹnhơn
Và cuối cùng em xin chân thành cảm ơn các thầy cô giáo trong viện đã chỉ dạy
em trong thời gian qua, đặc biệt thầy Nguyễn Thái Bình đã trực tiếp chỉ dẫn tậntình giúp đỡ em hoàn thành báo cáo này
Hà Nội, Ngày 25 tháng 4 năm 2014
Nguyễn Tuấn Anh
Trang 5Chương 1
Phần Mở Đầu
1.1 Đối tượng nghiên cứu
Đề tài này em tập trung vào các nội dung:
• Tìm hiểu, nghiên cứu ngôn ngữ lập trình Java
• Tìm hiểu các dạng bài toán của môn giải tích số
• Tìm hiểu công cụ xây dựng chương trình
1.2 Mục đích nghiên cứu
Hiểu được cách xây dựng chương trình trong Java, các cấu trúc lớp, đối tượng,các hàm , các bước xây dựng chương trình giải bài toán thực tế trên máy tính.Biết cách sử dụng phần mềm Eclipse để ứng dụng giải các bài toán giải tích số
1.3 Phương pháp nghiên cứu
Dựa vào giáo trình giải tích số của thầy Lê Trọng Vinh kết hợp với sự mạnh mẽcủa ngôn ngữ Java, e đã xây dựng được chương trình giải bài toán trên công cụEclipse
Trang 61.4 Ý nghĩa
Chương trình sẽ giải được hầu hết các bài toán thông dụng, đồng thời cũng làtài liệu quý giá cho sinh viên rong việc học tập và nghiên cứu chuyên sâu sau này
Trang 7Chương 2
Ước lượng hệ số hồi quy dạng: Y = aX + b,
sử dụng phương pháp bình phương cực tiểu
• Input: File data.txt với nội dung:
– Hàng 1: số phần tử n của X(hay của Y)
– Hàng 2: thông tin các giá trị của X
– Hàng 2: thông tin các giá trị của Y
• Output: màn hình Console hiển thị kết quả chương trình
2.2 Giải thuật giải bài toán
Trang 82.3 Source code Java giải bài toán
public class bai11_doan {
private static Scanner scan;
private static int n;
private static float [] x;
private static float [] y;
public static void main(String[] args) throws IOException {
scan = new Scanner( new FileInputStream( "D:\\data.txt" ));
y[i] = scan.nextFloat();
} for ( int i = 0;i<n;i++){
tongx = tongx +x[i];
tongy = tongy +y[i];
//tichxy = x[i]*y[i];
tongtichxy = tongtichxy + x[i]*y[i];
Trang 9tongxbinhphuong = tongxbinhphuong + x[i]*x[i]; }
float tby = tongy/n;
float a = (tongtichxy - n*tbx*tby)/(tongxbinhphuong
- n*tbx*tbx);
float b = tby - a*tbx;
System.out.println( "trung binh cua x[i] = " +tbx); System.out.println( "trungbinh cua y[i] = " +tby); System.out.println( "tong cua cac tich x[i]*y[i] =
Trang 102.4 Màn hình kết quả chạy chương trình
Trang 11Chương 3
Tính nghiệm gần đúng
3.1 Bài toán: Viết chương trình tìm nghiệm gần đúng
của chương trình.
Bài toán 1: phương pháp chia đôi
Đề bài: Viết chương trình tìm nghiệm gần đúng bằng phương pháp chia đôi
• Input: hàm F(x), đạo hàm F’(x), khoảng phân li nghiệm [a b]
• Output: nghiệm của chương trình
Bài toán 2: phương pháp tiếp tuyến
Đề bài: Viết chương trình tìm nghiệm gần đúng bằng phương pháp tiếp tuyến
• Input: hàm F(x), đạo hàm F’(x),đạo hàm F”(x), khoảng phân li nghiệm [a b]
• Output: nghiệm của chương trình
Trang 123.2 Giải thuật giải bài toán
Ý tưởng
Dựa vào sự hội tụ của khoảng phân li nghiệm [a b] để tìm nghiệm gần đúng.Giải sơ bộ: Đi tìm một khoảng đủ bé để chứa nghiệm
• Vây nghiệm: Tìm đoạn bé chưa các nghiệm
• Tách nghiệm: Tách các đoạn bé, mỗi đoạn chỉ chứa một nghiệm
Giải kiện toàn: Giải nghiệm với độ chính xác epsilon cần thiết
Giải thuật
Giải thuật phương pháp chia đôi
Giả sử hàm số f(x) liên tục trên đoạn [a, b] và f(a).f(b) < 0 Chia [a b] thành haiphần bởi điểm giữa c = (a + b)/2
• Nếu f(c) = 0 thì nghiệm là x = c
• Nếu f(c) 0 thì chọn [a c] hoặc [c b] mà giá trị hàm tại hai đâu trái dấu và kí
hiệu [a1 b1] Đối với [a1 b1] lại tiến hành như [a b]
Giải thuật phương pháp tiếp tuyến
Chọn x0 ∈ khoảng nghiệm [a b]
Tiếp tuyến tại A0(x0,f(x0)) cắt trục x tại hoành độ x1
Tiếp tuyến tại A1(x1,f(x1)) cắt trục x tại hoành độ x2 ,
Tiếp tuyến tại Ak(xk,f(xk)) cắt trục x tại hoành độ xk, ,
Trang 13Cứ tiếp tục quá trình trên ta có thểtiến dần đến nghiệm µ của phương trình.Phương trình tiếp tuyến tại Ak(xk,f(xk)): y - f(xk) = f’(xk)*(x - xk)
Tiếp tuyến cắt trục x tại điểm có toạ độ (xk + 1, 0)
Do vậy: 0 - f(xk) = f’(xk)*(xk + 1 - xk) => xk+ 1 = xk - f (xk )
f 0 (x k )
3.3 Điều kiện hội tụ và sai số
Phương pháp chia đôi
Giả sử [ak bk] là khoảng phân li nghiệm sau k lần lặp Nếu |ak - bk| < epsiloncho trước thì nghiệm gần đúng của phương trình là c = (ak + bk)/2
Phương pháp tiếp tuyến
Giả sử [a,b] là khoảng nghiệm của phương trình f(x) = 0 Đạo hàm f’(x), f”(x)liên tục, không đổi dấu, không tiêu diệt trên [a,b] Khi đó ta chọn xấp xỉ nghiệmban đầu x0 ∈ [a,b] sao cho f(x0))*f”(x0) > 0 thì quá trình lặp sẽ hội tụ đến nghiệm
3.4 Source code Java giải bài toán
( áp dụng cho hàm f(x) = x5 − x − 1)
Code tìm nghiêm gần đúng bằng phương pháp chia đôi
package doan;
import java.util.*;
public class bai1 {
static float ex=( float ) 0.001;
private static float ham( float x){
return x*x*x*x*x - x -1;
Trang 14Scanner input = new Scanner(System.in);
System.out.println( "moi nhap a va b :" );
if (kiemtra(a,b)==0){
b=c;
c=(a+b)/2;
Trang 15} else stop=1;
} else {
if (kiemtra(a,b)==0){
a=c;
c=(a+b)/2;
} else stop=1;
} }
}
Code tìm nghiêm gần đúng bằng phương pháp tiếp tuyến
package doan;
import java.util.*;
public class bai1_b {
static float ex=( float ) 0.001;
private static float ham( float x){
Trang 16Scanner input = new Scanner(System.in);
System.out.println( "moi nhap a va b :" );
tg =b;
}
if (Math.abs(DaoHam1(a)) <
Math.abs(DaoHam1(b))) {
m1=Math.abs(DaoHam1(a));
Trang 17} else {
m2 = Math.abs(DaoHam2(b));
} int i = 0;
}
}
else {
Trang 18System.out.println( " \n a va b khong phai la khoang phan li nghiem,moi nhap lai" ); }
}
}
3.5 Màn hình kết quả chạy chương trình
Kết quả phương pháp chia đôi
Trang 19Kết quả phương pháp tiếp tuyến
Phương pháp chia đôi
Ưu điểm của phương pháp chia đôi là thuật toán đơn giản do đó dễ lập trình.Tuy nhiên do phương pháp chia đôi sử dụng rất ít thông tin về hàm f(x) nên tốc độhội tụ khá chậm và chỉ sử dụng để giải sơ bộ phương trình
Phương pháp tiếp tuyến
Tuy thuật toán phương pháp tiếp tuyến phức tạp hơn so với thuật toán phươngpháp chia đôi, đòi hỏi phải tính đạo hàm f’(x), nhưng lại tỏ ra hiệu quả hơn, vònglặp ít hơn do tốc độ hội tụ nghiệm nhanh, hiệu quả trong việc giải các phương trìnhphức tạp
Trang 203.6 Kết luận
Trang 21Tài liệu tham khảo
[1] Họ và tên tác giả, năm, Tên sách NXB [2] Họ và tên tác giả, năm, Tên sách NXB [3] Họ và tên tác giả, năm, Tên sách NXB [4] Họ và tên tác giả, năm, Tên sách NXB [5] Họ và tên tác giả, năm, Tên sách NXB.