Register to reply

Matlab - multiple integral Riemann sums

by mathmannn
Tags: code problem, matlab, multiple integral
Share this thread:
mathmannn
#1
Apr30-12, 01:28 AM
P: 15
1. The problem statement, all variables and given/known data

Write an m.file that will integrate a function [itex]f(x, y)[/itex] on any given rectangle [itex] (a,b)\times(c,d)[/itex] and returns the value of the integral from [itex]a [/itex] to [itex] b [/itex] and [itex]c [/itex] to [itex]d [/itex] of the function [itex]f(x,y) [/itex]. Include error-catching code in the case that the integral diverges. The program should use the notion of a limit of sums, so that you increase the number of Riemann cubes until the approximate value of the integral shows a relative error [itex]\displaystyle \frac{S_{new} - S_{old}}{S_{new}}[/itex] of less than 0.001.


2. Relevant equations



3. The attempt at a solution

Ok so here is what I have right now
 

function [re,risum]=ftc3(f,a,b,c,d,maxit)
% ftc3: Finds the riemann Sum for the function f
% input:
% f = function, a = x lower bound, b = x upper bound
% c = y lower bound, d = y upper bound
% output:
% re = relative error, risum = value of the definite integral

% Note:
%       The 'maxit' input is just something I'm using so 
%       I don't get stuck in a loop.

if nargin<6|isempty(maxit),maxit=100;end
err=1;
s=0;
n=1;
its=0;
fprintf('\nn\t error\t   dx\t   dy\t   dA\t  sum\n\n');
while(1)
    s0=s;
    dx=(b-a)/n;
    dy=(d-c)/n;
    xi=a+dx:dx:b;
    yi=c+dy:dy:d;
    dA=dx*dy;
    s=sum(f(xi,yi))*dA;
    if s>realmax,error('This integral diverges');end
    rerr = abs((s-s0)/s);
% Note:    
%       I'm just using this table so I can see what
%       is going on with my code. It's not needed for the problem
    z=[n;rerr;dx;dy;dA;s];
    fprintf('%d\t %2.4f\t %2.4f\t %2.4f\t %2.4f\t %2.4f\n',z);
    its=its+1;
    n=n+1;
    if rerr<.001|its>=maxit,break,end
    
end
risum=s;
re = rerr;
disp(['Number of iterations ',num2str(its)])
but I can not figure out what is wrong with my code. When I test it using [itex] \int_0^1 \int_0^1 xy \quad dx dy[/itex] which I know should be [itex] \frac{1}{4} [/itex]

This is what it returns (without the table)

EDU>> f=@(x,y) x.*y;a=0;b=1;c=0;d=1;
EDU>> [relative_error,riemann_sum]=ftc3(f,a,b,c,d)
Number of iterations 100

relative_error =

    0.0103


riemann_sum =

    0.0034

Any kind of help would be awesome!
Phys.Org News Partner Science news on Phys.org
Bees able to spot which flowers offer best rewards before landing
Classic Lewis Carroll character inspires new ecological model
When cooperation counts: Researchers find sperm benefit from grouping together in mice
RoshanBBQ
#2
Apr30-12, 06:41 PM
P: 280
http://www.mathworks.com/help/techdoc/ref/dblquad.html
Steely Dan
#3
May3-12, 10:16 PM
P: 317
You have three possible exit conditions for your loop. One is a divergence catch, which isn't an issue here. The second is achieved convergence, and the third is if the number of iterations exceeds the number "itmax." You have set this maximum at 100, and clearly it's taking 100 iterations, which means it hasn't converged because it's reached that limit and not gotten within the desired error yet. I am guessing the reason you don't reach convergence within 100 steps is that you are only increasing [itex]n[/itex] by one each time. Probably a better strategy is to double it with each iteration.


Register to reply

Related Discussions
Theory behind Integral Test with Riemann Sums Calculus & Beyond Homework 3
Definite Integral of the Natural Log of a Quadratic using Riemann Sums Calculus & Beyond Homework 16
Definite integral using Riemann sums? Calculus & Beyond Homework 1
Approximating integral using riemann sums Calculus & Beyond Homework 3
Integral Question (Riemann Sums) Calculus & Beyond Homework 3