function val = area_intersec_deter(ndiv_x,ndiv_y) % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % Sejam f e g as seguintes funcoes de R^2 em R: % % f(x,y) = (x^2)/4 + (y^2)/8 - 1 % e % g(x,y) = x*y - 1. % % Sejam os cojuntos % A = { (x,y) pertecente a R^2 | f(x,y) < 0 } % % B = { (x,y) pertecente a R^2 | g(x,y) < 0 } % % O algoritmo ''deterministico'' a seguir calcula numericamente % a area de intersecao dos conjuntos A e B. % A regiao de interseccao eh aproximada por retangulos. % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % xa = -2; xb = 2; ya = 0; yb = sqrt(8); xcelc = zeros(ndiv_x,1); ycelc = zeros(ndiv_y,1); xsample = zeros(ndiv_x*ndiv_y,1); ysample = zeros(ndiv_x*ndiv_y,1); dx = zeros(ndiv_x,1); dy = zeros(ndiv_y,1); % por simplicidade, dx e dy sao escolhidos constantes % para usar espacamento nao uniforme em x ou y, programe-o(s) a seguir dx(:) = (xb - xa) / ndiv_x; dy(:) = (yb - ya) / ndiv_y; % se flag_stochastic = 1, entao o ponto-teste que define % se a celula entrara ou nao no computo da area sera posto % aleatoriamente dentro de cada celula flag_stochastic = 0; flag_plot_aprox = 1; xcelc(1) = xa + dx(1)/2; for icel=2:ndiv_x xcelc(icel) = xa + dx(1)/2 + (icel-1)*( dx(icel) + dx(icel-1) )/2; end ycelc(1) = ya + dy(1)/2; for jcel=2:ndiv_y ycelc(jcel) = ya + dy(1)/2 + (jcel-1)*( dy(jcel) + dy(jcel-1) )/2; end if (flag_stochastic == 1) rand('seed',1) % para fixar a semente do gerador da distribuicao uniforme de intervalo (0,1) end area_numer = 0; % zerando a variavel 'area_numer' para depois somar kk = 1; is = 1; for icel=1:ndiv_x for jcel=1:ndiv_y if (flag_stochastic == 1) xcel = xcelc(icel) + ( 0.5-rand )*dx(icel); ycel = ycelc(jcel) + ( 0.5-rand )*dy(jcel); xsample(is) = xcel; ysample(is) = ycel; is = is + 1; else xcel = xcelc(icel); ycel = ycelc(jcel); end valf = avaliaf( xcel , ycel ); valg = avaliag( xcel , ycel ); if ( (valf < 0) && (valg < 0) ) area_numer = area_numer + dx(icel)*dy(jcel); index_area_cel(kk,1) = icel; index_area_cel(kk,2) = jcel; kk = kk + 1; end end end area_aprox_full = 2*area_numer % area_numer considera somente metade da area (primeiro quadrante) x_g_ini = sqrt( 2-sqrt(7/2) ); x_g_fim = sqrt( 2+sqrt(7/2) ); area_exata_r1 = integral_f(x_g_ini) - integral_f(xa); area_exata_r2 = log(x_g_fim) - log(x_g_ini); area_exata_r3 = integral_f(xb) - integral_f(x_g_fim); area_exata = area_exata_r1 + area_exata_r2 + area_exata_r3; area_exata_full = 2*area_exata erro_rel = (area_aprox_full - area_exata_full) / area_exata_full xgrid = xa:dx:xb; ygrid = ya:dy:yb; hold off plot(0); % plotando 'zero' somente para limpar possivel figura anterior hold on if (flag_plot_aprox == 1) % esta programado somente para espacamento uniforme, % mas isto pode ser generalizado for kk=1:length(index_area_cel) iicel = index_area_cel(kk,1); jjcel = index_area_cel(kk,2); left = xgrid(iicel); right = xgrid(iicel+1); bottom = ygrid(jjcel); top = ygrid(jjcel+1); xx = [left left right right]; yy = [bottom top top bottom]; fill(xx, yy, 'y'); end end xpf = -2:0.001:2; xpg = 0:0.001:3; yf = @(x) sqrt(8*(1-(x.^2)/4)); yg = @(x) x.^(-1); if (flag_stochastic == 1) handle1 = plot( xsample,ysample,'*k'); set(handle1,'MarkerSize',3) end % vertical line --> (funciona somente no MATLAB) %hx = graph2d.constantline(0, 'Color',[1 0 0],'LineWidth',2); %changedependvar(hx,'x'); % horizontal line --> (funciona somente no MATLAB) %hy = graph2d.constantline(0, 'Color',[1 0 0],'LineWidth',2); %changedependvar(hy,'y'); handle2 = plot( xpf,yf(xpf),'-g'); set(handle2,'LineWidth',3) handle3 = plot( xpg,yg(xpg),'-m'); set(handle3,'LineWidth',3) axis ([-3.0 3.0 -2.0 4.0]) axis square return end