量子三体问题: 高精度数值计算、数值积分

目的

三体问题计算中需要高精度积分计算,高精度特征值求解,因此汇总一些现有的高精度数值计算工具和软件。并做些实际计算问题

网络资源

  • 任意精度计算工具库 .最早接触的就是David H. Bailey的高精度计算库,2000年左右就很稳定,此牛对浮点计算研究功力很深,当年GPU仅支持float浮点类型,依据此人方法,用float-float方式模拟了GPU上double计算。
  • DE积分方法,也简称IMT积分方法,是日本学者1974发现的,和Tanh-Sinh积分有异曲同工之妙,对有限区间上平滑函数(在端点处可以有可积奇性)精度很高,matlab程序提供 [ 0 , 1 ] [0,1] [0,1]区间4096点DE积分的位置和权重

计算实例

  • 计算积分: Q = ∫ 0 1 exp ⁡ ( − 1 t − 1 1 − t ) d t = 0.007029858406609656239241270530354 Q=\int_0^1 \exp(-\frac{1}{t}-\frac{1}{1-t})dt=0.007029858406609656239241270530354 Q=01exp(t11t1)dt=0.007029858406609656239241270530354
       %matlab函数vpaintegral计算任意精度积分结果
       syms t x y;
       y=exp(-1/t-1/(1-t);
       %32 digits有效数字
       Q=vpaintegral(y,t,0,1,'RelTol',1e-32,'AbsTol',0);
    
    使用matlab的vpaintegral函数,可以指定计算精度有效位数,vpaintegral不受digits函数影响
  • 计算DE积分公式的积分点和权重(Double Exponetial transformation). 记 φ ( τ ) = 1 Q ∫ 0 τ exp ⁡ ( − 1 t − 1 1 − t ) d t \varphi(\tau)=\frac{1}{Q}\int_0^\tau \exp(-\frac{1}{t}-\frac{1}{1-t})dt φ(τ)=Q10τexp(t11t1)dt, 有积分变换公式: ∫ 0 1 f ( t ) d t = ∫ 0 1 f ( φ ( τ ) ) φ ′ ( τ ) d τ = ∫ 0 1 g ( τ ) d τ , g ( τ ) = f ( φ ( τ ) ) φ ′ ( τ ) \int_0^1f(t)dt=\int_0^1f(\varphi(\tau))\varphi'(\tau)d\tau=\int_0^1g(\tau)d\tau, g(\tau)=f(\varphi(\tau))\varphi'(\tau) 01f(t)dt=01f(φ(τ))φ(τ)dτ=01g(τ)dτ,g(τ)=f(φ(τ))φ(τ)
    g ( x ) g(x) g(x)在积分端点 0 , 1 {0,1} 0,1处无限可微,且任意阶导数为0,采用Trapzoidal积分公式可获高精度积分结果(依据Euler-Maclaurin公式,因 g ( x ) g(x) g(x)在积分端点处的超级平滑性质,Trapzoidal积分公式中的误差项都会消失)。现计算4096个积分点Trapzoidal积分中的位置和权重:
       syms t x y;
       y=exp(-1/t-1/(1-t));
       %32 digits有效数字
       Q=vpaintegral(y,t,0,1,'RelTol',1e-32,'AbsTol',0);  %使用RelTol参数控制有效计算位数
       
       bias=[]; % 积分位置
       ws=[]; %权重
       digits(32); %设置有效位数,注意vpaintegral不受digits函数影响
       
       for k=1:4095
       		t=vpa(k/4096);
       		w=exp(-1/t-1/(1-t))/Q;
       		ws=[ws;w];
       		y=exp(-1/x-1/(1-x))/Q;
       		b=vpaintegral(y,0,t,'RelTol',1e-32, 'AbsTol',0);  %使用RelTol参数控制有效计算位数
       		bias=[bias;b];
       end 
    
    依据4096个点的积分位置和权重,可依次得到2048, 1024, 512等积分点位置和对应权重!
  • 计算函数: U m ( ξ ) = ∫ 0 π cos ⁡ ( m β ) 1 + ξ cos ⁡ β d β , m = 0 , 1 , . . . U_m(\xi)=\int_0^\pi\frac{\cos(m\beta)}{\sqrt{1+\xi\cos\beta}}d\beta, m=0,1,... Um(ξ)=0π1+ξcosβ cos(mβ)dβ,m=0,1,... 此函数出现在三体问题库伦势的矩阵元计算中。其中 ξ \xi ξ 位于 [ 0 , 1 ] [0,1] [0,1]区间, ξ \xi ξ取值对应DE积分公式的积分点位置。给定 { ξ , m } \{\xi, m\} {ξ,m}, 利用vpaintegral计算 U m ( ξ ) U_m(\xi) Um(ξ), 根据 m = { 4 k , 4 k + 1 , 4 k + 2 , 4 k + 3 } m=\{4k,4k+1,4k+2,4k+3\} m={4k,4k+1,4k+2,4k+3}, 可以把积分区间缩小到 { 0 , π / 2 } \{0,\pi/2\} {0,π/2},进而加速计算。

积分精度测试

计算测试积分: ∫ 0 1 c o s ( 10 x ) x d x \int_0^1{\frac{cos(10x)}{\sqrt{x}}dx} 01x cos(10x)dx

  !-----------------------------------------------------
  !matlab,vpaintegral结果
  !   y=cos(10*x)/sqrt(x)
  !   vpaintegral(y,0,1,'RelTol',1e-48,'AbsTol,0)
  !   0.346366232384436488606080435492338630630888057352
  !-----------------------------------------------------

Fortran测试程序

!----------------------------------------
!
!4096个DE(IMT)积分点坐标和对应权重:
!   坐标文件: imt4096_bias.txt
!   权重文件: imt4096_weight.txt
!---------------------------------------

program main

  integer,parameter::wp=kind(1.0_16)
  
  integer,parameter:: NIMT=4096

  !4096-Point DE Quadrature
  real(wp),dimension(1:NIMT-1)::IMT4096_Bias,IMT4096_Weight
  !2048-Point DE Quadrature
  real(wp),dimension(1:NIMT/2-1)::IMT2048_Bias,IMT2048_Weight
  !1024-Point DE Quadrature
  real(wp),dimension(1:NIMT/4-1)::IMT1024_Bias,IMT1024_Weight
  !512-Point DE Quadrature
  real(wp),dimension(1:NIMT/8-1)::IMT512_Bias,IMT512_Weight

  !real(wp),dimension(511)::y,t
  real(wp), dimension(1023)::y,t

  call read_imt_file

 
  !t=IMT512_Bias;
  !y=cos(10*t)/sqrt(t)
  !write(*,*) sum(y*IMT512_Weight)/512  !0.346366232384436488606081234949409695 

  !积分变换后这个更准确
  !y=20*sqrt(t)*sin(10*t)
  !write(*,*) 2*cos(10.0_wp)+sum(y*IMT512_Weight)/512 !0.346366232384436488606080435492338269
  
  t=IMT1024_Bias;
  y=cos(10*t)/sqrt(t)
  write(*,*) sum(y*IMT1024_Weight)/1024 !0.346366232384436488606080435492339328
 
 stop

contains
  subroutine read_imt_file()
    implicit none 
    
    !读取bias
    open(1,file='imt4096_bias.txt',status='old')
    read(1,*) IMT4096_Bias(1:NIMT/2)
    close(1)

    !读取权重
    open(1,file='imt4096_weight.txt',status='old')
    read(1,*) IMT4096_Weight(1:NIMT/2)
    close(1)

    !利用对称性
    forall(i=1:NIMT/2-1)
       IMT4096_Bias(NIMT/2+i)=1.0_wp-IMT4096_Bias(NIMT/2-i)
       IMT4096_Weight(NIMT/2+i)=IMT4096_Weight(NIMT/2-i)
    end forall
   
    IMT2048_Bias=IMT4096_Bias(2::2)
    IMT1024_Bias=IMT4096_Bias(4::4)
    IMT512_Bias=IMT4096_Bias(8::8)
    
    IMT2048_Weight=IMT4096_Weight(2::2)
    IMT1024_Weight=IMT4096_Weight(4::4)
    IMT512_Weight=IMT4096_Weight(8::8)

  end subroutine read_imt_file
 
end program main


库伦矩阵元计算: 辅助函数计算

库伦势能矩阵元计算中,需要计算中间辅助函数,其中变量 ξ \xi ξ取DE积分点坐标,每个下标 m m m,计算得到一组数据
U m ( ξ ) = ∫ 0 π cos ⁡ ( m β ) 1 − ξ 1 + ξ cos ⁡ β d β U_m(\xi)=\int_0^\pi {\cos(m\beta)}{\sqrt{\frac{1-\xi}{1+\xi \cos\beta}}}d\beta Um(ξ)=0πcos(mβ)1+ξcosβ1ξ dβ

4096个DE积分点计算matlab程序。其中bias数组是DE积分点坐标。积分中的因子 1 − ξ \sqrt{1-\xi} 1ξ 是为了减弱边缘奇性引入的(DE积分点边缘处的坐标非常小,或非常接近1)

syms t xi tt x y yy;

U=[];

tt=vpa(pi);
Deta=tt/1000000; !10^-6

for m=0:10
    m
    tU=[];
    for k=1:2048
        k
        xi=bias(k);
        y=cos(m*x)*sqrt(1-xi)/sqrt(1+xi*cos(x));
        t=vpaintegral(y,0,tt,'RelTol',1e-36, 'AbsTol',0, 'MaxFunctionCalls',Inf);
        tU=[tU;t];
    end

    for k=2049:3900
        k
        xi=bias(4096-k);
        y=cos(m*x)*sqrt(xi)/sqrt(2*cos(x/2)^2-xi*cos(x));
        t=vpaintegral(y,0,tt,'RelTol',1e-36, 'AbsTol',0, 'MaxFunctionCalls',Inf);
        tU=[tU;t];
    end

    for k=3901:4090
        k
        xi=bias(4096-k);
        y=cos(m*x)*sqrt(xi)/sqrt(2*cos(x/2)^2-xi*cos(x));
        t=vpaintegral(y,0,tt-Deta,'RelTol',1e-36, 'AbsTol',0, 'MaxFunctionCalls',Inf);
  
        %[PI-Deta,PI]之间,将cos(x)展开
        yy=cos(m*(tt-x))*sqrt(xi)/sqrt(xi+(1-xi)*x^2/2*(1-x^2/12+x^4/360));
        t=t+vpaintegral(yy,0,Deta,'RelTol',1e-36, 'AbsTol',0, 'MaxFunctionCalls',Inf);
        tU=[tU;t];
    end

    for k=4091:4095
        t=0;
        tU=[tU;t];
    end

    U=[U tU];
end
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值