Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 加快C++;实现数值积分的代码 我有一个C++代码,实现了一个矩形的数值积分< /p> #include <iostream> #include <cmath> using namespace std; float pdf(float u){ return (1/(pow(1+u, 2))); } float cdf(float u){ return (1 - 1/(u+1)); } // The main function that implements the numerical integration, //and it is a recursive function float integ(float h, int k, float du){ float res = 0; if (k == 1){ res = cdf(h); }else{ float u = 0; while (u < h){ res += integ(h - u, k - 1, du)*pdf(u)*du; u += du; } } return res; } int main(){ float du = 0.0001; int K = 3; float gamma[4] = {0.31622777, 0.79432823, 1.99526231, 5.01187234}; int G = 50; int Q = 2; for (int i = 0; i < 4; i++){ if ((G-Q*(K-1)) > 0){ float gammath = (gamma[i]/Q)*(G-Q*(K-1)); cout<<1-integ(gammath, K, du)<< endl; } } return 0; } #包括 #包括 使用名称空间std; 浮动pdf(浮动u){ 返回(1/(功率1+u,2)); } 浮动cdf(浮动u){ 收益率(1-1/(u+1)); } //实现数值积分的主要功能, //它是一个递归函数 浮点整数(浮点h、整数k、浮点du){ 浮点数res=0; 如果(k==1){ res=cdf(h); }否则{ 浮点数u=0; while(uh。您现在可以通过基于FFT的算法计算此功率。更基本的变体是,如果q(z)=p(z)^K mod z^(n+1),则 p(z)*q'(z) = K*q(z)*p'(z) mod z^n_C++11_Numerical Methods - Fatal编程技术网

C++11 加快C++;实现数值积分的代码 我有一个C++代码,实现了一个矩形的数值积分< /p> #include <iostream> #include <cmath> using namespace std; float pdf(float u){ return (1/(pow(1+u, 2))); } float cdf(float u){ return (1 - 1/(u+1)); } // The main function that implements the numerical integration, //and it is a recursive function float integ(float h, int k, float du){ float res = 0; if (k == 1){ res = cdf(h); }else{ float u = 0; while (u < h){ res += integ(h - u, k - 1, du)*pdf(u)*du; u += du; } } return res; } int main(){ float du = 0.0001; int K = 3; float gamma[4] = {0.31622777, 0.79432823, 1.99526231, 5.01187234}; int G = 50; int Q = 2; for (int i = 0; i < 4; i++){ if ((G-Q*(K-1)) > 0){ float gammath = (gamma[i]/Q)*(G-Q*(K-1)); cout<<1-integ(gammath, K, du)<< endl; } } return 0; } #包括 #包括 使用名称空间std; 浮动pdf(浮动u){ 返回(1/(功率1+u,2)); } 浮动cdf(浮动u){ 收益率(1-1/(u+1)); } //实现数值积分的主要功能, //它是一个递归函数 浮点整数(浮点h、整数k、浮点du){ 浮点数res=0; 如果(k==1){ res=cdf(h); }否则{ 浮点数u=0; while(uh。您现在可以通过基于FFT的算法计算此功率。更基本的变体是,如果q(z)=p(z)^K mod z^(n+1),则 p(z)*q'(z) = K*q(z)*p'(z) mod z^n

