You are on page 1of 8

BÀI THỰC HÀNH 3: ỨNG DỤNG MATLAB TÍNH GẦN

ĐÚNG ĐẠO HÀM VÀ TÍCH PHÂN


Họ tên: Trần Quốc Đăng; MSSV: 20200155; Ca học: 6
Câu 1:
a) Tính gần đúng đạo hàm của y tại x = 0.7 bằng cách áp dụng công thức Taylor.
 Hàm Taylor:
function fd1 = Taylor(x_array, y_array, h, value)
for i = 1:length(x_array)
if x_array(i) == value
fd1 = (y_array(i+1) - y_array(i)) / h;
break;
end
end
end
 Giải thích code:
1- Gọi ra hàm con tên Taylor trong đó ‘x_array, y_array, h, value’ là các tham số
truyền vào và ‘fd1’ là kết quả trả về.
2- Tạo vòng lặp for chạy tử 1 đến hết mảng x_array với hàm length là hàm đo kích
thước của mảng x_array.
3- Tạo điều kiện nếu giá trị của mảng x_array tại vị trí i bằng value thì sẽ thực hiện
điều kiện bên dưới.
4- Khi thỏa điều kiện trên sẽ tiến hành thực hiện tính fd1 = (y_array(i+1) -
y_array(i)) / h tương đương với tính xấp xỉ đạo hàm f’(x) = (f(x + h) – f(x))/h theo
lý thuyết.
5- Sau khi tính toán xong fd1 thì sẽ thoát khỏi vòng lặp.
6- Kết thúc điều kiện if.
7- Kết thúc vòng lặp for.
8- Kết thúc hàm con Taylor.
 Tính gần đúng đạo hàm của y tại x = 0.7 bằng ham Taylor:
x_array = [0.1 0.3 0.5 0.7 0.9];
y_array = [0.1002 0.3047 0.5236 0.7754 1.1198];
h = 0.2;
value = 0.7;
x1 = Taylor(x_array, y_array, h, value);
 Kết quả x1 = 1.7220
 Giải thích code:
1- Tạo mảng x_array chứa các giá trị của x.
2- Tạo mảng y_array chứa các giá trị của hàm y(x) = arcsin(x).

1|Page
3- Tạo biến h là khoảng cách giữa các giá trị liền kề trong mảng x_array.
4- Tạo biến value = 0.7 là giá trị cần tính đạo hàm.
5- Dùng hàm con Taylor với tham số truyền vào ‘x_array, y_array, h, value’ và trả kết
quả về cho biến x1.

b) Tính gần dúng đạo hàm của hàm số y = arcsin (x) tại x = 0.7 bằng cách dùng
đa thức nội suy lagrange.
 Hàm Lagrange:
function dathuc = lagrange(x_array, y_array)
n = length(x_array);
syms x;
dathuc(x) = 0*x;
for i=1:n
f(x) = 0*x + 1;
for j=1:n
if i ~= j
tmp(x) = x - x_array(j);
tmp(x) = tmp(x) / (x * 0 + x_array(i) -
x_array(j));
f(x) = f(x) * tmp(x);
end
end
dathuc(x) = dathuc(x) + y_array(i)*f(x);
end
end
 Giải thích code:
1- Gọi ra hàm con tên lagrange và x_array, y_array là tham số truyền vào và dathuc là
kết quả trả về.
2- Dùng hàm length để tìm kích thước của mảng x_array xong lưu vào biến n.
3- Khởi tạo biến x với dạng symbol.
4- Khởi tạo 1 hàm dathuc(x) là dạng symbol function là 0*x.
5- Tạo vòng lặp for với biến i chạy từ 1 tới n với số bước nhảy là 1.
6- Mỗi lận chạy vòng lặp for thì gán f(x) = 0*x + 1.
7- Tạo vòng lặp for với biến j chạy từ 1 tới n với số bước nhảy là 1.
8- Tạo hàm điều kiên if nếu i khác j.
9- Nếu thỏa điều kiện if ở bước 8 thì tính biểu thức x -x_array(j) sau đó lưu vào
tmp(x).
10- Nếu thỏa điều kiện if ở bước 8 thì tính biểu thức tmp(x)/(x*0 + x_array(i) –
x_array(j)) sau đó lưu vào tmp(x).
11- Nếu thỏa điều kiện if ở bước 8 thì tính biểu thức f(x)*tmp(x) sau đó lưu vào f (x).
12- Kết thúc điều kiện if.

