Python Programming the error function (erf) in Python

Click For Summary
The discussion revolves around issues faced while implementing a program to calculate the error function (erf) in Python, specifically using a Maclaurin series. The user is encountering divergence in their calculations, leading to unexpectedly large results. Key points include the need to verify the starting index for the series, which should be 0, and the importance of ensuring proper float handling in Python 2.x to avoid integer division errors. The correctness of the Maclaurin series as described on Wikipedia is affirmed, and it's noted that Python has built-in functions for erf and erfc that have been available since 2003. The conversation emphasizes best practices in programming, suggesting that using established libraries is preferable to creating custom implementations unless for educational purposes.
Tiiba
Messages
53
Reaction score
0
I'm having very unusual problems posting in the math forum.

I am trying to write a program that would calculate phi, the CDF of the standard normal curve, in Python. I tried calculating the erf using a series to do it, as described by Wikipedia. But mine diverges, when it should approach 1.

PHP:
def erfterm(x, n):
   num = (-1.0)**n * x**(2*n+1)
   denum = fact(n) * (2*n+1)
   return num/denum
   
def erf(x):
   #By Maclaurin series
   def term(n):
      num = (-1.0)**n * x**(2*n+1)
      denum = fact(n) * (2*n+1)
      return num/denum
   return sum([erfterm(x, i) for i in range(25)]) *(2 * sqrt(pi))

Something seems to be wrong with erfterm, because it's giving very large results. What gives? Is the equation at Wikipedia wrong? Or did I copy it wrong? Or is my computer wrong?
 
Technology news on Phys.org
Does n start at 0 or 1? If 1 then the series would start 2(1)+1 and one misses the first term 2(0)+1. One has to take enough terms.

By the time x gets out to 2 or -2, the erf(x) should be nearly 1.

In the last line (2 * sqrt(pi)) should be (2 / sqrt(pi)), but that's only a factor and would not contribute to divergence.

One could debug by writing out the successive terms.

The Maclaurin series on Wikipedia is correct. Confirm with
http://mathworld.wolfram.com/Erf.html
 
Also be careful, python 2.x does not autmatically promote floats.
So 2 * sqrt() will give an integer answer, you need to write 2.0 * sqrt().
 
If it's erf-ing for learning programming, go for it. :)

But, erf() and erfc() have been available for python since 2003 at least. AFAIK. Other than as a fun exercise, why are you re-inventing the wheel? If this were going to be production code and I was involved in the project, I would insist that you use a widely tested implementation of something rather than a roll-your-own. It's called best practice.
 
Astronuc said:
Does n start at 0 or 1?

0

mgb_phys said:
Also be careful, python 2.x does not autmatically promote floats.

Mine does. Always did.

jim mcnamara said:
But, erf() and erfc() have been available for python since 2003 at least.

http://docs.python.org/lib/module-math.html"
 
Last edited by a moderator:
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 34 ·
2
Replies
34
Views
5K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 28 ·
Replies
28
Views
4K
  • · Replies 10 ·
Replies
10
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 15 ·
Replies
15
Views
2K
Replies
55
Views
6K
  • · Replies 9 ·
Replies
9
Views
3K
  • · Replies 7 ·
Replies
7
Views
5K
  • · Replies 5 ·
Replies
5
Views
4K