⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k1.cpp

📁 强大的C++库
💻 CPP
字号:
/*! * \file  * \brief Implementation of modified Bessel functions of third kind * \author Tony Ottosson * * $Date: 2006-04-03 15:34:15 +0200 (Mon, 03 Apr 2006) $ * $Revision: 400 $ * * ------------------------------------------------------------------------- * * IT++ - C++ library of mathematical, signal processing, speech processing, *        and communications classes and functions * * Copyright (C) 1995-2005  (see AUTHORS file for a list of contributors) * * This program 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. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * ------------------------------------------------------------------------- * * This is slightly modified routine from the Cephes library: * http://www.netlib.org/cephes/  */#include <itpp/base/bessel/bessel_internal.h>#include <itpp/base/itassert.h>#include <cmath>using namespace itpp;/* * Modified Bessel function, third kind, order one (should be second kind?) *  * double x, y, k1(); * * y = k1( x ); * * DESCRIPTION: * * Computes the modified Bessel function of the third kind * of order one of the argument. * * The range is partitioned into the two intervals [0,2] and * (2, infinity).  Chebyshev polynomial expansions are employed * in each interval. * * ACCURACY: * *                      Relative error: * arithmetic   domain     # trials      peak         rms *    IEEE      0, 30       30000       1.2e-15     1.6e-16 * * ERROR MESSAGES: * *   message         condition      value returned * k1 domain          x <= 0          MAXNUM *//* * Modified Bessel function, third kind, order one, exponentially scaled * * SYNOPSIS: * * double x, y, k1e(); * * y = k1e( x ); * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of the third kind of order one of the argument: * *      k1e(x) = exp(x) * k1(x). * * ACCURACY: * *                      Relative error: * arithmetic   domain     # trials      peak         rms *    IEEE      0, 30       30000       7.8e-16     1.2e-16 * See k1(). *//*  Cephes Math Library Release 2.8:  June, 2000  Copyright 1984, 1987, 2000 by Stephen L. Moshier*//* Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) * in the interval [0,2]. *  * lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. */static double A[] ={-7.02386347938628759343E-18,-2.42744985051936593393E-15,-6.66690169419932900609E-13,-1.41148839263352776110E-10,-2.21338763073472585583E-8,-2.43340614156596823496E-6,-1.73028895751305206302E-4,-6.97572385963986435018E-3,-1.22611180822657148235E-1,-3.53155960776544875667E-1, 1.52530022733894777053E0};/* Chebyshev coefficients for exp(x) sqrt(x) K1(x) * in the interval [2,infinity]. * * lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). */static double B[] ={-5.75674448366501715755E-18, 1.79405087314755922667E-17,-5.68946255844285935196E-17, 1.83809354436663880070E-16,-6.05704724837331885336E-16, 2.03870316562433424052E-15,-7.01983709041831346144E-15, 2.47715442448130437068E-14,-8.97670518232499435011E-14, 3.34841966607842919884E-13,-1.28917396095102890680E-12, 5.13963967348173025100E-12,-2.12996783842756842877E-11, 9.21831518760500529508E-11,-4.19035475934189648750E-10, 2.01504975519703286596E-9,-1.03457624656780970260E-8, 5.74108412545004946722E-8,-3.50196060308781257119E-7, 2.40648494783721712015E-6,-1.93619797416608296024E-5, 1.95215518471351631108E-4,-2.85781685962277938680E-3, 1.03923736576817238437E-1, 2.72062619048444266945E0};#define MAXNUM 1.79769313486231570815E308    /* 2**1024*(1-MACHEP) */double k1(double x){  double y, z;  z = 0.5 * x;  if( z <= 0.0 )    {      it_warning("besselk:: argument domain error");      //mtherr( "k1", DOMAIN );      return( MAXNUM );    }  if( x <= 2.0 )    {      y = x * x - 2.0;      y =  log(z) * i1(x)  +  chbevl( y, A, 11 ) / x;      return( y );    }  return(  exp(-x) * chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) );}double k1e(double x){  double y;  if( x <= 0.0 )    {      it_warning("besselk:: argument domain error");      //mtherr( "k1e", DOMAIN );      return( MAXNUM );    }  if( x <= 2.0 )    {      y = x * x - 2.0;      y =  log( 0.5 * x ) * i1(x)  +  chbevl( y, A, 11 ) / x;      return( y * exp(x) );    }  return(  chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -