Kildekoden til befolknings-simuleringene


import java.applet.Applet;

public class pop extends Applet
{
	int ar = -1, nsft = -1, fsft = -1, rase = -1, bef = -1, iv = -1;
	double N = 0, a = 0, f65 = 0;
	double N_ = 0, a_ = 0, f65_ = 0;
	
	int[] femar = {10,20,40};
	double[] nSFT = {1.7595, 1.9, 2.1};
	double[] fSFT = {2.7, 3.0, 3.5};
	double[] innv = {18.515, 30.0};

	private double tell(double[] x)
	{
		double N = 0;
		for (int i = 0; i < x.length; i++) N += x[i];
		return N;
	}		
	
	private void ga5ar(double[] x, double[] rho, double[] sigma, double[] tau)
	{
			double x0 = 0;
			int i;
			for (i = 0; i < x.length; i++)
				x0 += rho[i]*x[i];
			x0 += tau[0];
		
			for (i = x.length-1; i > 0; i--)
				x[i] = sigma[i-1]*x[i-1] + tau[i];
		
			x[0] = x0;
	}		

    private void regnut()
    {
// Folkemengde i Norge 1. januar 2004. Alle fastboende medregnet.
		double[] x = {290.889, 307.614, 312.033, 279.820, 274.198, 296.691 ,
					  347.179, 351.234 ,323.995, 315.058 ,297.852, 297.571 ,
					  208.964 ,166.011 ,155.689, 143.473 ,117.513 ,63.127 ,28.546};		

// Innvandrer-befolkningen 1. januar 2003. I alt 332 793 personer:		
// Enheten er tusen innbyggere (individer).	
// 5-årige aldersgrupper 0-5 år, 5-10 år osv..	
		double[] x_ = {23.283 , 22.441, 21.124, 20.917, 26.109 ,32.595, 35.630 ,
					  35.118 ,29.979, 22.751 ,17.900 ,14.619,  9.636, 6.808, 
					  5.567, 4.177, 4.139, 0, 0 };
				
// Levendefødte pr. 1000 kvinner i Norge (alle kvinner) i 2002, SFT=1,75:		
		double[] rho = {0,0,0,10.1, 59.5,  121.0 , 109.3 ,44.1, 7.7, 0.2,0,0,0,0,0,
		                0,0,0,0};
		double[] rho_ = {0,0,0,10.1, 59.5,  121.0 , 109.3 ,44.1, 7.7, 0.2,0,0,0,0,0,
		                0,0,0,0};
		
// Døde menn pr. 100 000 middelfolkemengde i ulike aldersgrupper i 2002:
// Dette er rater; man ser på antall døde i løpet av året blant hundre 
// tusen menn i en bestemt aldersgruppe.		
/*		double[] sigma = {86,20,14,65,101,109,116,139,170,251,438,
						  689,1149,2031,3344,5860,9906,17360,29905};*/
// Tilsvarende for menn og kvinner samlet; summen av tallene for de to kjønn:
		double[] sigma = {86  +91, 20 +10, 14 +15 ,65 +27 ,101 +36, 109 +35, 116 +46,
						  139 +62, 170 + 99, 251 +157, 438  +284 ,689  +466 
						  ,1149+ 690 ,2031 +1073, 3344 +1844, 5860 +3377, 9906 +6296,
						  17360+ 12183, 29905 +24696 };
		
		double[] tau = {0,0,0,0,0,0,0,
		                0,0,0,0,0,0,0,0,0,0,0,0,0};
// Netto-innflyttingen av utenlandske statsborgere til Norge i 2002:
// Enheten er tusen innbyggere (individer).		
		double[] tau_ = {1.249 ,1.613, 1.507 ,2.170 ,3.239 ,3.495, 2.220 ,1.346, 
						.770, .406, .240, .069, .067, .028, .056, .020 ,.020, 0, 0 };

// x er total-befolkningen, x_ er innvandrer-befolkningen,
// x - x_ = den norske befolkning.		
		for (int i = 0; i < x.length; i++) x[i] -= x_[i];
		
// SFT = samlet fruktbarhetstall. MFA = midlere fødealder = gjennomsnittlig
// observert fødealder hvis folketallet i alle fødedyktige aldersgrupper
// er like stort.		
		double SFT = 0, MFA = 0;
		for (int i = 0; i < rho.length; i++) 
		{
// Ganger med 2.7/1.75 for å skru SFT fra 1.75 opp til 2.7 uten å endre
// fruktbarhetens aldersfordeling. Ganger med 5 fordi rho i tabellen er oppgitt
// for ett år, mens jeg bruker 5-årige tidsintervaller. Deler med tusen for
// å få antall barn pr. kvinne, og videre med 2 for å få antall barn pr. innbygger.
// Denne raten endres ikke når enheten endres fra innbygger til tusen innbyggere.			
			rho[i] *=  (nSFT[nsft]/1.7595) * 5.0/(2.0*1000);
			rho_[i] *= (fSFT[fsft]/1.7595) * 5.0/(2.0*1000);
			MFA += (5*i + 2.5)* rho[i];
			SFT += rho[i];
		}
		MFA /= SFT;
		SFT *= 2;
		
//		double dode = 0;
		for (int i = 0; i < x.length; i++) 
		{
// Ganger med 0.5 fordi tallene i tabellen er summen av dødelighetsratene for
// menn og kvinner.	Uavhengig av enheten liksom rho.		
			sigma[i] *= 0.5 *5.0/(100*1000);
//			dode += sigma[i]*x[i];
			sigma[i] = 1 - sigma[i];
		}

// NIV = netto innvandring i året.		
		double NIV = 0;
// tau er netto innvandring pr. år, men jeg skal ha for 5 år:		
		for (int i = 0; i < tau_.length; i++)
		{
			NIV += tau_[i];
			tau_[i] *= 5 * innv[iv]/18.515;
		}	
		
		double alfa0 = 1;
		int n;
		for (n = 1; n <= femar[ar]; n++)
		{
			double N = tell(x);
			double N_ = tell(x_);
			double alfa = ( rase == 0 ? 1.0 : N/(N + N_) );
			for (int i = 0; i < rho.length; i++) rho[i] *= alfa/alfa0;
			alfa0 = alfa;
			ga5ar(x,rho,sigma,tau);
			ga5ar(x_,rho_,sigma,tau_);
		}
		
		N = a = f65 = 0;
		N_ = a_ = f65_ = 0;
		N = tell(x);
		N_ = tell(x_);
		for (int i = 13; i < x.length; i++) f65 += x[i];
		f65 /= N;
		for (int i = 13; i < x_.length; i++) f65_ += x_[i];
		f65_ /= N_;
		for (int i = 0; i < x.length; i++) a += (5*i + 2.5) * x[i];
		a *= 1.0/N;
		for (int i = 0; i < x_.length; i++) a_ += (5*i + 2.5) * x_[i];
		a_ *= 1.0/N_;

    }

	private void oppdater(int ar, int nsft, int fsft, int rase, int bef, int iv)
	{
		if (ar != this.ar || nsft != this.nsft || fsft != this.fsft ||
			rase != this.rase || bef != this.bef || iv != this.iv)
		{
			this.ar = ar;
			this.nsft = nsft;
			this.fsft = fsft;
			this.rase = rase;
			this.bef = bef;
			this.iv = iv;
			regnut();
		}
	}

	public double folketall(int ar, int nsft, int fsft, int rase, int bef, int iv)
	{
		oppdater(ar,nsft,fsft,rase,bef,iv);
		if (bef == 0)
			return N;
		else
			return N_;
	}

	public double middelalder(int ar, int nsft, int fsft, int rase, int bef, int iv)
	{
		oppdater(ar,nsft,fsft,rase,bef,iv);
		if (bef == 0)
			return a;
		else
			return a_;
	}

	public double gamle(int ar, int nsft, int fsft, int rase, int bef, int iv)
	{
		oppdater(ar,nsft,fsft,rase,bef,iv);
		if (bef == 0)
			return f65;
		else
			return f65_;
	}
		
}