I solved the following "coupled" ODE numerically, whit forward Euler scheme: $$ \frac{\text{d}N_a}{\text{d}t} = -\frac{N_a}{\tau_a} $$ $$ \frac{\text{d}N_b}{\text{d}t} = \frac{N_a}{\tau_a}-\frac{N_b}{\tau_b} $$
This is the result of my program with $\tau_a = \tau_b = 1$ and $N_a(0) = N_b(0) = 1000$ (image): http://s11.postimage.org/ci5r60g1d/decay.jpg
It is the correct behaviour (my simulation is correct)?
C++ code:
/* R. M.
21.08.2012
Exercice 1.4 of Computational Physics, N. Giordano and H. Nakanishi
Euler method to solve: dN_a/dt = -N_a/tau_a and dN_b/dt = N_a/tau_a - N_b/tau_b
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
void calculate(
std::vector<double>& time,
std::vector<double>& nuclei_a,
std::vector<double>& nuclei_b,
const double t_max,
const double dt,
const double tau_a,
const double tau_b)
{
const int iterations(t_max / dt);
for(int i(1); i < iterations; i++)
{
time.push_back( time[i-1] + dt );
nuclei_a.push_back( nuclei_a[i-1] - nuclei_a[i-1] * dt / tau_a);
nuclei_b.push_back( nuclei_b[i-1] + nuclei_a[i-1] * dt / tau_a - nuclei_b[i-1] * dt / tau_b);
}
}
void save(
const std::vector<double>& time,
const std::vector<double>& nuclei_a,
const std::vector<double>& nuclei_b,
const std::string& filename_a,
const std::string& filename_b)
{
std::ofstream file_out_a(filename_a);
std::ofstream file_out_b(filename_b);
for(int i(0); i < time.size(); i++)
{
file_out_a << time[i] << ' ' << nuclei_a[i] << std::endl;
file_out_b << time[i] << ' ' << nuclei_b[i] << std::endl;
}
file_out_a.close();
file_out_b.close();
}
int main()
{
// Constants
constexpr double t_max(10.); // Time to end simulation
constexpr double dt(0.01); // Time step
constexpr double tau_a(11.); // Decay time constant (A nuclei)
constexpr double tau_b(1.); // Decay time constant (B nuclei)
std::vector<double> time({0.});
std::vector<double> nuclei_a({1000.});
std::vector<double> nuclei_b({1000.});
calculate(time,nuclei_a,nuclei_b,t_max,dt,tau_a,tau_b);
save(time,nuclei_a,nuclei_b,"nuclei_a.dat","nuclei_b.dat");
return 0;
}