Professional Documents
Culture Documents
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
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
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