Tanh-sinh quadrature(The Double Exponential Formulas)

2023-10-08 22:30

本文主要是介绍Tanh-sinh quadrature(The Double Exponential Formulas),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tanh-sinh quadrature(The Double Exponential Formulas for Numerical Integration)

见维基百科
https://en.m.wikipedia.org/wiki/Tanh-sinh_quadrature

见Tanh-sinh quadrature numerical integration method converging to wrong value
https://www.e-learn.cn/topic/2848897

见Stackoverflow
https://stackoverflow.com/questions/24986588/tanh-sinh-quadrature-numerical-integration-method-converging-to-wrong-value

参考文献
<T Hidetosi,M Masatake, Double Exponential Formulas for Numerical Integration,DOI:10.2977/prims/1195192451>

参考文献
<TakuyaOoura, An IMT-type quadrature formula with the same asymptotic performance as the DE formula,DOI:10.1016/j.cam.2007.01.002>

测试如下(采用Python高精度浮点算法包 mpmath)

# -*- coding: utf-8 -*-
"""
Created on Fri Oct 22 20:14:43 2021I=Int_{a}^{b} f(z)dz其中a<b为任意实数,z属于[a,b]为任意区间首先将区间[a,b]变换到 t属于 [-1,1]z=(b-a)*t/2 +(b+a)/2则I=((b-a)/2)*Int_{-1}^{1} g(t)dt其中g(t)=f((b-a)*t/2 +(b+a)/2)采用双指数数值积分或Tanh-sinh 数值积分现将积分区间变换到[-inf,inf],则t=tanh((pi/2)*sinh(nh))w=cosh(nh)/cosh((pi/2)*sinh(nh))**2I_h=h*pi/2*sum_{n=-N}^{N} f(t)*w具体可以参考文献<T Hidetosi,M Masatake, Double Exponential Formulas for Numerical          Integration,DOI:10.2977/prims/1195192451>"""
from mpmath import mp,mpf,cosh,sinh,pi,tanh,sqrt
if(1):mp.dps = 100h = mpf(2**-12);#def weights(k):num = mpf(0.5)*h*pi*cosh(k*h)den = cosh(mpf(0.5)*pi*sinh(k*h))**2return (num/den)def abscissas(k,a,b):f=((b-a)/2)*(tanh(mpf(0.5)*pi*sinh(k*h)))+(b+a)/2return fdef f(x):return 1/sqrt(1 - mpf(x)**2)N = 20000#通过作线性变换,求任意区间的数值积分a=0b=1result = 0for k in range(-N, N+1):result = result + weights(k)*f(abscissas(k,a,b))*(b-a)/2print(result)print(result - pi)
'''```
#可以发现对N的要求很高,且很慢
#N=20000
3.141592653589793238462643383279502884197169395623305210054471789091557055855748154170301951289498386
-3.751800610920472803216259350430460844457732874052618682441090144344372471319795201134275503228835472e-45
#N=2000
1.449489205637340355829215405535223522203982454439832629403540056142008755610237611478998353099179717
-1.692103447952452882633427977744279361993186944935273191571404536165807650675971387149036472242937351#N=200
0.1536915064631849189177884604412165536645462018136925450754802115004847789524209471365251505235660057
-2.987901147126608319544854922838286330532623197561413275899464380807331627333788051491509674818551062
'''

这篇关于Tanh-sinh quadrature(The Double Exponential Formulas)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/168397

相关文章

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

【matlab】double和single类型

看到博客(这里)中说,在matlab中, 当数据比较大时,运算起来就困难了,有时候还会out of memory。原因是默认情况下matlab用double存储数据。而double数据类型占8个字节,single类型占4个字节。把数据类型从double类型转换成single类型可以节省一半的空间。(如果怀疑可以用whos指令查看)。本来很有道理的,但是看到有人说(比如这里):Th

java基本数据类型 以及 double float 二进制表示方法

Java 基本数据类型分为4类:整型,浮点型,字符型,布尔型。 整数类型: 关键字占用字节数byte1short2int4long8 每个类型的取值范围,我们以int 为例,4个字节是32位。 第一位是符号位,那么最大表示的正整数为:2^31 =‭2,147,483,648‬ byte 占用1字节 8位,最大的正整数为2^7 = 128 浮点型数据: 浮点数据类型分为两种:单精度浮

深度学习-激活函数:饱和激活函数【Sigmoid、tanh】、非饱和激活函数【ReLU、Leaky ReLU、RReLU、PReLU、ELU、Maxout】

深度学习-激活函数:饱和激活函数【Sigmoid、tanh】、非饱和激活函数【ReLU、Leaky ReLU、RReLU、PReLU、ELU、Maxout】 一、激活函数的定义:二、激活函数的用途1、无激活函数的神经网络2、带激活函数的神经网络 三、饱和激活函数与非饱和激活函数1、饱和激活函数2、非饱和激活函数 四、激活函数的种类1、Sigmoid函数2、TanH函数3、ReLU(Recti

float 或 double 运算的时候会有精度丢失的风险?

《阿里巴巴 Java 开发手册》中提到:“浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断”。“为了避免精度丢失,可以使用 BigDecimal 来进行浮点数的运算”。 浮点数的运算竟然还会有精度丢失的风险吗?确实会! 示例代码: float a = 2.0f - 1.9f;float b = 1.8f - 1.7f;System.out.

Educational Codeforces Round 1C. Nearest vectors(极角排序+long double 精度)

题目链接 题意:给你一堆的向量,问你向量之间的夹角最小的是那一对。 解法:极角排序,然后枚举相邻的一对就可以啦,但是坑爹的是double精度不够,使用long double 读入使用cin。。。 #include<bits/stdc++.h>using namespace std;#define LL long long#define pb push_back#define X f

double free

double free 内存问题 标签: stringbuffer多线程list语言c 2010-05-20 10:42  10963人阅读  评论(0)  收藏  举报   分类: C/C++(32)  double free 2008年06月02日 星期一 11:43 *** glibc detected *** free(): invalid

若干个数 以“字符串形式‘从键盘输入,将其转换为 double 型,并求平均数

/* 若干个数 以“字符串形式‘从键盘输入,将其转换为 double 型,并求平均数 */ import java.util.Scanner; public class Test_Exp1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.

c++ free(): double free detected in tcache 2

pInter->SetHdRegisterEndTakePhotoCb(std::bind(&FpvAerialMappingCtrlModule_Impl::CameraDeviceResultCb,this, std::placeholders::_1)); 运行这行代码报此错误,因有返回值的函数结束时没有写 return 语句导致。排查了很久才发现,加上 return 语句问题解决