Giáo trình Matlab cơ bản - Chương 6: Đạo hàm và tích phân số
Tích phân Romberg kết hợp quy tắc tích phân hình thang với phương
pháp ngoại suy Richardson. Trước hết ta đưa vào khái niệm:
Ri,1 = Ji
Trong đó Ji là giá trị xấp xỉ của
b a
∫f(x)dx có được bằng cách tính theo quy tắc
lặp hình thang lần thứ i.
Tích phân Romberg bắt đầu từ R1,1 = J1 (một hình thang) và R2,1 = J2 (hai
hìn thang). Sau đó tính R2,2 bằng cách ngoại suy:
22,1 1,12,2 2,1 1,1 22 R R 4 1R R R
2 1 3 3−= = −−(1)
Để tiện dùng ta lưu các kết quả vào mảng dạng:
1,12,1 2,2RR R⎡ ⎤⎢ ⎥⎣ ⎦
cobi. Các công thức tính đa thức Jacobi là: ( , )0P (x) 1 α β = [ ]( , )1P (x) 0.5 2( 1) ( 2)(x 1)α β = α + + α + β + − ( , ) ( , ) ( , ) 2n 3n n 1 4n n 2 n 1n (b b x)P (x) b P (x)P (x) b α β α β α β − −+ −= Với: b1n = 2i(i + α + β)(2i + α + β ‐2) b2n = (2i + α + β ‐1)(α2 ‐ β2) b3n = (2i + α + β ‐ 2)(2i + α + β ‐ 1)(2i + α + β) b4n = 2(i + α ‐ 1)(i + β ‐ 1)(2i + α + β) Các trọng số wi được xác định bằng: [ ] 2i 1 i 22 i n i (i 1) (i 1) 2 n!w (i 1) (1 x ) V (x ) +α+β+Γ + α + Γ + β += Γ + α + β + ′− với: n ( , ) n n n 2 n!V P (x) ( 1) α β= − Ta xây dựng hàm gaussjacobi() để tìm xi và wi: 350 function [x, w] = gaussjacobi(n, alfa, beta) %tinh cac trong so va hoanh do trong tich phan Gauss‐Jacobi p = [0.5*(alfa + beta + 2) 0.5*(alfa ‐ beta)]; a = 1; b = p; for i = 2:n+1 b1 = 2*i*(i + alfa + beta)*(2*i + alfa + beta ‐2); b2 = (2*i + alfa + beta ‐1)*(alfa^2 ‐ beta^2)/b1; b3 = ((2*i + alfa + beta ‐2)*(2*i + alfa + beta ‐1 )*(2*i + alfa + beta))/b1; b4= (2*(i + alfa ‐1)*(i + beta ‐ 1)*(2*i + alfa + beta))/b1; s = [b3 b2]; if i == n+1 pn1 = conv(s, b) ‐ [0 0 b4*a]; break; else p = conv(s, b) ‐ [0 0 b4*a]; end a = b; b = p; end x = roots(p); w = zeros(n, 1); dv = polyder(p); if mod(n, 2) == 1 sign = ‐1; else sign = 1; end dv = dv*(2^n)*factorial(n)/sign; pn1 = ‐pn1*(2^(n+1))*factorial(n+1)/sign; for i = 1:n num = (2*n + alfa + beta +... 2)*gamma(n+alfa+1)*gamma(n+beta+1)*(2^(2*n+alfa+beta+1))*factorial(n); den = (n + alfa + beta + 1)*gamma(n+alfa+beta+1)*polyval(dv,... x(i))*polyval(pn1, x(i)); w(i) = num/den; 351 end Tiếp theo ta xây dựng hàm intgaussjacobi() để tính tích phân: function J = intgaussjacobi(f, n, alf, bta) [t, w] = gaussjacobi(n, alf, bta); fx = feval(f, t); J = wʹ*fx; Để tính tích phân ta dùng chương trình ctgaussjacobi.m: clear al, clc f = inline(ʹexp(x).*sin(x)ʹ,ʹxʹ); n = 6;%n <= 40 alfa = 1; beta = 0; J = intgaussjacobi(f, n, alfa, beta) §17. TÍCH PHÂN RADAU Cầu phương Radau dùng để tính tích phân: 1 1 J f(x)dx − = ∫ (1) Theo công thức cầu phương Radau ta có: 1 n 1 i i i 21 J f(x)dx w f( 1) w f(x ) =− = = − + ∑∫ (2) Điểm (‐1) là một một nút trong số các nút của cầu phương. Các hoành độ còn lại là nghiệm của đa thức: n 1 nP (x) P (x) 1 x − − + (3) Trong đó P(x) là đa thức Legendre. Các trọng số tương ứng được tính theo: [ ]ii 22 n 1 i 1 xw n P (x )− −= (4) và điểm cuối có: 1 2 2w n = Ta xây dựng hàm radau() để tính các hoành độ xi và trọng số wi: 352 function [x , w] = radau(n) %Tinh cac hoanh do va trong so trong cau phuong Radau tol = 1e‐8; %danh gia ban dau cac hoanh do la ca nut Chebyshev‐Gauss‐Radau x(1:n,1) = ‐ cos(2.0*pi*(0:n‐1)/(2*n‐1))ʹ; p = zeros ( n, n+1 ); xold(1:n,1) = 2.0; while (tol < max(abs(x(1:n,1)‐xold(1:n,1)))) xold = x; p(1,1:n+1) = (‐1.0).^(0:n); p(2:n,1) = 1.0; p(2:n,2) = x(2:n,1); for j = 2:n p(2:n,j+1) = ((2*j ‐ 1)*x(2:n,1).*p(2:n,j)+ ( ‐j+1)*p(2:n,j‐1))/j; end x(2:n,1) = xold(2:n,1) ‐ ((1.0 ‐ xold(2:n,1))/n)... .*(p(2:n,n)+p(2:n,n+1))./(p(2:n,n) ‐ p(2:n,n+1)); end w = zeros(n,1); w(1) = 2/n^2; Tiếp theo ta xây dựng hàm intradau(), để tính tích phân. Trong hàm ta đổi cận lấy tích phân trong khoảng [‐1, 1] thành tích phân trong khoảng: function J = intradau(f, n, a, b) [t, w] = radau(n); x = ((b ‐ a)*t + a + b)/2; fx = feval(f, x); J = wʹ*fx*(b ‐ a)/2; Để tính tích phân ta dùng chương trình ctradau.m: clear al, clc f = inline(ʹx.*sin(x)ʹ); n = 6;%n <= 40 a = 1; 353 b = 3; J = intradau(f, n, a, b) §18. TÍCH PHÂN CHEBYSHEV ‐ RADAU Cầu phương Chebyshev – Radau dùng tính tích phân: 1 1 J f(x)dx − = ∫ (1) Theo công thức cầu phương Chebyshev ‐ Radau ta có: [ ]1 n i i i i 21 J f(x)dx w f(x ) f( x ) =− = = − −∑∫ (2) Các hoành độ xi và trọng số tương ứng wi cho trong bảng: xi 0.3549416 0.6433097 0.7783202 0.9481574 wi 0.1223363 0.1223363 0.1223363 0.1223363 Ta xây dựng hàm chebradau() để chứa các giá trị x và w: function [x, w] = chebradau x(1) = 0.3549416; x(2) = 0.6433097; x(3) = 0.7783202; x(4) = 0.9481574; w(1) = 0.1223363; w(2) = 0.1223363; w(3) = 0.1223363; w(4) = 0.1223363; và hàm intchebradau() để tính tích phân: function J = intchebradau(f, a, b) [t, w] = chebradau; fx1 = feval(f, t); fx2 = feval(f, ‐t); J = (w*fx1ʹ ‐ w*fx2ʹ); 354 Để tính tích phân của một hàm cụ thể ta dùng chương trình ctchebradau.m: clear al, clc f = inline(ʹexp(x).*sin(x)ʹ,ʹxʹ); J = intchebradau(f) §19. TÍCH PHÂN GAUSS – RADAU Công thức cầu phương Gauss ‐ Radau có dạng: 1 n 1 1 2 i i i 21 f(x)dx w f( 1) w f(1) w f(x ) − =− = − + + ∑∫ Ngoài hai điểm nút x = 1, các điểm nút khác là nghiệm của đa thức Pn(x) + Pn+1(x) , với P(x) là đa thức Legendre. Các trọng số được xác định bằng: = +1 2 2w (n 1) [ ]+ −= + i i 2 n 1 i 1 xw (n 1) P (x ) Ta xây dựng hàm gaussradau() để tính các hoành độ và trọng số của cầu phương: function [x, w] = gaussradau(N) % tinh cac nut va trong so cua cau phuong Gauss ‐ Radau N1 = N + 1; % dung cac nut Chebyshev‐Gauss‐Radau lam xap xi dau tien x = ‐cos(2*pi*(0:N)/(2*N+1))ʹ; P = zeros(N1, N1+1); xold = 2; free = 2:N1; while max(abs(x‐xold)) > eps xold = x; P(1, :) = (‐1).^(0:N1); P(free, 1) =1; P(free, 2) = x(free); for k = 2:N1 P(free, k+1) = ( (2*k ‐ 1)*x(free).*P(free, k) ‐ (k ‐ 1)*P(free, k‐1) )/k; end 355 x(free) = xold(free) ‐ ((1‐xold(free))/N1).*(P(free, N1) + P(free, N1+1))..../(P(free, N1) ‐ P(free, N1+1)); end P = P(1:N1, 1:N1); w = zeros(N1, 1); w(1) =2/N1^2; w(free) = (1‐x(free))./(N1*P(free, N1)).^2; Ta dùng hàm intgaussradau() để tính tích phân của hàm f(x) trên đoạn [a, b]: function J = intgaussradau(f, n, a, b) [t, w] = gaussradau(n); x = ((b ‐ a)*t + a + b)/2; fx = feval(f, x); J = wʹ*fx*(b ‐ a)/2; Để tính tích phân của hàm ta dùng chương trình ctgaussradau.m: clear all, clc f = inline(ʹexp(x).*sin(x)ʹ,ʹxʹ); n = 6; a = 1; b = 3; J = intgaussradau(f, n, a, b) §20. ĐA THỨC NỘI SUY VÀ TÍCH PHÂN SỐ Khi hàm được cho dưới dạng bảng số, để tính tính phân của hàm ta thực hiện các bước sau: ‐ Tìm đa thức nội suy, có thể là đa thức Lagrange, đa thức Newton... ‐ Tìm tích phân của đa thức nội suy Sau đây chúng ta sẽ xây dựng chương trình ctinterp.m để tính tích phân dùng đa thức nội suy Lagrange: clear all, clc x = [1.0000 1.2000 1.4000 1.6000 1.8000 2.0000]; y = [1.9221 1.9756 1.6517 0.8501 ‐0.4984 ‐2.4199]; l = lagrange(x, y); 356 n = length(l); p = conv(l, [1 0]); n = length(p); for i = 1:n‐1 q(i) = p(i)/(n‐i); end q(n) = p(n); tp = polyval(q, x(length(x))) ‐ polyval(q, x(1)); §21. TÍCH PHÂN KÉP 1. Khái niệm chung: Ta khảo sát tích phân của hàm z = f(x, y) trên miền { }= ≤ ≤ ≤ ≤R (x,y|a x b,c(x) y d(x) như hình vẽ. Ta cần tính tích phân: ⎧ ⎫⎪ ⎪= = ⎨ ⎬⎪ ⎪⎩ ⎭∫∫ ∫∫ b d(x) R c(x) a J f(x,y)dxdy f(x,y)dy dx Công thức gần đúng của tích phân là: [ ] = = = ∑ ∑m ni j i i ,j i 1 j 1 J a,b,c(x),d(x) w v f(x ,y ) với các trọng số wi, vj tuỳ thuộc vào cáh tính tích phân hàm một biến. Ta xây dựng hàm int2simpson() để tính tích phân kép bằng công thức Simpson. function J = int2simpson(f, a, b, c, d, m, n) % tich phan kep cua ham f(x,yen mien R = {(x,y)|a <= x <= b, c(x) <= y <= d(x)} a y d(x) hx0,y1 b hx1 x0 x c(x) xm x2 x1 hx2 hxm hx0,y2 hx1,y2 hx1,y1 357 % dung quy tac Simpson if ceil(m) ~= floor(m) %be rong co dinh cua cac doan tren x hx = m; m = ceil((b ‐ a)/hx); end if mod(m, 2) ~= 0 m = m + 1; end hx = (b ‐ a)/m; i = 1:m+1; x = a + (i ‐ 1)*hx; if isnumeric(c) cx(i) = c; %neu c la hang so else cx(i) = feval(c,x(i)); %khi c la ham cua c x end if isnumeric(d) dx(i) = d; %neu d la hang so else dx(i) = feval(d,x(i)); %khi d la ham cua x end if ceil(n) ~= floor(n) %be rong co dinh theo y hy = n; nx(i) = ceil((dx(i)‐ cx(i))/hy); ind = find(mod(nx(i),2) ~= 0); nx(ind) = nx(ind) + 1; else %so khoang co dinh if mod(n, 2) ~= 0 n = n + 1; end nx(i) = n; end for i = 1:m + 1 sx(i) = simpsonfxy(f,x(i),cx(i),dx(i),nx(i)); end kodd = 2:2:m; 358 keven = 3:2:m ‐ 1; %the set of odd/even indices J = hx/3*(sx(1) + sx(m + 1) + 4*sum(sx(kodd)) + 2*sum(sx(keven))); function Jf = simpsonfxy(f, x, c, d, n) %tich phan mot bien cua f(x,y) voi Ry = {c <= y <= d} if nargin < 5 n = 100; end if abs(d ‐ c)< eps | n <= 0 Jf = 0; return; end if mod(n, 2) ~= 0 n = n + 1; end h = (d ‐ c)/n; y = c + [0:n]*h; fxy = feval(f,x,y); fxy(find(fxy == inf)) = realmax; fxy(find(fxy == ‐inf)) = ‐realmax; kodd = 2:2:n; keven = 3:2:n ‐ 1; Jf = h/3*(fxy(1) + fxy(n + 1) + 4*sum(fxy(kodd)) + 2*sum(fxy(keven))); Để tính thể tích của hình cầu ta dùng chương trình ctint2simp.m: clear all, clc %Tinh the tich hinh cau x = [‐1:0.05:1]; y = [0:0.05:1]; [X,Y] = meshgrid(x,y); f = inline(ʹsqrt(max(1 ‐ x.*x ‐ y.*y,0))ʹ,ʹxʹ,ʹyʹ); Z = f(X,Y); mesh(x,y,Z); a = ‐1; b = 1; c = 0; 359 d = inline(ʹsqrt(max(1 ‐ x.*x,0))ʹ,ʹxʹ); Vs1 = int2simpson(f, a, b, c, d, 100, 100)% so diem cho truoc error1 = Vs1 ‐ pi/3 Vs2 = int2simpson(f, a, b, c, d, 0.01, 0.01) %be rong cac doan cho truoc error2 = Vs2 ‐ pi/3
File đính kèm:
- giao_trinh_matlab_co_ban_chuong_6_dao_ham_va_tich_phan_so.pdf