2|Page
13- Kết thúc vòng lặp for j = 1:n.
14- Tính biểu thức dathuc(x) + y_array(i)*f(x) sau đó lưu vào dathuc(x).
15- Kết thúc vòng lặp for i = 1:n.
16- Kết thúc hàm con.
 Tính gần đúng đạo hàm của y tại x = 0.7 bằng ham Lagrange:
x_array = [0.1 0.3 0.5 0.7 0.9];
y_array = [0.1002 0.3047 0.5236 0.7754 1.1198];
value = 0.7;
syms x;
f = lagrange(x_array, y_array);
fd1 = vpa(diff(f), 4);
fd2 = str2func(['@(x)' char(fd1)]);
x2 = fd2(value);
 Kết quả x2 = 1.4241.
 Giải thích code:
1- Tạo mảng x_array chứa các giá trị của x.
2- Tạo mảng y_array chứa các giá trị của hàm y(x) = arcsin(x).
3- Tạo biến value = 0.7 là giá trị cần tính đạo hàm.
4- Khai báo biến x kiểu symbol.
5- Dùng hàm lagrange để tính toán với tham số truyền vào là ‘x_array, y_array’ và kết
quả trả về sẽ lưu vào hàm f.
6- Dùng hàm diff để tính đạo hàm bậc 1 của hàm f và dùng hàm vpa để thực hiện làm
tròn 4 chữ số. Kết quả trả về sẽ lưu vào fd1.
7- Dùng hàm str2func để chuyển từ dạng chuỗi sang dạng function.
8- Thay value = 0.7 vào hàm fd2 để tính sau đó lưu kết quả vào biến x2.

c) Tính chính xác kết quả đạo hàm. So sánh với 2 kết quả gần đúng ở trên và
nhận xét.
1
 (arcsin(0.7))’ = = 1.400280084.
√1−(0.7)2
 Sai số so với khi tính đạo hàm bằng Taylor: |1.400280084 – x1| = |1.400280084 –
1.7220| = 0.321719916.
 Sai số so với khi tính đạo hàm bằng Lagrange: |1.400280084 – x2| = |1.400280084
– 1.4241| = 0.02381991597.
 Nhận xét: Ta có thể thấy khi tính đạo hàm bằng phương pháp Lagrange cho sai số
thấp hơn khi dùng Taylor.
Câu 2: Viết function tính gần đúng tích phân của một hàm số f(x) bất kỳ trong khoảng
[a,b] sử dụng công thức hình thang với N đoạn con bằng nhau.

3|Page
 Code:

function y = tichphanhinhthang(fx, a, b, N)
sum = fx(a) + fx(b);
h = (b - a) / N;
for i = 1:N-1
sum = sum + 2 * fx(a + i*h);
end
y = (h / 2) * sum;
end
 Giải thích code:
1- Gọi ra hàm con tên tichphanhinhthang trong đó ‘fx, a, b, N’ là tham số tuyền vào và
y là kết quả trả về.
2- Tạo biến sum là tổng của giá trị fx tại a và giá trị fx tại b.
3- Tạo biến h(chiều cao hình thang) bằng (b- a)/ N.
4- Khởi tạo vòng lặp for chạy từ 1 tới N – 1 với số bước nhảy bằng 1.
5- Mỗi vòng lặp for thì sẽ thực hiện phép toán sum + 2*fx(a + i*h) sau đó lưu lại vào
biến sum.
6- Kết thúc vòng lặp for.
7- Thực hiện phép toán (h/2)*sum sau đó lưu vào biến y.
8- Kết thúc hàm con.
 Áp dụng tính gần đúng tích phân của hàm số f(x) = x3sin (𝑥) + xcos(x) trong khoảng
