栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

类指数级数(指数积分函数的变体)数值计算算法的C++实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

类指数级数(指数积分函数的变体)数值计算算法的C++实现

文章目录
    • 前言
    • HskEta函数
    • HskKsi函数
    • 广义HskEta函数
      • 定义式
      • 主项分析
      • 余项分析

前言

由于毕设的数学推导中涉及了 ∑ n = 1 ∞ x n n ! × n sum_{n=1}^{infty}{frac{x^n}{n!times n}} ∑n=1∞​n!×nxn​ 和 ∑ n = 1 ∞ x n n ! × n 2 sum_{n=1}^{infty}{frac{x^n}{n!times n^2}} ∑n=1∞​n!×n2xn​ 这两个神奇的函数,其中 ∑ n = 1 ∞ x n n ! × n sum_{n=1}^{infty}{frac{x^n}{n!times n}} ∑n=1∞​n!×nxn​ 倒是和指数积分函数 E i ( x ) mathrm{Ei}left(xright) Ei(x) 有关,后面的以及推广形式就没有什么特殊的地方了。于是我给这两个函数命名为了 η ( x ) = ∑ n = 1 ∞ x n n ! × n eta left( x right) =sum_{n=1}^{infty}{frac{x^n}{n!times n}} η(x)=∑n=1∞​n!×nxn​ 和 ξ ( x ) = ∑ n = 1 ∞ x n n ! × n 2 xi left( x right) =sum_{n=1}^{infty}{frac{x^n}{n!times n^2}} ξ(x)=∑n=1∞​n!×n2xn​ 。

反正闲得无聊,最后我的算法是要在 C++ 平台上进行实现的,不如自己造一手轮子。所以顺便研究了一般形式 ∑ n = 1 ∞ x n n ! × n k sum_{n=1}^{infty}{frac{x^n}{n!times n^k}} ∑n=1∞​n!×nkxn​ 的递推计算表达式,并用数学证明给出了余项估计。

注意:因为我的场景只涉及 x ⩾ 0 xgeqslant0 x⩾0 的情形,所以没有取绝对值,如果要应用到一般场景,需要在判断条件处加绝对值

注:为了与已有函数区分,函数名前均加了Hsk,Hsk是我的ID的缩写(羽咲->Hasaki->Hsk)

HskEta函数


a n ( x ) = x n n ! × n (1.1) a_nleft( x right) =frac{x^n}{n!times n}tag{1.1} an​(x)=n!×nxn​(1.1)

η ( x ) = ∑ n = 1 ∞ x n n ! × n = ∑ n = 1 N a n ( x ) + ∑ n = N + 1 ∞ a n ( x ) = η N ( x ) + R N + 1 ( x ) (1.2) begin{aligned} eta left( x right) &=sum_{n=1}^{infty}{frac{x^n}{n!times n}}\ &=sum_{n=1}^N{a_nleft( x right)}+sum_{n=N+1}^{infty}{a_nleft( x right)}\ &=eta _Nleft( x right) +R_{N+1}left( x right)\ end{aligned}tag{1.2} η(x)​=n=1∑∞​n!×nxn​=n=1∑N​an​(x)+n=N+1∑∞​an​(x)=ηN​(x)+RN+1​(x)​(1.2)
其中前面的 η N ( x ) eta _Nleft( x right) ηN​(x) 称为主项, R N + 1 ( x ) R_{N+1}left( x right) RN+1​(x) 称为余项,我们将在第3章证明在给定误差 ε varepsilon ε 较小时有 ∣ R N ( x ) ∣ < 2 ∣ a N + 1 ( x ) ∣ left| R_Nleft( x right) right|<2left| a_{N+1}left( x right) right| ∣RN​(x)∣<2∣aN+1​(x)∣ 成立,并证明了递推表达式 a n − 1 ( x ) × [ ( 1 − 1 n ) 1 n ] x a_{n-1}left( x right)times left[ left( 1-frac{1}{n} right) frac{1}{n} right] x an−1​(x)×[(1−n1​)n1​]x 。

因此写出代码

#define HSK_EPSILON 0.000001

double HskEta (double x) {
    double ans = 0;
    double an = x;      // a1(x)
    
    double n;
    for (n = 2; 2 * an > HSK_EPSILON; ++ n) {
        ans += an;
        double coff = 1 / n;
        an *= coff * (1 - coff) * x;  // a{n}(x) <- a{n-1}(x)
    }
    return ans;
}
HskKsi函数


a n ( x ) = x n n ! × n 2 (2.1) a_nleft( x right) =frac{x^n}{n!times n^2}tag{2.1} an​(x)=n!×n2xn​(2.1)

