On 7/20/2012 4:56 AM, Jeremy Sanders wrote:
On 20/07/12 10:20, Paul Cardinaels wrote:
Hi all,
I have been using Veusz for some years now and it has always helped me
in producing high quality graphs for my reports.
Now that I have started my graduation project in fluid dynamics I have
come across some problems that depend on the error function:
http://en.wikipedia.org/wiki/Error_function
Is there a quick/easy way to use it in Veusz? I can't seem to find it.
If you're using Veusz from source (or in a linux distribution), you can
get it from scipy if you have scipy installed (import from scipy.special
in the custom definitions dialog). If you're using the binary
distribution, there are some hacks to get veusz to see an installed
version of scipy (I can provide some hints if you're interested).
There's a simpler alternative, which is to use a python module to
compute erf (to some precision). Here's some code, adapted from
http://stackoverflow.com/questions/457408/is-there-an-easily-available-implementation-of-erf-for-python
It seems to work for me (check, please!). Put it in a .py file. Go to
the custom definition dialog, add a custom import. The problem might be
that veusz can't find this file and you need to set the PYTHONPATH
environment variable to find it. I should add an option to allow
explicit paths to be included, or to set PYTHONPATH. You can set it to
be loaded automatically in the options dialog with a custom definitions
file.
I think it could be compressed to one line and entered as a function
instead, if anyone feels like rewriting it.
Jeremy
-----------------------------------
import numpy as np
def erf(x):
# save the sign of x
sign = np.sign(x)
sign[ sign == 0 ] = 1
x = np.abs(x)
# constants
a1 = 0.254829592
a2 = -0.284496736
a3 = 1.421413741
a4 = -1.453152027
a5 = 1.061405429
p = 0.3275911
# A&S formula 7.1.26
t = 1.0/(1.0 + p*x)
y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*np.exp(-x*x)
return sign*y # erf(-x) = -erf(x)
Here's a one-liner form I've used occasionally (derived, ultimately,
from Numerical Recipes chapter 6.2):
AddCustom(u'function', u'erf(z)', u'([1 - t * exp( -z*z - 1.26551223 +
t * ( 1.00002368 + t * ( 0.37409196 + t * ( 0.09678418 + t *
(-0.18628806 + t * ( 0.27886807 + t * (-1.13520398 + t * ( 1.48851587
+ t * (-0.82215223 + t * ( 0.17087277)))))))))) for t in (1.0 / (1.0 +
0.5 * abs(z)),)])[0] * (2*(z >= 0) - 1)')
Regards,
-- BKS
_______________________________________________
Veusz-discuss mailing list
Veusz-discuss@gna.org
https://mail.gna.org/listinfo/veusz-discuss