[0,1] với N = 10.
fx = @(x) x^3 * sin(x) + x * cos(x);
y1 = tichphanhinhthang(fx, 0, 1, 10);
 Kết quả y1 = 0.5603.
 Giải thích code:
1- Tạo hàm fx dưới dạng function handle bằng x^3 * sin(x) + x * cos(x).
2- Dùng hàm con tichphanhinhthang để tính với tham số truyền vào là ‘fx, 0, 1, 10’và
kết quả trả về sẽ lưu vào biến y1.
Câu 3: Viết function tính gần đúng tích phân của một hàm số f(x) bất kỳ trong khoảng
[a,b] sử dụng công thức Simpson với N đoạn con bằng nhau.
 Code:
function y = tichphanSimpson(fx, a, b, N)
sum = fx(a) + fx(b);
h = (b - a) / N;
for i = 1:N-1
if rem(i, 2) == 0
sum = sum + 2 * fx(a + i * h);

4|Page
else
sum = sum + 4 * fx(a + i * h);
end
end
y = sum * (h / 3);
end

 Giải thích code:


1- Gọi ra hàm con tên tichphanSimpson trong đó ‘fx, a, b, N’ là tham số truyền vào và
y là kết quả trả về.
2- Tạo biến sum là tổng giá trị của fx tại a và giá trị fx tại b.
3- Tạo biến h bằng (b - a)/N.
4- Khởi tạo vòng lặp for chạy từ 1 tới N-1 với số bước nhảy là 1.
5- Khởi tạo điều kiện nếu i chia 2 lấy dư bằng 0 thì thỏa điều kiện.
6- Nếu thỏa điều kiện trên thì thực hiện phép toán sum + 2*fx(a + i*h) sau đó lưu lại
vào biến sum.
7- Ngược lại điều kiện ở bước 5 thì sẽ thực hiện công việc ở dưới.
8- Nếu thỏa điều kiện ở bước 7 thì sẽ thực hiện phép toán sum + 4*fx(a + i*h) sau đó
lưu lại vào biến sum.
9- Kết thúc câu điều kiện if else.
10-Kết thúc vòng lặp for.
11-Thực hiện phép toán sum*(h/3) sau đó lưu kết quả vào biến y.
12-Kết thúc hàm con.
 Áp dụng tính gần đúng tích phân của hàm số f(x) = x3sin (𝑥) + xcos(x) trong khoảng
[0,1] với N = 10.
fx = @(x) x^3 * sin(x) + x * cos(x);
y2 = tichphanSimpson(fx, 0, 1, 10);
 Kết quả y2 = 0.5589.
 Giải thích code:
1- Tạo hàm fx dưới dạng function handle bằng x^3 * sin(x) + x * cos(x).
2- Dùng hàm con tichphanSimpson để tính với tham số truyền vào là ‘fx, 0, 1, 10’và
kết quả trả về sẽ lưu vào biến y2.
Câu 4:
a) Tính chính xác tích phân của hàm số f(x) = x3sin(x) trong khoảng [0, 1]. So
sánh với giá trị gần đúng ở câu a và b rồi nhận xét. Gợi ý: tìm hiểu lệnh
intergral.
 Code:
fx = @(x) (x.^3) .* sin(x);

5|Page
a = 0;
b = 1;
N = 10;
y1 = tichphanhinhthang(fx, a, b, N);
y2 = tichphanSimpson(fx, a, b, N);
y3 = integral(fx, a, b);
fprintf("y1 = %.10f\ny2 = %.10f\ny3 = %.10f\n", y1, y2, y3);
 Kết quả:
y1 = 0.1796515769.
y2 = 0.1771023216.
y3 = 0.1770985749.
 Giải thích code:
1- Khởi tạo hàm fx dưới dạng function handle bằng (x.^3) .* sin(x).
2- Tạo biến a bằng 0 vì giá trị fx nằm trong khoảng từ [0, 1].
3- Tạo biến b bằng 1 vì giá trị fx nằm trong khoảng từ [0, 1].
4- Tạo biến N đoạn bằng nhau bằng 10.
5- Dùng hàm con tichphanhinhthang để tính sau đó lưu kết quả vào biến y1.
6- Dùng hàm con tichphanSimpson để tính sau đó lưu kết quả vào biến y2.
7- Dùng hàm integral để tính toán chính xác kết quả tích phân sau đó lưu kết quả vào
biến y3.
8- In các biến y1,y2,y3 kiểu float ra màn hình.
 So sánh và nhận xét:
 Ta thấy y3<y2<y1.
 Sai số giữa phương pháp tích phân hình thang với integral: |y3 – y1| = |
0.1770985749 - 0.1796515769 | = 0.0025530020.
 Sai số giữa phương pháp tích phân Simpson với integral: |y3 – y2 | = |
0.1770985749 - 0.1771023216| =0.0000037467.
Nhận xét: Ta có thể thấy khi tính tích phân bằng phương pháp Simpson cho kết quả sai
số thấp hơn phương pháp hình thang.
b) Viết chương trình tính sự chênh lệch của 2 phương pháp hình thang và
Simpson so với tích phân chính xác integral ở ba trường hợp N = 1, N = 10 và
N = 50 (in ra chi tiết giá trị chênh lệch). Từ đó rút ra kết luận phương pháp nào
có độ chính xác cao hơn ?
 Code:
fx = @(x) (x.^3) .* sin(x);
a = 0;
b = 1;

6|Page
N = [1 10 50];
for i = 1:length(N)
y1 = tichphanhinhthang(fx, a, b, N(i));
y2 = tichphanSimpson(fx, a, b, N(i));
y3 = integral(fx, a, b);
saiso_1 = abs(y3 - y1);
saiso_2 = abs(y3 - y2);
fprintf("Truong hop N = %d:\nsaiso_1 = %.10f\nsaiso_2 = %.10f\n\
n", N(i), saiso_1, saiso_2);
end
 Kết quả:
Trường hợp N = 1:
saiso_1 = 0.2436369175
saiso_2 = 0.1033917534

Trường hợp N = 10:


saiso_1 = 0.0025530020
saiso_2 = 0.0000037467

Trường hợp N = 50:


saiso_1 = 0.0001021557
saiso_2 = 0.0000000059
 Giải thích code;
1- Khởi tạo hàm fx dưới dạng function handle bằng (x.^3) .* sin(x).
2- Tạo biến a bằng 0 vì giá trị fx nằm trong khoảng từ [0, 1].
3- Tạo biến b bằng 1 vì giá trị fx nằm trong khoảng từ [0, 1].
4- Tạo một mảng N với 3 giá trị lần lượt là 1 10 50.
5- Khởi tạo vòng lặp for chạy từ 1 đến hết mảng N với số bước nhảy là 1.
6- Dùng hàm con tichphanhinhthang để tính sau đó lưu kết quả vào biến y1.
7- Dùng hàm con tichphanSimpson để tính sau đó lưu kết quả vào biến y2.
8- Dùng hàm integral để tính toán chính xác kết quả tích phân sau đó lưu kết quả vào
biến y3.
9- Tính saiso_1 là trị tuyệt đối của hiệu y3 với y1.
10-Tính saiso_2 là trị tuyệt đối của hiệu y3 với y2.
11- In ra màn hình theo từng trường hợp N thì sẽ cho saiso_1 và saiso_2 tương đương.

7|Page
 Nhận xét: Ta thấy sau khi cho lần lượt N = 1,10,50 thì kết quả sai số luôn cho ta thấy
sai số của phương pháp Simpson luôn thấp hơn so với phương pháp hình thang. Chính
vì vậy phương pháp Simpson có độ chính xác cao hơn so với phương pháp hình thang.

8|Page

You might also like