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

📄 ellint.c

📁 该文件为c++的数学函数库!是一个非常有用的编程工具.它含有各种数学函数,为科学计算、工程应用等程序编写提供方便!
💻 C
📖 第 1 页 / 共 2 页
字号:
/* specfunc/ellint.c *  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman *  * 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., 675 Mass Ave, Cambridge, MA 02139, USA. *//* Author: G. Jungman */#include <config.h>#include <gsl/gsl_math.h>#include <gsl/gsl_errno.h>#include <gsl/gsl_precision.h>#include <gsl/gsl_sf_ellint.h>#include "error.h"/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/inlinestatic double locMAX3(double x, double y, double z){  double xy = GSL_MAX(x, y);  return GSL_MAX(xy, z);}inlinestatic double locMAX4(double x, double y, double z, double w){  double xy  = GSL_MAX(x,  y);  double xyz = GSL_MAX(xy, z);  return GSL_MAX(xyz, w);}/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*//* based on Carlson's algorithms:   [B. C. Carlson Numer. Math. 33, 1 (1979)]      see also:   [B.C. Carlson, Special Functions of Applied Mathematics (1977)] *//* According to Carlson's algorithm, the errtol parameter   typically effects the relative error in the following way:   relative error < 16 errtol^6 / (1 - 2 errtol)     errtol     precision     ------     ----------     0.001       1.0e-17     0.003       2.0e-14      0.01        2.0e-11     0.03        2.0e-8     0.1         2.0e-5*/intgsl_sf_ellint_RC_e(double x, double y, gsl_mode_t mode, gsl_sf_result * result){  const double lolim = 5.0 * GSL_DBL_MIN;  const double uplim = 0.2 * GSL_DBL_MAX;  const gsl_prec_t goal = GSL_MODE_PREC(mode);  const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );  const double prec   = gsl_prec_eps[goal];  if(x < 0.0 || y < 0.0 || x + y < lolim) {    DOMAIN_ERROR(result);  }  else if(GSL_MAX(x, y) < uplim) {     const double c1 = 1.0 / 7.0;    const double c2 = 9.0 / 22.0;    double xn = x;    double yn = y;    double mu, sn, lamda, s;    while(1) {      mu = (xn + yn + yn) / 3.0;      sn = (yn + mu) / mu - 2.0;      if (fabs(sn) < errtol) break;      lamda = 2.0 * sqrt(xn) * sqrt(yn) + yn;      xn = (xn + lamda) * 0.25;      yn = (yn + lamda) * 0.25;    }    s = sn * sn * (0.3 + sn * (c1 + sn * (0.375 + sn * c2)));    result->val = (1.0 + s) / sqrt(mu);    result->err = prec * fabs(result->val);    return GSL_SUCCESS;  }  else {    DOMAIN_ERROR(result);  }}intgsl_sf_ellint_RD_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result){  const gsl_prec_t goal = GSL_MODE_PREC(mode);  const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );  const double prec   = gsl_prec_eps[goal];  const double lolim = 2.0/pow(GSL_DBL_MAX, 2.0/3.0);  const double uplim = pow(0.1*errtol/GSL_DBL_MIN, 2.0/3.0);  if(GSL_MIN(x,y) < 0.0 || GSL_MIN(x+y,z) < lolim) {    DOMAIN_ERROR(result);  }  else if(locMAX3(x,y,z) < uplim) {    const double c1 = 3.0 / 14.0;    const double c2 = 1.0 /  6.0;    const double c3 = 9.0 / 22.0;    const double c4 = 3.0 / 26.0;    double xn = x;    double yn = y;    double zn = z;    double sigma  = 0.0;    double power4 = 1.0;    double ea, eb, ec, ed, ef, s1, s2;    double mu, xndev, yndev, zndev;    while(1) {      double xnroot, ynroot, znroot, lamda;      double epslon;      mu = (xn + yn + 3.0 * zn) * 0.2;      xndev = (mu - xn) / mu;      yndev = (mu - yn) / mu;      zndev = (mu - zn) / mu;      epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));      if (epslon < errtol) break;      xnroot = sqrt(xn);      ynroot = sqrt(yn);      znroot = sqrt(zn);      lamda = xnroot * (ynroot + znroot) + ynroot * znroot;      sigma  += power4 / (znroot * (zn + lamda));      power4 *= 0.25;      xn = (xn + lamda) * 0.25;      yn = (yn + lamda) * 0.25;      zn = (zn + lamda) * 0.25;    }    ea = xndev * yndev;    eb = zndev * zndev;    ec = ea - eb;    ed = ea - 6.0 * eb;    ef = ed + ec + ec;    s1 = ed * (- c1 + 0.25 * c3 * ed - 1.5 * c4 * zndev * ef);    s2 = zndev * (c2 * ef + zndev * (- c3 * ec + zndev * c4 * ea));    result->val = 3.0 * sigma + power4 * (1.0 + s1 + s2) / (mu * sqrt(mu));    result->err = prec * fabs(result->val);    return GSL_SUCCESS;  }  else {    DOMAIN_ERROR(result);  }}intgsl_sf_ellint_RF_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result){  const double lolim = 5.0 * GSL_DBL_MIN;  const double uplim = 0.2 * GSL_DBL_MAX;  const gsl_prec_t goal = GSL_MODE_PREC(mode);  const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );  const double prec   = gsl_prec_eps[goal];  if(x < 0.0 || y < 0.0 || z < 0.0) {    DOMAIN_ERROR(result);  }  else if(x+y < lolim || x+z < lolim || y+z < lolim) {    DOMAIN_ERROR(result);  }  else if(locMAX3(x,y,z) < uplim) {     const double c1 = 1.0 / 24.0;    const double c2 = 3.0 / 44.0;    const double c3 = 1.0 / 14.0;    double xn = x;    double yn = y;    double zn = z;    double mu, xndev, yndev, zndev, e2, e3, s;    while(1) {      double epslon, lamda;      double xnroot, ynroot, znroot;      mu = (xn + yn + zn) / 3.0;      xndev = 2.0 - (mu + xn) / mu;      yndev = 2.0 - (mu + yn) / mu;      zndev = 2.0 - (mu + zn) / mu;      epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));      if (epslon < errtol) break;      xnroot = sqrt(xn);      ynroot = sqrt(yn);      znroot = sqrt(zn);      lamda = xnroot * (ynroot + znroot) + ynroot * znroot;      xn = (xn + lamda) * 0.25;      yn = (yn + lamda) * 0.25;      zn = (zn + lamda) * 0.25;    }    e2 = xndev * yndev - zndev * zndev;    e3 = xndev * yndev * zndev;    s = 1.0 + (c1 * e2 - 0.1 - c2 * e3) * e2 + c3 * e3;    result->val = s / sqrt(mu);    result->err = prec * fabs(result->val);    return GSL_SUCCESS;  }  else {    DOMAIN_ERROR(result);  }}intgsl_sf_ellint_RJ_e(double x, double y, double z, double p, gsl_mode_t mode, gsl_sf_result * result){  const gsl_prec_t goal = GSL_MODE_PREC(mode);  const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );  const double prec   = gsl_prec_eps[goal];  const double lolim =       pow(5.0 * GSL_DBL_MIN, 1.0/3.0);  const double uplim = 0.3 * pow(0.2 * GSL_DBL_MAX, 1.0/3.0);  if(x < 0.0 || y < 0.0 || z < 0.0) {    DOMAIN_ERROR(result);  }  else if(x + y < lolim || x + z < lolim || y + z < lolim || p < lolim) {    DOMAIN_ERROR(result);  }  else if(locMAX4(x,y,z,p) < uplim) {    const double c1 = 3.0 / 14.0;    const double c2 = 1.0 /  3.0;    const double c3 = 3.0 / 22.0;    const double c4 = 3.0 / 26.0;    double xn = x;    double yn = y;    double zn = z;    double pn = p;    double sigma = 0.0;    double power4 = 1.0;    double mu, xndev, yndev, zndev, pndev;    double ea, eb, ec, e2, e3, s1, s2, s3;    while(1) {      double xnroot, ynroot, znroot;

⌨️ 快捷键说明

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