C#,数值计算——不完全 Beta 函数(incomplete beta function)的源代码

news2025/5/14 23:22:38

Incomplete Beta Function


The incomplete beta function (also called the Euler Integral) is a generalized β-function; An independent integral (with integral bounds from 0 to x) replaces the definite integral. The formula is:

Where:

0 ≤ x ≤ 1,
a, b > 0. Note: The definition is sometimes written to include negative integers (e.g. Özçag et al., 2008) but this isn’t commonplace.
B1(p, q) is the (complete) beta function; in other words, the function becomes complete as x = 1. The incomplete beta function can also be expressed in terms of the beta function or three complete gamma functions (DiDonato & Jarnagin, 1972).


beta function expressed as

 

Incomplete Beta-Function Ratio


The ratio of

to

is called the incomplete beta function ratio. Represented by the symbol Ix, it is written as:
Ix (a, b) ≡ Bx(a, b) / B1(a, b).
Where a > 0, b > 0 (DiDonato & Jarnagin, n.d.).

Incomplete Beta Function Uses

The incomplete beta function and Ix crop up in various scientific applications, including atomic physics, fluid dynamics, lattice theory (the study of lattices) and transmission theory (DiDonato & Morris, 1988):

  •     Calculating confidence intervals for t-tests, F-tests (Besset, 2001) and those based on the binomial distribution, where the incomplete beta function is used to calculate the limits (Young et al., 1998),
  •     Computing the probability in a binomial distribution tail (DTIC, 1979),
  •     Creating cumulative probabilities for the standard normal distribution (Klugman, 2013).
  •     Finding a measurement larger than a certain value, for data following a beta distribution.

