Why is My C++ Program for the Bateman Equation Returning NAN?

  • Context: C/C++ 
  • Thread starter Thread starter lapo3399
  • Start date Start date
  • Tags Tags
    C++
Click For Summary
SUMMARY

The forum discussion centers on a C++ program designed to evaluate the Bateman equation for radioactive decay series. The primary issue identified was the program returning NAN for the mass remaining after 1 million years, attributed to incorrect loop conditions and a break statement in the summation loop. The user resolved the issue by adjusting the loop condition to "i < (iter - 1)" and removing the break statement, which allowed for proper calculation of decay constants. The program reads decay constants from a text file, and the user sought assistance in debugging the code.

PREREQUISITES
  • C++ programming fundamentals
  • Understanding of radioactive decay and the Bateman equation
  • File I/O operations in C++
  • Mathematical functions in C++ (e.g., exp function)
NEXT STEPS
  • Review C++ array handling and bounds checking
  • Learn about debugging techniques in C++ using print statements
  • Study the Bateman equation and its applications in nuclear physics
  • Explore advanced C++ features for error handling and input validation
USEFUL FOR

C++ developers, students studying nuclear physics, and anyone interested in implementing mathematical models for radioactive decay calculations.

lapo3399
Messages
53
Reaction score
0
Hello,

I am attempting to create a program that will evaluate the Bateman equation for radiactive decay series, given several decay constants stored in a text file. I am not sure where this is going wrong, but no matter what chain member I enter in as the desired nuclide to find the mass remaining after 1 million years, it outputs NAN - even when I choose the nuclide that I am certain to have a perceivable value. The equation I am emulating later in the program is shown below, please help to explain why this is not working! All help is appreciated!

http://img515.imageshack.us/img515/5097/screenshotml6.jpg

Code:
#include <iostream>
#include <math.h>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char** argv)
{
	string line; //for file input
	int iter; //stores which nuclide will be calculated for
	
	double dcs[23]; //array for decay constants
	int anum = 1; //counting var
	
	ifstream deconst;
	deconst.open ("decayconstants.txt", ios::in); //file with decay constants
	if (deconst.is_open())
	{
		while (! deconst.eof())
		{
			getline(deconst, line);
			dcs[anum]=strtod(line.c_str(), NULL); //store as double in decay constant array
			anum++;	
		}
		
	}
	
	std::cout << "What nuclide in the chain should be evaluated?";
	std::cin >> iter;
	
        //I separated the equation into multiple parts

	double consts=1; //part one: the multiplied decay constants at the beginning of the equation
	double init = 100; //the intial mass, N(O)
	double time = 1000000; //the variable t, one million years
	double sum=0; // the second half of the equation, the summation
	double totalmass; //the product of consts,init, and sum
		
	for (int i = 1; i < iter; i++)
	{
		consts=consts*dcs[i]; //multiply all the necessary decay constants 
	}
	
	for (int q = 1; q < iter; q++) //the summation
	{
		double expo = exp(-dcs[q]*time); //determine the numerator in the summation
		double denom = 1;
		 
		for (int w = 1; w < iter; w++) //the product
		{
			if (w==iter) //k can't be j
			{
				break;
			}
			else 
			{
				denom = denom * (dcs[w]-dcs[q]); //multiply together to get the product
			}
			
		}
		
		sum = sum + (expo/denom); //add up all of the summations
		
	}
	
	totalmass = sum*consts*init;

	std::cout << totalmass;
	
	return 0;
}

Thanks again!
 
Last edited by a moderator:
Technology news on Phys.org
Well, I can't run your program without the file it needs to read, but I'd suggest putting some count statements throughout the code to print out the intermediate values.

- Warren
 
I've attempted that, and I finally realized what the problems where this morning. Firstly, the first for loop should read "i<(iter-1)", and I shouldn't have included the break statement in the other for loop.
 
Hi,
I see that you said your program worked. I am working with a few students to develope a detector but i also needed them to study the decan chains of Radon. I think your program will be useful, do you think i could get a copy of it?
 
have you checked all of the values prior to use?
If so, are you trying to calculate a null with an int/double?
 
Hi,
would it be possible to get a copy of the source code?
 

Similar threads

  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 13 ·
Replies
13
Views
2K
Replies
1
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
4K