/* * test_lambertw.sli * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * NEST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NEST. If not, see <http://www.gnu.org/licenses/>. * */ /* BeginDocumentation Name: testsuite::test_lambertw - check if lambertw function works Synopsis: (test_lambertw) run -> some known relations Description: The script tests whether the Lambert W-function [1] provided by the GNU Scientific Library (GSL) [2] fulfills some known relations [3]. In the absence of the GSL NEST uses a simple iterative scheme to compute the Lambert-W function. In this case we apply less strict criteria for the required accuracy. The relationships tested are: (1) the principal branch crosses the origin (2) at -1/e both branches meet athe value W=-1 (3) the principal branch fulfills the "golden ratio" of exponentials (4) the non-principal branch yields the same result as we find by bisectioning for the problem given as an example in the documentation of LambertWm1 with realistic parameters. References: [1] Corless, R. M., Gonnet, G. H., Hare, D. E. G., Jeffrey, D. J., & Knuth, D. E. (1996). On the lambert w function. Advances in Computational Mathematics 5, 329{359. [2] Galassi, M., Davies, J., Theiler, J., Gough, B., Jungman, G., Booth, M., & Rossi, F. (2006). GNU Scientific Library Reference Manual (2nd Ed.). Network Theory Limited. [3] Weisstein, E. W. (1999). CRC Concise Encyclopedia of Mathematics. "Lambert W-Function" Boca Raton, London, New York, Washington D.C.: CRC Press. Author: July 2009, Diesmann SeeAlso: LambertW, LambertW0, LambertWm1, testsuite::test_iaf_psp_peak, testsuite::test_iaf_psp_normalized */ /unittest (6335) require /unittest using M_ERROR setverbosity % (1) % LambertW0 crosses the origin 0. LambertW0 0. eq assert_or_die % (2) % at -1/e the values of both branches coincide with W=-1 statusdict/have_gsl :: { -1. exp neg LambertW0 -1. eq assert_or_die -1. exp neg LambertWm1 -1. eq assert_or_die } { -1. exp neg LambertW0 -1. sub abs 1e-8 lt assert_or_die -1. exp neg LambertWm1 -1. sub abs 1e-8 lt assert_or_die } ifelse % (3) % W(1)=0.567143.. is called the omega constant % or the "golden ratio" of exponentials because of the relation % exp -W(1) == W(1), % see [2] statusdict/have_gsl :: { 1. LambertW0 1. LambertW0 neg exp eq assert_or_die } { 1. LambertW0 1. LambertW0 neg exp sub abs 1e-12 lt assert_or_die } ifelse % (4) % In the example of finding the peak time of the postsynaptic potential (PSP) % generated by an alpha-function shaped current (PSC) the Lambert-W function % is evaluated for the argument -exp(-1/a)/a, where a is the ratio of the % membrane time constant tau_m and the time constant of the alpha-function % tau_syn. The physically meaning full solution leading to a positive peak time % is located on the non-principal branch of the Lambert-W function LambertWm1. % Here, we evaluate LambertWm1 for the argument discussed above with realistic % choices of the parameters. The result is compared with the value obtained by % a simple bisectioning algorithm. 20. /tau_m Set 0.5 /tau_syn Set tau_m tau_syn div /a Set (LambertWm1(-exp(-1./a)/a)) ExecMath [/w] (w*exp(w)+exp(-1./a)/a) Function -10. -1. 1e-11 FindRoot sub abs 1e-9 lt assert_or_die