Code covered by the BSD License  

Highlights from
Gravity

image thumbnail
from Gravity by link2358 noname
Computes position of several bodies under the action of gravitatory forces.

mindist(inibod,inid,dt2,init,inidir,iniv,tol,miter,nplot)
function [mdist,flag] = mindist(inibod,inid,dt2,init,inidir,iniv,tol,miter,nplot)

dbstop if error

global deltat g mass pos2 vel2 nbod ndime nsteps color markersize ...
       xmin xmax ymin ymax

%Computing newmark constants
newm.beta  = 0.25;
newm.gamma = 0.5;
newm.b(1) = 1/(newm.beta*dt2*dt2);
newm.b(2) = -1/(newm.beta*dt2);
newm.b(3) = (1-1/(2*newm.beta));
newm.b(4) = newm.gamma/(newm.beta*dt2);
newm.b(5) = 1-newm.gamma/newm.beta;
newm.b(6) = dt2*(1-newm.gamma/(2*newm.beta));

mdist(1:nbod) = Inf;
if init < deltat; init = deltat; end
inidir = inidir/norm(inidir);
position = recpos(init,deltat,pos2);
velocity = recpos(init,deltat,vel2);
nsteps2 = ceil((nsteps - ceil(init/deltat))*deltat/dt2)-1;

rvelocity = iniv*inidir + velocity(:,inibod);
rposition = inid*inidir + position(:,inibod);
raccelera = zeros(2,1);

iposition = rposition;
iposold = iposition;
vold = rvelocity;
aold = raccelera;
matrix = zeros(ndime,ndime);
force = zeros(ndime,1);

length = max(abs(xmin-xmax),abs(ymin-ymax));
flag = 0;

for istep = 1:nsteps2
    error = 1;
    iiter = 0;
    position = recpos(init+istep*dt2,deltat,pos2);
    while (error > tol && iiter < miter)
        iiter = iiter+1;
        force(:) = 0.0;
        matrix(:,:) = 0.0;
        rhs_vec = -(iposition-rposition)*newm.b(1)-rvelocity*newm.b(2)-raccelera*newm.b(3);
            for idime = 1:ndime
                matrix(idime,idime) = newm.b(1);
                force(idime) = rhs_vec(idime);
            end
            for jbod = 1:nbod
                    vec = position(:,jbod)-iposition(:);
                    dist2 = 0;
                    for idime = 1:ndime
                        dist2 = dist2 + vec(idime)*vec(idime);
                    end
                    for idime = 1:ndime
                        matrix(idime,idime) = matrix(idime,idime) ...
                            + g*mass(jbod)   *dist2^(-3/2);
                        for jdime = 1:ndime
                            matrix(idime,jdime) = matrix(idime,jdime) ...
                                - g*mass(jbod)   *(-3)*vec(idime)*vec(jdime)*dist2^(-5/2);
                        end
                        force(idime) = force(idime) + vec(idime)*g*mass(jbod)/(dist2^1.5);
                    end
            end
        u = matrix\force;
        iposition = iposition+u;
        if (iiter == 1); inirhs = force; end
        error = max(norm(force)/norm(inirhs),norm(iposition-iposold)/norm(iposition-rposition));
        iposold = iposition;
    end
    rvelocity = newm.b(4)*(iposition-rposition) + newm.b(5)*vold + newm.b(6)*aold;
    raccelera = newm.b(1)*(iposition-rposition) + newm.b(2)*vold + newm.b(3)*aold;
    rposition = iposition;
    vold = rvelocity;
    aold = raccelera;
    
    for ibod = 1:nbod
        vec = position(:,ibod)-iposition(:);
        dist2 = 0;
        for idime = 1:ndime
            dist2 = dist2 + vec(idime)*vec(idime);
        end
        mdist(ibod) = min(mdist(ibod),dist2);
        if mdist(ibod) < 1e-6*length
            flag = ibod;
            return
        end
    end
    
    if (rem(istep,nplot) == 0)
        clf
        axis([xmin, xmax, ymin, ymax])
        axis off
        %axis equal
        hold on
        for ibod = 1:nbod
            plot(position(1,ibod),position(2,ibod),'-mo',...
                'LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor',color(:,ibod),...
                'MarkerSize',markersize(ibod));
            hold on
        end
        rcol = [0 0 0];
        rsize = 4;
        plot(rposition(1),rposition(2),'-mo',...
            'LineWidth',2,...
            'MarkerEdgeColor','k',...
            'MarkerFaceColor',rcol,...
            'MarkerSize',rsize);
        hold on
        pause(0.001)
    end
end


Contact us at files@mathworks.com