ξ ( x ) = ∑ n = 1 ∞ x n n ! × n = ∑ n = 1 N a n ( x ) + ∑ n = N + 1 ∞ a n ( x ) = ξ N ( x ) + R N + 1 ( x ) (2.2) begin{aligned} xi left( x right) &=sum_{n=1}^{infty}{frac{x^n}{n!times n}}\ &=sum_{n=1}^N{a_nleft( x right)}+sum_{n=N+1}^{infty}{a_nleft( x right)}\ &=xi _Nleft( x right) +R_{N+1}left( x right)\ end{aligned}tag{2.2} ξ(x)​=n=1∑∞​n!×nxn​=n=1∑N​an​(x)+n=N+1∑∞​an​(x)=ξN​(x)+RN+1​(x)​(2.2)
其中前面的 ξ N ( x ) xi _Nleft( x right) ξN​(x) 称为主项, R N + 1 ( x ) R_{N+1}left( x right) RN+1​(x) 称为余项,我们将在第3章证明在给定误差 ε varepsilon ε 较小时有 ∣ R N ( x ) ∣ < 2 ∣ a N + 1 ( x ) ∣ left| R_Nleft( x right) right|<2left| a_{N+1}left( x right) right| ∣RN​(x)∣<2∣aN+1​(x)∣ 成立,并证明了递推表达式 a n − 1 ( x ) × [ ( 1 − 1 n ) 2 1 n ] x a_{n-1}left( x right)times left[ left( 1-frac{1}{n} right) ^2frac{1}{n} right] x an−1​(x)×[(1−n1​)2n1​]x 。

因此写出代码

#define HSK_EPSILON 0.000001

double HskKsi (double x) {
    double ans = 0;
    double an = x;  // a1(x)
    
    double n;
    for (n = 2; 2 * an > HSK_EPSILON; ++ n) {
        ans += an;
        double coff = 1 / n;
        an *= coff * (1 - coff) * (1 - coff) * x;  // a{n}(x) <- a{n-1}(x)
    }
    return ans;
}
广义HskEta函数

这部分给出上面内容的数学推导与严格证明。

定义式


a n ( x ) = x n n ! × n k (3.1) a_nleft( x right) =frac{x^n}{n!times n^k}tag{3.1} an​(x)=n!×nkxn​(3.1)

η ( x ) = ∑ n = 1 ∞ x n n ! × n k = ∑ n = 1 N a n ( x ) + ∑ n = N + 1 ∞ a n ( x ) = η N ( x ) + R N + 1 ( x ) (3.2) begin{aligned} eta left( x right) &=sum_{n=1}^{infty}{frac{x^n}{n!times n^k}}\ &=sum_{n=1}^N{a_nleft( x right)}+sum_{n=N+1}^{infty}{a_nleft( x right)}\ &=eta _Nleft( x right) +R_{N+1}left( x right)\ end{aligned}tag{3.2} η(x)​=n=1∑∞​n!×nkxn​=n=1∑N​an​(x)+n=N+1∑∞​an​(x)=ηN​(x)+RN+1​(x)​(3.2)

主项分析

主项迭代式
a n ( x ) = x n − 1 ( n − 1 ) ! × ( n − 1 ) k × ( n − 1 ) k n k + 1 x = x n − 1 ( n − 1 ) ! × ( n − 1 ) k × [ ( 1 − 1 n ) k 1 n ] x = a n − 1 ( x ) × [ ( 1 − 1 n ) k 1 n ] x (3.3) begin{aligned} a_nleft( x right) &=frac{x^{n-1}}{left( n-1 right) !times left( n-1 right) ^k}times frac{left( n-1 right) ^k}{n^{k+1}}x\ &=frac{x^{n-1}}{left( n-1 right) !times left( n-1 right) ^k}times left[ left( 1-frac{1}{n} right) ^kfrac{1}{n} right] x\ &=a_{n-1}left( x right)times left[ left( 1-frac{1}{n} right) ^kfrac{1}{n} right] x\ end{aligned}tag{3.3} an​(x)​=(n−1)!×(n−1)kxn−1​×nk+1(n−1)k​x=(n−1)!×(n−1)kxn−1​×[(1−n1​)kn1​]x=an−1​(x)×[(1−n1​)kn1​]x​(3.3)
其中主项
η N ( x ) = ∑ n = 1 N a n ( x ) (3.4) eta _Nleft( x right) =sum_{n=1}^N{a_nleft( x right)}tag{3.4} ηN​(x)=n=1∑N​an​(x)(3.4)

余项分析

我们要求余项 $left| R_{N+1}left( x right) right|

我们将证明:若 2 ∣ a N + 1 ( x ) ∣ < 0.1 2left| a_{N+1}left( x right) right|<0.1 2∣aN+1​(x)∣<0.1 且 k = 1 , 2 k=1,2 k=1,2 有 ∣ R N ( x ) ∣ < 2 ∣ a N + 1 ( x ) ∣ left| R_Nleft( x right) right|<2left| a_{N+1}left( x right) right| ∣RN​(x)∣<2∣aN+1​(x)∣ 成立。

证明:

