x=-.75:.5:1.75;
y=.25:.5:1.75;
[X,Y]=meshgrid(x,y);
Z=cos(X.^2)+cos(X.*Y.^2);Los valores de esta matriz Z son las terceras componentes de los puntos azules de la siguiente figura
.25*sum(Z(:))El resultado de ejecutar todas las líneas que hemos ido escribiendo:
x=-.75:.5:1.75; % abscisas de los puntos medios y=.25:.5:1.75; % ordenadas de los puntos medios [X,Y]=meshgrid(x,y); % malla de puntos medios Z=cos(X.^2)+cos(X.*Y.^2); % valores de la función en los puntos medios .25*sum(Z(:)) % suma de Riemannes $5.7963$. Este valor es la suma de los 'volúmenes' (con signo negativo si la tercera componente del punto azul es negativa):
syms xs ys % declaramos xs e ys como variables simbólicas double(int(int(cos(xs^2)+cos(xs*ys^2),xs,-1,2),ys,0,2)) % cálculo de las dos integrales iteradasel valor obtenido así es $5.8049$. Este valor es el 'volumen' que queda entre la gráfica de $z=f(x,y)$ en $R$ y el plano $z=0$, entendiendo que lo que aporta la parte que está en $z<0$ es un número negativo:
function s=intdobleaprox(n,m)
h=[3 2]./[n m];
x=-1+h(1)/2:h(1):2-h(1)/2;
y=h(2)/2:h(2):2-h(2)/2;
[X,Y]=meshgrid(x,y); Z=cos(X.^2)+cos(X.*Y.^2);
s=prod(h)*sum(Z(:)); endEscritas todas las líneas seguidas resulta
function s=intdobleaprox(n,m) % declaración de función h=[3 2]./[n m]; % cálculo de los incrementos x=-1+h(1)/2:h(1):2-h(1)/2; % abscisas de los puntos medios y=h(2)/2:h(2):2-h(2)/2; % ordenadas de los puntos medio [X,Y]=meshgrid(x,y); % malla de puntos medios Z=cos(X.^2)+cos(X.*Y.^2); % valores de f sobre la malla s=prod(h)*sum(Z(:)); % suma de Riemann end % fin de la funciónSi en la ventana de comandos ejecutamos
>> s=intdobleaprox(12,8)obtendremos $s= 5.8045$, que se aproxima más al valor obtenido en simbólico.
function s=intdobleaprox(a,b,c,d,n,m) % declaración de función h=[b-a d-c]./[n m]; % cálculo de los incrementos x=a+h(1)/2:h(1):b-h(1)/2; % abscisas de los puntos medios y=c+h(2)/2:h(2):d-h(2)/2; % ordenadas de los puntos medio [X,Y]=meshgrid(x,y); % malla de puntos medios Z=cos(X.^2)+cos(X.*Y.^2); % valores de f sobre la malla s=prod(h)*sum(Z(:)); % suma de Riemann end % fin de la función
function [s, dif]=intdobleaprox(a,b,c,d,n,m)
syms xs ys intex=double(int(int(cos(xs^2)+cos(xs*ys^2),xs,a,b),ys,c,d)) dif=abs(s-intex);
function [s, dif]=intdobleaprox(a,b,c,d,n,m) % declaración de función h=[b-a d-c]./[n m]; % cálculo de los incrementos x=a+h(1)/2:h(1):b-h(1)/2; % abscisas de los puntos medios y=c+h(2)/2:h(2):d-h(2)/2; % ordenadas de los puntos medio [X,Y]=meshgrid(x,y); % malla de puntos medios Z=cos(X.^2)+cos(X.*Y.^2); % valores de f sobre la malla s=prod(h)*sum(Z(:)); % suma de Riemann syms xs ys % declaramos xs e ys como variables simbólicas intex=double(int(int(cos(xs^2)+cos(xs*ys^2),xs,a,b),ys,c,d)) % cálculo de las dos integrales iteradas dif=abs(s-intex); % cálculo de la diferencia end % fin de la función
function s=intdobleaprox(f,a,b,c,d,n,m)Las líneas de preparación de la malla permanecerán igual, y sólo habrá que modificar la línea en la que se evalua la función sobre la malla, para lo cual hay que vectorizarla previamente:
f=vectorize(inline(f)); Z=f(X,Y);La función completa será:
function s=intdobleaprox(f,a,b,c,d,n,m) % declaración de función h=[b-a d-c]./[n m]; % cálculo de los incrementos x=a+h(1)/2:h(1):b-h(1)/2; % abscisas de los puntos medios y=c+h(2)/2:h(2):d-h(2)/2; % ordenadas de los puntos medio [X,Y]=meshgrid(x,y); % malla de puntos medios f=vectorize(inline(f)); % se vectoriza la función Z=f(X,Y); % valores de f sobre la malla s=prod(h)*sum(Z(:)); % suma de Riemann end % fin de la funciónSi ahora ejecutamos, desde la ventana de comandos,
s=intdobleaprox('x*y',-1,2,0,2,20,10)el programa nos devolverá $3.000$, que es el valor de la suma de Riemann para $z=xy$ en el rectángulo $R=[-1,2]\times[0,2]$ con una partición de $20\times10$ rectángulos, evaluando la función en los puntos medios de cada subrectángulo.
function [s,dif]=intdobleaprox(f,a,b,c,d,n,m)y para que pueda evaluar la función sobre los puntos de la malla, antes de vectorizar hemos de pasarla a tipo carácter:
f=vectorize(inline(char(f))); Z=f(X,Y);Así, el programa resultaría
function [s,dif]=intdobleaprox(f,a,b,c,d,n,m)% declaración de función syms xs ys % declaramos xs e ys como variables simbólicas intex=double(int(int(f,xs,a,b),ys,c,d))% cálculo de las dos integrales iteradas h=[b-a d-c]./[n m]; % cálculo de los incrementos x=a+h(1)/2:h(1):b-h(1)/2; % abscisas de los puntos medios y=c+h(2)/2:h(2):d-h(2)/2; % ordenadas de los puntos medio [X,Y]=meshgrid(x,y); % malla de puntos medios f=vectorize(inline(char(f)));% se vectoriza la función Z=f(X,Y); % valores de f sobre la malla s=prod(h)*sum(Z(:)); % suma de Riemann dif=abs(s-intex); % cálculo de la diferencia end % fin de la función
syms xs ys [s,int]=intdobleaprox(xs*ys,-1,2,0,2,20,10)