C++11 加快C++;实现数值积分的代码 我有一个C++代码,实现了一个矩形的数值积分< /p> #include <iostream> #include <cmath> using namespace std; float pdf(float u){ return (1/(pow(1+u, 2))); } float cdf(float u){ return (1 - 1/(u+1)); } // The main function that implements the numerical integration, //and it is a recursive function float integ(float h, int k, float du){ float res = 0; if (k == 1){ res = cdf(h); }else{ float u = 0; while (u < h){ res += integ(h - u, k - 1, du)*pdf(u)*du; u += du; } } return res; } int main(){ float du = 0.0001; int K = 3; float gamma[4] = {0.31622777, 0.79432823, 1.99526231, 5.01187234}; int G = 50; int Q = 2; for (int i = 0; i < 4; i++){ if ((G-Q*(K-1)) > 0){ float gammath = (gamma[i]/Q)*(G-Q*(K-1)); cout<<1-integ(gammath, K, du)<< endl; } } return 0; } #包括 #包括 使用名称空间std; 浮动pdf(浮动u){ 返回(1/(功率1+u,2)); } 浮动cdf(浮动u){ 收益率(1-1/(u+1)); } //实现数值积分的主要功能, //它是一个递归函数 浮点整数(浮点h、整数k、浮点du){ 浮点数res=0; 如果(k==1){ res=cdf(h); }否则{ 浮点数u=0; while(uh。您现在可以通过基于FFT的算法计算此功率。更基本的变体是,如果q(z)=p(z)^K mod z^(n+1),则 p(z)*q'(z) = K*q(z)*p'(z) mod z^n,c++11,numerical-methods,C++11,Numerical Methods,计算背后的是,取pdf函数的K倍卷积幂,然后将该幂从0积分到h。当使用黎曼和进行积分时,这意味着将pdf视为步长为du的阶跃函数。在这种情况下,c的值旋转功率可计算为(截断的)幂级数/生成函数的幂中的系数 p(z)=pdf(0)+pdf(du)*z+pdf(2*du)*z^2+...+pdf(n*du)*z^n 其中n*du>h。您现在可以通过基于FFT的算法计算此功率。更基本的变体是,如果q(z)=p(z)^K mod z^(n+1),则 p(z)*q'(z) = K*q(z)*p'(z)

计算背后的是,取
pdf
函数的K倍卷积幂,然后将该幂从
0
积分到
h
。当使用黎曼和进行积分时,这意味着将pdf视为步长为du的阶跃函数。在这种情况下,c的值旋转功率可计算为(截断的)幂级数/生成函数的幂中的系数

p(z)=pdf(0)+pdf(du)*z+pdf(2*du)*z^2+...+pdf(n*du)*z^n
其中
n*du>h
。您现在可以通过基于FFT的算法计算此功率。更基本的变体是,如果
q(z)=p(z)^K mod z^(n+1)
,则

p(z)*q'(z) = K*q(z)*p'(z)  mod z^n 
因此,
q
的系数可以通过卷积和从
p
的系数
p[j]=pdf(j*du)
中计算出来。比较上述公式中的幂
z^(m-1)
的项给出了系数级别

sum  p[m-j]*j*q[j] = K * sum  q[j]*(m-j)*p[m-j],    j=0..m
当已经计算了以前的系数
q[0]、…、q[m-1]
时,为新系数
q[m]
求解:

q[m] = 1/(m*p[0]) * sum  (K*(m-j)-j)*p[m-j]*q[j],    j=0..m-1
在代码中给出

q[0] = pow(p[0], K);
for(m=1; m<=n; m++) {
    q[m]=0;
        for(j=0; j<m; j++) { q[m] += (K*(m-j)-j)*p[m-j]*q[j]; }
    q[m] /= m*p[0];
}
q[0]=pow(p[0],K);

对于(m=1;m可能更适合这个问题。我注意到的一件事是,你在一个循环中有
(G-Q*(K-1))
,并且在循环的每个迭代中有两次。从循环中取出它可能会有所帮助,但不确定有多少。用
(u*u)
@RSahu替换
,对,(G-Q*(K-1)必须进行一次评估,但我认为这不会显著加快我的代码速度。我认为我需要对代码中的算法进行一些更改,使我的速度再提高25倍。仍然没有在代码中看到它,不知道/不关心它实际实现了什么算法:所有输入都是按值计算的,唯一的返回是累积的,并且有一个没有全局变量,但可能这就是在k=2递归级别中对特定h进行优化/值重用的范围?在k=3中,当u增加到h时,k=2需要做的工作会更少,在我看来,k=3的一些输入在某些递归路径上是相同的。但在我的问题中,它不是一维积分,而是k维在上面的代码中,我没有看到参数K。那么你应该把它写下来,你想在域
u[K]>=0
u[1]+…+u[K]上积分
pdf(u[1])*…*pdf(u_n])
很抱歉出现任何混乱,但我只想加快程序。我不知道我真正想做的是什么很重要。也许我错了。请参考了解更多详细信息。
res = q[0]; 
for(j=1; j*du < h; j++) { res += q[j]; }
res *= pow(du, K);