C# SourceCodes 源代码

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for incomplete beta function.
    /// Gauleg18 provides coefficients for Gauss-Legendre quadrature.
    /// </summary>
    public class Beta : Gauleg18
    {
        private const int SWITCH = 3000;
        private const double EPS = float.Epsilon;
        private const double FPMIN = float.MinValue;// / float.Epsilon;

        public double betai(double a, double b, double x)
        {
            if (a <= 0.0 || b <= 0.0)
            {
                throw new Exception("Bad a or b in routine betai");
            }
            if (x < 0.0 || x > 1.0)
            {
                throw new Exception("Bad x in routine betai");
            }
            //if (x == 0.0 || x == 1.0)
            if (Math.Abs(x) <= float.Epsilon || Math.Abs(x-1.0) <= float.Epsilon)
            {
                return x;
            }
            if (a > SWITCH && b > SWITCH)
            {
                return betaiapprox(a, b, x);
            }
            double bt = Math.Exp(Globals.gammln(a + b) - Globals.gammln(a) - Globals.gammln(b) + a * Math.Log(x) + b * Math.Log(1.0 - x));
            if (x < (a + 1.0) / (a + b + 2.0))
            {
                return bt * betacf(a, b, x) / a;
            }
            else
            {
                return 1.0 - bt * betacf(b, a, 1.0 - x) / b;
            }
        }

        public double betacf(double a, double b, double x)
        {
            double qab = a + b;
            double qap = a + 1.0;
            double qam = a - 1.0;
            double c = 1.0;
            double d = 1.0 - qab * x / qap;
            if (Math.Abs(d) < FPMIN)
            {
                d = FPMIN;
            }
            d = 1.0 / d;
            double h = d;
            for (int m = 1; m < 10000; m++)
            {
                int m2 = 2 * m;
                double aa = m * (b - m) * x / ((qam + m2) * (a + m2));
                d = 1.0 + aa * d;
                if (Math.Abs(d) < FPMIN)
                {
                    d = FPMIN;
                }
                c = 1.0 + aa / c;
                if (Math.Abs(c) < FPMIN)
                {
                    c = FPMIN;
                }
                d = 1.0 / d;
                h *= d * c;
                aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));
                d = 1.0 + aa * d;
                if (Math.Abs(d) < FPMIN)
                {
                    d = FPMIN;
                }
                c = 1.0 + aa / c;
                if (Math.Abs(c) < FPMIN)
                {
                    c = FPMIN;
                }
                d = 1.0 / d;
                double del = d * c;
                h *= del;
                if (Math.Abs(del - 1.0) <= EPS)
                {
                    break;
                }
            }
            return h;
        }

        public double betaiapprox(double a, double b, double x)
        {
            double a1 = a - 1.0;
            double b1 = b - 1.0;
            double mu = a / (a + b);
            double lnmu = Math.Log(mu);
            double lnmuc = Math.Log(1.0 - mu);
            double t = Math.Sqrt(a * b / (Globals.SQR(a + b) * (a + b + 1.0)));
            double xu;
            if (x > a / (a + b))
            {
                if (x >= 1.0)
                {
                    return 1.0;
                }
                xu = Math.Min(1.0, Math.Max(mu + 10.0 * t, x + 5.0 * t));
            }
            else
            {
                if (x <= 0.0)
                {
                    return 0.0;
                }
                xu = Math.Max(0.0, Math.Min(mu - 10.0 * t, x - 5.0 * t));
            }
            double sum = 0;
            for (int j = 0; j < 18; j++)
            {
                t = x + (xu - x) * y[j];
                sum += w[j] * Math.Exp(a1 * (Math.Log(t) - lnmu) + b1 * (Math.Log(1 - t) - lnmuc));
            }
            double ans = sum * (xu - x) * Math.Exp(a1 * lnmu - Globals.gammln(a) + b1 * lnmuc - Globals.gammln(b) + Globals.gammln(a + b));
            return ans > 0.0 ? 1.0 - ans : -ans;
        }

        public double invbetai(double p, double a, double b)
        {
            const double EPS = 1.0e-8;
            double t;
            double u;
            double x;
            double a1 = a - 1.0;
            double b1 = b - 1.0;
            if (p <= 0.0)
            {
                return 0.0;
            }
            else if (p >= 1.0)
            {
                return 1.0;
            }
            else if (a >= 1.0 && b >= 1.0)
            {
                double pp = (p < 0.5) ? p : 1.0 - p;
                t = Math.Sqrt(-2.0 * Math.Log(pp));
                x = (2.30753 + t * 0.27061) / (1.0 + t * (0.99229 + t * 0.04481)) - t;
                if (p < 0.5)
                {
                    x = -x;
                }
                double al = (Globals.SQR(x) - 3.0) / 6.0;
                double h = 2.0 / (1.0 / (2.0 * a - 1.0) + 1.0 / (2.0 * b - 1.0));
                double w = (x * Math.Sqrt(al + h) / h) - (1.0 / (2.0 * b - 1) - 1.0 / (2.0 * a - 1.0)) * (al + 5.0 / 6.0 - 2.0 / (3.0 * h));
                x = a / (a + b * Math.Exp(2.0 * w));
            }
            else
            {
                double lna = Math.Log(a / (a + b));
                double lnb = Math.Log(b / (a + b));
                t = Math.Exp(a * lna) / a;
                u = Math.Exp(b * lnb) / b;
                double w = t + u;
                if (p < t / w)
                {
                    x = Math.Pow(a * w * p, 1.0 / a);
                }
                else
                {
                    x = 1.0 - Math.Pow(b * w * (1.0 - p), 1.0 / b);
                }
            }
            double afac = -Globals.gammln(a) - Globals.gammln(b) + Globals.gammln(a + b);
            for (int j = 0; j < 10; j++)
            {
                //if (x == 0.0 || x == 1.0)
                if (Math.Abs(x) <= float.Epsilon || Math.Abs(x=1.0) <= float.Epsilon)
                {
                    return x;
                }
                double err = betai(a, b, x) - p;
                t = Math.Exp(a1 * Math.Log(x) + b1 * Math.Log(1.0 - x) + afac);
                u = err / t;
                x -= (t = u / (1.0 - 0.5 * Math.Min(1.0, u * (a1 / x - b1 / (1.0 - x)))));
                if (x <= 0.0)
                {
                    x = 0.5 * (x + t);
                }
                if (x >= 1.0)
                {
                    x = 0.5 * (x + t + 1.0);
                }
                if (Math.Abs(t) < EPS * x && j > 0)
                {
                    break;
                }
            }
            return x;
        }

        /// <summary>
        /// Returns the value of the beta function B(z,w).
        /// </summary>
        /// <param name="z"></param>
        /// <param name="w"></param>
        /// <returns></returns>
        public static double beta(double z, double w)
        {
            return Math.Exp(Globals.gammln(z) + Globals.gammln(w) - Globals.gammln(z + w));
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pro白嫖esri数据

最近用Pro比较多,想跟大家谈谈一些关于Pro的 技巧。在谈之前,我想问大家一个问题,你真的了解ArcGIS Pro吗? 我想大多数刚刚接触Pro的用户应该是把Pro当做像Map一样的数据处理分析工具,只是简单的从其他地方下载数据来加入工程进行处理和分析 或许在你眼里的Pro和Map仅有…

在Orangepi上使用raspberry的dashboard

树莓派实验室整了一个比较酷的dashboard&#xff0c;可以用来显示树莓派状态&#xff0c;主要内容是基于js和php来实现&#xff0c;因为orangepi的用户名和密码都是一个套路&#xff0c;首先想到能不能移植。 https://www.rstk.cn/news/860562.html?actiononClick 首先需要做…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时&#xff0c;使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时&#xff0c;如果需要使用了Nodejs&#xff0c;那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里&#xff0c;正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

数据分类分级

数据分类是数据管理的第一步&#xff0c;是数据治理的先行条件。当前&#xff0c;数据应用方兴未艾。“数据”作为新的生产要素资源&#xff0c;支撑供给侧结构性改革、驱动制造业转型升级的作用日益显现&#xff0c;正成为推动质量变革、效率变革、动力变革的新引擎。但与此同…

python3+requests+unittest实战系列【二】

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于管理等&…

ROS中bag的录制、播放和使用

文章目录 前言一、bag录制二、bag信息查看三、bag播放四、bag的使用&#xff08;以A-LOAM为例&#xff09; 前言 传感器获取到的信息&#xff0c;有时我们可能需要实时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0…

Tomcat 基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 三、 目录结构 四、启停 五、配置文件 1. server.xml (1) Server (2) Listener (3) GlobalNamingResources (4) Service 01.Connector (1) port…

硬件故障恢复出文件之后数据库故障处理---惜分飞

客户那边硬件故障(raid损坏磁盘超过了极限,导致raid offline),通过硬件恢复出来数据文件,然后尝试自行恢复,我接手的时候大量数据文件resetlogs scn异常. 重建控制文件报错 WARNING: Default Temporary Tablespace not specified in CREATE DATABASE command Default Tempora…

Git安装详解(写吐了,看完不后悔)

Git 是一个非常流行的分布式版本控制系统&#xff0c;它帮助开发者管理和跟踪项目中的代码变化。通俗地说&#xff0c;可以认为 Git 就像是一个代码的时间机器&#xff0c;它记录了项目从开始到结束的每一次代码变动。 无论你是个人开发者还是团队成员&#xff0c;掌握 Git 都能…

三防平板在工业生产中的物料追溯与供应链管理

科技的不断发展和技术的不断进步&#xff0c;越来越多的企业开始关注物料追溯和供应链管理的重要性。特别是在工业生产中&#xff0c;确保物料的安全性和可追溯性对于提高生产效率和产品质量至关重要。10.1寸三防平板采用新一代英特尔Jasper Lake平台处理器赛扬RN5100&#xff…

SpringBoot2+Vue2实战(十七)vue集成markdown实现多级评论功能

新建数据库表 Article Data TableName("sys_article") public class Article implements Serializable {private static final long serialVersionUID 1L;TableId(value "id", type IdType.AUTO)private Integer id;/*** 标题*/private String name;/…

FreerRTOS(二值信号量和计数型信号量)

什么是信号量&#xff1f; 信号量&#xff08;Semaphore&#xff09;&#xff0c;是在多任务环境下使用的一种机制&#xff0c;是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字&#xff0c;我们可以把它拆分来看&#xff0c;信号可以起到通知信号的作用&…

机器学习 day26(多标签分类,Adam算法,卷积层)

多标签分类 多标签分类&#xff1a;对于单个输入特征&#xff0c;输出多个不同的标签y多类分类&#xff1a;对于单个输入特征&#xff0c;输出单个标签y&#xff0c;但y的可能结果有多个 为多标签分类构建神经网络模型 我们可以构建三个不同的神经网络模型来分别预测三个不…

C++14新特性扫盲探究

闲暇之时&#xff0c;聊到C14&#xff0c;实际上C14相对之前的11并没有太大的改动&#xff0c;或者说更像C11标准基础上的查漏补缺&#xff0c;C14之后&#xff0c;还有17、20甚至23&#xff0c;所以说&#xff0c;C14更像个过渡版本。 下面粗略聊聊C14新特性&#xff1a; 语言…

解决Ubuntu下arm-none-linux-gnueabihf-gcc -v :未找到命令

问题&#xff1a;arm-none-linux-gnueabihf-gcc -v arm-none-linux-gnueabihf-gcc&#xff1a;未找到命令 学习MP135开发板搭建环境之后没gcc不可用&#xff0c;网上找了很多教程都没法解决 解决方法&#xff1a; 1、重启&#xff1a;&#xff08;我试了没用&#xff09; 2、…

Element分页组件自定义样式

样式效果 页面代码 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"page.page":page-sizes"[10, 20, 30, 40]":page-size"page.size"layout"total, sizes, prev, …

计算机网络 day5 子网划分 - IP包 - arp协议

目录 子网划分 为什么需要子网划分&#xff1f; 我们为什么不直接使用一个A类的IP地址给一家2000人的公司使用呢&#xff1f; 子网划分本质 子网划分的步骤&#xff1a; 实验&#xff1a;将192.168.1.0/24 划分为4个小网段 --》192.168.1.0/26 减少的IP地址去哪里了&…

遥感云大数据在灾害、水体与湿地领域案例实践及GPT【洪涝灾害、洪水敏感性和风险模拟、河道轮廓监测、地下水变化、红树林遥感制图】

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

【搜索引擎Solr】Solr:提高批量索引的性能

几个月前&#xff0c;我致力于提高“完整”索引器的性能。我觉得这种改进足以分享这个故事。完整索引器是 Box 从头开始创建搜索索引的过程&#xff0c;从 hbase 表中读取我们所有的文档并将文档插入到 Solr 索引中。 我们根据 id 对索引文档进行分片&#xff0c;同样的文档 id…

第50步 深度学习图像识别:Data-efficient Image Transformers建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Data-efficient Image Transformers Data-efficient Image Transformers (DeiT)是一种用于图像分类的新型模型&#xff0c;由Facebook AI在2020年底提出。这种方法基于视觉Transformer&#xff0c;通过训练策…