①若 N + 2 > 2 ∣ x ∣ N+2> 2left| x right| N+2>2∣x∣

即 ∣ x ∣ N + 2 < 1 2 frac{left| x right|}{N+2}< frac{1}{2} N+2∣x∣​<21​ ,则有下放缩式成立
∣ a N + 1 + p ( x ) ∣ = ∣ x ∣ N + 1 + p ( N + 1 + p ) ! ( N + 1 + p ) k = ∣ x ∣ N + 1 ( N + 1 ) ! ( N + 1 + p ) k ∣ x ∣ p ( N + 2 ) ⋯ ( N + 1 + p ) ⩽ ∣ x ∣ N + 1 ( N + 1 ) ! ( N + 1 ) k ( ∣ x ∣ N + 2 ) p < ∣ a N + 1 ( x ) ∣ × ( 1 2 ) p (3.5) begin{aligned} left| a_{N+1+p}left( x right) right| &=frac{left| x right|^{N+1+p}}{left( N+1+p right) !left( N+1+p right) ^k}\ &=frac{left| x right|^{N+1}}{left( N+1 right) !left( N+1+p right) ^k}frac{left| x right|^p}{left( N+2 right) cdots left( N+1+p right)}\ &leqslant frac{left| x right|^{N+1}}{left( N+1 right) !left( N+1 right) ^k}left( frac{left| x right|}{N+2} right) ^p\ & 故可对余项进行放缩
∣ R N + 1 ( x ) ∣ = ∑ n = N + 1 ∞ a n ( x ) = ∑ p = 0 ∞ a N + 1 + p ( x ) < ∑ p = 0 ∞ ∣ a N + 1 ( x ) ∣ × ( 1 2 ) p = 2 ∣ a N + 1 ( x ) ∣ (3.6) begin{aligned} left| R_{N+1}left( x right) right| &=sum_{n=N+1}^{infty}{a_nleft( x right)}\ &=sum_{p=0}^{infty}{a_{N+1+p}left( x right)}\ &< sum_{p=0}^{infty}{left| a_{N+1}left( x right) right| times left( frac{1}{2} right) ^p}\ &=2left| a_{N+1}left( x right) right|\ end{aligned} tag{3.6} ∣RN+1​(x)∣​=n=N+1∑∞​an​(x)=p=0∑∞​aN+1+p​(x) ②若 N + 2 ⩽ 2 ∣ x ∣ N+2leqslant 2left| x right| N+2⩽2∣x∣

此时(对于 k = 1 , 2 k=1,2 k=1,2 )
2 ∣ a N + 1 ( x ) ∣ ⩾ 2 ∣ a N + 1 ( N + 2 2 ) ∣ = 2 ( N + 2 2 ) N + 1 ( N + 1 ) ! ( N + 1 ) k > 0.1 (3.7) begin{aligned} 2left| a_{N+1}left( x right) right|&geqslant 2left| a_{N+1}left( frac{N+2}{2} right) right|\ &=frac{2left( frac{N+2}{2} right) ^{N+1}}{left( N+1 right) !left( N+1 right) ^k}\ &>0.1\ end{aligned} tag{3.7} 2∣aN+1​(x)∣​⩾2∣∣∣∣​aN+1​(2N+2​)∣∣∣∣​=(N+1)!(N+1)k2(2N+2​)N+1​>0.1​(3.7)
关于这里第3行的不等式的证明会十分繁琐,我们可以用 mathematica 画图来展示这一点的正确性,并且展示其他 k k k 值对 ε varepsilon ε 的要求。

Table[NMinimize[{(2 ((x + 2)/2)^(x + 1))/((x + 1)! (x + 1)^k), x > 0, 
   x < 50}, x], {k, 0, 10}]
Plot[(2 ((x + 2)/2)^(x + 1))/((x + 1)! (x + 1)^1), {x, 0, 10}]

这与前提 2 ∣ a N + 1 ( x ) ∣ < 0.1 2left| a_{N+1}left( x right) right|<0.1 2∣aN+1​(x)∣<0.1 相矛盾,舍去。

证毕。

这意味着在对于 ε < 0.1 varepsilon<0.1 ε<0.1 的情形总有 ∣ R N ( x ) ∣ < 2 ∣ a N + 1 ( x ) ∣ left| R_Nleft( x right) right|<2left| a_{N+1}left( x right) right| ∣RN​(x)∣<2∣aN+1​(x)∣ 成立,所以我们可以用 2 ∣ a N + 1 ( x ) ∣ 2left| a_{N+1}left( x right) right| 2∣aN+1​(x)∣ 作为余项的上界。事实上,可以用斯塔林公式证明最紧的渐近上界为 e e − 1 ∣ a N + 1 ( x ) ∣ frac{mathrm{e}}{mathrm{e}-1}left| a_{N+1}left( x right) right| e−1e​∣aN+1​(x)∣ ,与这里的结论相差无几。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号