Answer for Final Exam Part 2

The critical coupling strength was estimated by examining the plot of Rasy(30) vs K in the graph below.  It was around the expected value of 2.  The shape of the function is compared to sqrt(K-2) and proved to match closely. 

#include <iostream>
#include <math.h>
const int pi = acos(-1);
int main(int argc, char* argv[])
{
	const double K_MIN = 1;
	const double K_MAX =5;
	const double K_INC = 0.01;
	double k;
	const double T_MAX = 30;
	const double T_INC = 0.01;
	double t =0;
	double h = T_INC;
	double h2= h/2, h6 = h/6;
	double sinV, cosV;
	const int N = 10000;
	const int w0 = 2;
	int i;
	double w[N], theta_rand[N], theta[N], dydt[N], thetaMid[N], thetaMidDeriv[N], thetaMidDeriv2[N], theta1Deriv[N];
	
	for (k = K_MIN; k < K_MAX; k+=K_INC)
	{
		double r, psi=0;
		double kr = k*r;
		t = 0;
		//generate lorentzian distribution for initial omega's
		//and set the initial phase's to be a random distribution form 0 to 2pi
		//calculate the inital time derivative of theta (dydt)
		for (i = 0; i < N; i++)
		{
			//cout << i << "\t" << 2+ tan(pi*(((double)rand())/RAND_MAX - 0.5)) << endl; 
			w[i] = w0+ tan(pi*(((double)rand())/RAND_MAX - 0.5)) ;
			theta[i] = 2*pi*(((double)rand())/RAND_MAX);
		}
		//perform rk4 approximation 
		do
		{
			//calculate the mean radius and angle of the oscillators
			for (i=0, psi=0, sinV=0, cosV=0;i<N;i++)
			{
				psi += theta[i];
				sinV += sin(theta[i]);
				cosV += cos(theta[i]);
			}
			r = sqrt(sinV*sinV + cosV*cosV)/N;
			psi /= N;
			kr = k*r;
			//estimate theta at time t+h/2 from derivative at time t
			for (i=0; i < N; i++)
			{
				//calculate initial dydt (y = theta)
				dydt[i] = w[i] + kr*sin(psi - theta[i]);
				//calculate theta at the midpoint using initial dydt
				thetaMid[i] = theta[i] + h2*dydt[i];
				//calculate derivative at time t+h/2
				thetaMidDeriv[i] =  w[i] +kr*sin(psi-thetaMid[i]);
				//calculate 2nd thetaMid from thetaMidDeriv
				thetaMid[i] = theta[i] + h2*thetaMidDeriv[i];
				//calculate new thetaMidDeriv using thetaMid calculated by first approximation at time t+h/2
				thetaMidDeriv2[i] =  w[i] + kr*sin(psi - thetaMid[i]);
				//calculate final theta at t+h using 2nd thetaMidDeriv2
				thetaMid[i] = theta[i] + h*thetaMidDeriv2[i];
				//calculate derivative at time t+h
				theta1Deriv[i] =  w[i] + kr*sin(psi - thetaMid[i]);
			
				//use rk4 to estimate the final theta using a  linear combination of previous calculations
				theta[i] += h6*(dydt[i] + 2*thetaMidDeriv[i] + 2*thetaMidDeriv2[i] + theta1Deriv[i]);
			}
			//plot the convergence of phase magnitude r versus time for a given k
			//calculate the mean radius of the phase
			//cout << "\t" << k << "\t" << t << "\t" << r << "\t" << psi << endl;
		} while ((t += T_INC) < T_MAX);
		//calculate the mean radius of the phase
		cout << k << "\t" << r << endl;
	}
	return 0;
}