TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂNVIỆN CÔNG NGHỆ THÔNG TIN VÀ KINH TẾ SỐ---BẢN BÁO CÁO PHƯƠNG PHÁP TÍNHĐỀ TÀI: GIẢI PHƯƠNG TRÌNH BẰNG PP NEWTON + TÍNH TÍCH PHÂN BẰNG CÔNG THỨC SIMPSONGiảng
Trang 1TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN VIỆN CÔNG NGHỆ THÔNG TIN VÀ KINH TẾ SỐ
-▯▯▯
-BẢN BÁO CÁO PHƯƠNG PHÁP TÍNH
ĐỀ TÀI: GIẢI PHƯƠNG TRÌNH BẰNG PP NEWTON +
TÍNH TÍCH PHÂN BẰNG CÔNG THỨC SIMPSON
Giảng viên hướng dẫn :
Hà Nội, ngày tháng năm
Trang 2MỤC LỤC
A GIẢI PHƯƠNG TRÌNH BẰNG PHƯƠNG PHÁP NEWTON 3
I Mô tả thuật toán 3
1 Xây dựng công thức lặp: 3
2 Điều kiện hội tụ Furie: 3
3 Công thức tính sai số: 3
II Mô hình hóa 4
III Miêu tả thuật toán qua ngôn ngữ lập trình C 4
1 Xác định được phương trình ta cần tính là phương trình bậc mấy và hệ số của từng bậc 4
2 Xét điều kiện hội tụ Furie 5
3 Áp dụng phương pháp Newton bằng hàm sau: 8
4 Cuối cùng tất cả các hàm trên được gọi đến hàm main như sau 9
IV Ví dụ 10
B TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH BẰNG PHƯƠNG PHÁP SIMPSON 11
I Mô tả thuật toán 11
1 Hiểu bài toán 11
2 Mô tả bài toán chi tiết 11
3 Xây dựng công thức 11
II Mô hình hóa 13
III Giải thích code 14
IV Ví dụ 17
Trang 3A GIẢI PHƯƠNG TRÌNH BẰNG PHƯƠNG
PHÁP NEWTON
I Mô tả thuật toán
Thuật toán giải phương trình bằng phương pháp Newton là cách sử dụng lặp
lại phương trình tiếp tuyến tại Ak (xk, f(xk)) cắt trục hoành tại 1 điểm xk cho đến khi tìm ra nghiệm gần đúng của phương trình với khoảng nghiệm phân
ly cho trước
1 Xây dựng công thức lặp:
Phương trình tiếp tuyến tại Ak (xk, f(xk)): y - f(xk ) = f’(x k )*(x - x k )
Tiếp tuyến cắt trục x tại điểm có toạ độ (xk+1, 0)
Do vậy: 0 – f(x k ) = f’(x k )*(x k+1 - x k )
Từ đó ta được công thức:
𝑥𝑘+1 = 𝑥𝑘- f (x k)
f '(x k) (5)
2 Điều kiện hội tụ Furie:
Giả sử [a, b] là khoảng phân ly nghiệm của phương trình Giả sử rằng:
𝑓 có đạo hàm 𝑓′ ;
𝑓, 𝑓′, 𝑓′′ liên tục trên [a, b]
𝑓′, 𝑓′′ không đổi dấu trên (a, b)
Xấp xỉ đầu 𝑥0 chọn là a hoặc b sao cho 𝑓 (𝑥0) cùng dấu với 𝑓′′ Khi đó 𝑥𝑛 tính theo công thức (5) hội tụ đến nghiệm khi 𝑛 → ∞
Trang 43 Công thức tính sai số:
|𝛼 - 𝑥 𝑛 |≤ f (x n) m (6) Với 0 ≤ 𝑚 ≤| 𝑓′ (𝑥)| , 𝑎 ≤ 𝑥 ≤ 𝑏 (7)
Chú ý: Thực tế ta dừng quá trình tính sai số khi |𝑥 𝑛 - 𝑥𝑛-1| < 𝜀
Ngôn ngữ sử dụng: Thuật toán sử dụng ngôn ngữ C
Bước 1: Xây dựng công thức lặp
Bước 2: Ta xét điều kiện hội tụ Furie với giả sử[a,b] là khoảng phân ly nghiệm : Bước 3: Áp dụng phương pháp lặp thay x0 bằng x1 :
Ta có sơ đồ khối dưới đây với sai số 𝜀 cho trước:
trình C
1 Xác định được phương trình ta cần tính là phương trình bậc mấy và hệ
số của từng bậc
Ta sẽ có hàm nhập như sau:
{
Trang 5scanf("%d",&n);
for(int i=*n; i>=0;i )
{
",i);
scanf("%f", &number[i]);
}
}
Đầu tiên là câu lệnh nhập bậc của phương trình, tùy theo đề bài
Vòng lặp for sẽ cho phép ta nhập hệ số của xn đến x0
2 Xét điều kiện hội tụ Furie
Ở đây ta sẽ áp dụng phương pháp tính giá trị của đa thức
a Để tính giá trị của đa thức tại 1 điểm X ta có hàm sau:
Để tính được giá trị của đa thức, ta tính giá trị của từng phần tử trong đa thức và cộng dồn các giá trị lại với nhau
Cách tính giá trị 1 phần tử x bậc i trong đa thức: a.x i
Cách tính tổng các các phần tử trong đa thức hay nói cách khác là tính giá trị của đa thức:
S=ax n +bx n-1 +… + dx i +……+gx 0
Ta có biến x kiểu giữ liệu double là giá trị tại đó ta muốn tính giá trị đa thức
Ta gọi biến s kiểu dữ liệu double để tính tổng giá trị của x tại các bậc khác nhau
Cho vòng lặp for cho i chạy từ n đến 0 tương ứng với bậc i của x chạy từ
n đến 0, mỗi lần lặp nó cộng dồn giá trị các phần tử của đa thức tại bậc i vào biến s
Với các hệ số a,b,c,… là hệ số của x bậc i tương ứng mảng các hệ số đã
nhập từ trước ở đây là mảng number[ i ].
x i được tính bằng hàm pow(x, i).
{
for(int i = n ; i >= 0 ; i )
{
Trang 6}
}
b Để tính giá trị đạo hàm bậc 1 tại điểm X
Tương tự, để tính được giá trị đạo hàm bậc 1 của đa thức, ta tính giá trị đạo hàm của từng phần tử trong đa thức và cộng dồn các giá trị lại với nhau
Cách tính giá trị 1 phần tử x bậc i trong đa thức: a.x i
Cách tính giá trị đạo hàm bậc của 1 phần tử x bậc i trong đa thức: a.i.x i-1
Cách tính tổng các các phần tử trong đa thức hay nói cách khác là tính giá trị của đa thức:
S=a.n.x n-1 +b.(n-1).x n-2 +… + d.i.x i-1 +……+ g.x 1 +0.
Ta có biến x kiểu dữ liệu double là giá trị tại đó ta muốn tính đạo hàm bậc n
Ta gọi biến s kiểu dữ liệu double để tính tổng giá trị đạo hàm của x tại các bậc khác nhau
Vòng lặp for cho i chạy từ n đến 1, trong mỗi lần lặp nó sẽ tính đạo hàm của từng phần tử x bậc i trong đa thức và cộng dồn vào biến s
Với các hệ số a,b,c,… là hệ số của x bậc i tương ứng mảng các hệ số đã
nhập từ trước, ở đây là mảng number[ i ].
x i được tính bằng hàm pow(x, i-1).
{
for(int i = n ; i >= 1 ; i )
{
}
}
c Tương tự như vậy ta có hàm tính giá trị đạo hàm bậc 2 tại điểm X.
{
Trang 7double s=0.0;
for(int i = n ; i >= 2 ; i )
{
}
}
d Để kiểm tra phương trình có thỏa mãn điều kiện Furie hay không
ta sử dụng hàm sau:
{
int isPositive = FDD(a,n)>=0;
for(double i=a;i<=b;i+=0.01)
{
{
tu Furie (do dao ham cap 1 doi dau)");
}
}
isPositive= SDD(a,n)>0;
for(double i=a;i<=b;i+=0.01)
{
{
tu Furie (do dao ham cap 2 doi dau)");
}
}
}
Đầu tiên ta phải xem dấu của đạo hàm cấp 1 và đạo hàm cấp 2 có cùng
dấu với f không:
Trang 8Vòng lặp for đầu tiên sẽ duyệt từ khoảng [a,b] để xem đạo hàm cấp 1 có đổi dấu không Nếu có trả về -2, không thì in ra thông báo Lặp lại quá trình tương tự với vòng lặp for thứ 2 áp dụng với đạo hàm cấp 2
Hàm sẽ trả về giá trị 1, -1 hoặc 0 dựa theo dấu của tích giá trị của hàm số
và đạo hàm cấp 2 tại các điểm a và b để chọn điểm x0:
n)>0 ? -1 : 0);
3 Áp dụng phương pháp Newton bằng hàm sau:
{
int iterations = 0;
maxIteration && (x >= a && x <= b))
{
x, saiso);
}
if(saiso>epsilon)
{
khoang phan ly (%lf, %lf)\n",a,b);
}
{
Trang 9printf(">> Nghiem gan dung: %f\n", x);
}
}
Đầu tiên ta xây dựng công thức lặp:
X k+1 =X k - f(x k )/f’(x k )
Vòng lặp while sẽ tiếp tục chạy khi mà sai số lớn hơn epsilon mà đề bài cho trước hoặc số lần lặp vẫn ít hơn số lần lặp tối đa đề bài cho phép Mỗi lần lặp thì biến iterations(số lần lặp) sẽ tăng lên 1
Câu lệnh if sẽ xét trường hợp nếu quá lần lặp tối đa cho phép mà sai số vẫn lớn hơn epsilon thì:
In ra thông báo “ Khong tim thay nghiem nam trong khoang phan
ly”.
Nếu không, in ra nghiệm, số lần lặp, sai số vào bảng đã tạo
4 Cuối cùng tất cả các hàm trên được gọi đến hàm main như sau
{
scanf("%lf %lf",&a,&b);
scanf("%lf",&epsilon);
int checkResult = convergenceCondition(n, a, b);
if(checkResult == 1)
Trang 10x0=a;
else if(checkResult == -1)
else if(checkResult == -2)
{
}
int maxIterations = 100000;
n);
}
Hàm này để nhập vào các dữ liệu mà đề bài cho trước và đồng thời chọn x0 dựa vào kết quả của hàm xét điều kiện Furie
x3−5 x2+7=0
Chọn khoảng phân ly nghiệm (3.5, 4); sai số cho phép là 0.00001
*Kiểm tra điều kiện hội tụ Furie:
f '=3 x2−10 x +3> 0∀ x ∈[3.5, 4]f ''=6 x −10>0∀ x ∈[3.5, 4]Chọn x0=4 vì f ( 4 )>0 và f ''( 4 )>0
10
n x n Sai số
1 3.727273 0.272727
2 3.6597 0.067573
3 3.655459 0.004241
Trang 11B TÍNH GẦN ĐÚNG TÍCH PHÂN XÁC ĐỊNH BẰNG PHƯƠNG PHÁP SIMPSON
I Mô tả thuật toán
1 Hiểu bài toán
Cần tính: I = ∫
a
b
f (x )dx
Nếu hàm f(x) liên tục trên [a,b] và có nguyên hàm F(x), công thức Newton – Lepnit:
I = ∫
a
b
f (x )dx = F(b) – F(a)
Trường hợp:
- f(x) chỉ được cho ở dạng bảng hoặc f(x)
- Hoặc f(x) đã biết nhưng tính toán phức tạp
Thay vì tính đúng, tính gần đúng sẽ đơn giản hơn
2 Mô tả bài toán chi tiết
Phân hoạch [a,b] thành 2n đoạn con bằng nhau: a = x0 < x1 < … < x2n = b
h = x i+1 – x i = (b−a)
2 n
x i = x 0 + ih, i = 0,1,…,2n
I =∫
a
b
f (x )dx=∫
x0
x2
f (x )dx+∫
x2
x4
f (x)dx +…+∫
x 2n−2
x 2n
f (x)dx
3 Xây dựng công thức
a Công thức Simpson:
Xét đoạn kép [xi, xi+2] Xấp xỉ f(x) bởi đa thức nội suy bậc 2 P2(x):
f(x)
b = x 2n
x 0 = a x 1 x 2
Trang 12I i = ∫
x 2 i−2
x 2 i
f (x )dx ≈∫
x 2i−2
x 2i
P x(x)dx
Đặt x = xi + t.h, dx = hdt;
x = xi => t = 0
x = xi+2 => t = 2
I i ≈ h∫
0
2
[y i+t ∆ y i+t (t−1)
2 ∆
2y i]dt
=h[y i t+ t
2
2 ∆ y i+ 1
2(
t3
2−
t2
2)∆
2
y i] |t=2 t=0=
h
3(y i+4 y i+ 1+y i +2)
Sai số:
r i (h)¿ −h5
90f
( 4 )
(c i);c i ∈[x i , x i+ 2]
|f( 4 )
(x )|≤ M , ∀ x ∈[x i , x i +2] thì |r i(h)|≤ M h
5
90
b Công thức simpson toàn phần:
I =∫
a
b
f (x )dx=∫
x0
x2
f (x )dx+∫
x2
x4
f (x)dx +…+∫
x 2n−2
x 2n
f (x)dx
= h3(y0+4 y1+y2)+h
3(y2 +4 y3+y4)+…+ h
3(y 2 n−2+4 y 2 n−1+y 2 n)
P 2 (x)
f(x)
Trang 13= h3[(y0++y2)+ 4(y1+y3+…+ y 2n −1)+2(y2++y4+…+ y 2 n)]
c. Sai số toàn phần:
r (h)=∑
i=1
n
r i (h); |r i(h)|≤ nM h
5
90 Với M thỏa: ¿f(4 )(x)∨≤ M ∀ x ∈[a , b]
II Mô hình hóa
1 Cho tích phân
I = ∫
a
b
f (x )dx
2 Xác định số khoảng
chia 2n
3 Chia đoạn [a, b] thành
2n đoạn bằng nhau
4 Tính
h = b−a 2 n ;
xi = a + ih;
yi = f(xi)
5 Tính
IS = h3 [(y0 + y2n)] + 4(y1
+ y3 + … + y2n-1) + 2(y2
+ y4 + … + y2n-2)]
6 Tích phân I cần tìm
xấp xỉ với I S
for (i = 2; i < n; i += 2): sum3 += 2 * 1 / (1 + (a+i*h)*(a+i*h))
END
Nhập vào số thực
a và b Nhập vào số đoạn chia n (n % 2 = 0)
Tính h = (b – a) / n sum1 = 1 / (1 + a * a) +
1 / (1 + b * b)
Kết quả
START
for (j = 1; j < n; j += 2):
sum2 += 4 * 1 / (1 + (a+j*h)*(a+j*h))
kq = sum1 + sum2 + sum3
Khai báo biến
h, i, j, sum1, sum2, sum3,
kq
Trang 14III Giải thích code
Nhập giá trị [a,b] và đoạn chia n
Khởi tạo biến khoảng cách h theo công thức
Trang 15Nhập vào một số thực x giá trị được trả về là y tương ứng
* In ra các giá trị xi và yi
Điều kiện lặp:
hoặc bằng số đoạn chia
theo cộng thêm 1 Trong vòng lặp:
In ra giá trị xi theo công thức đã xây dựng
In ra giá trị yi theo hàm
Tính gần đúng tích phân bằng phương pháp simpson
Trang 16Khai báo các giá trị ban đầu.
giá trị yi
* Đối với số lẻ:
Điều kiện lặp:
đoạn chia
cộng thêm 2 để đảm bảo vẫn là số lẻ
Trong vòng lặp:
công thức đã xây dựng
* Đối với số chẵn:
Điều kiện lặp:
số đoạn chia
cộng thêm 2 để đảm bảo vẫn là số chẵn Trong vòng lặp:
công thức đã xây dựng
Trang 17IV Ví dụ
Tính ∫
0
1
dx
1+x2 Sử dụng công thức Simpson với 10 điểm chia
Chia đoạn[0,1]thành2 n (n=5) đoạn bằng nhauTatính được I S=0,785398045
Trả về kết quả theo công thức
đã xây dựng
In ra các giá trị xi và
yi
Tính gần đúng tích phân bằng phương pháp Simpson Nhập giá trị [a,b] và đoạn chia n
Trang 18x i y i