#include #include #include #include #include #include "gauss_points_weights.h" // constexpr double pi() { return std::atan(1)*4; } //only GCC defines the mathfunctions like atan as constexpr. constexpr double pi() { return 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00; } std::vector operator*(const std::vector& v1, const std::vector& v2){ unsigned int n = v1.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v1[i]*v2[i]); } return res; }; // pointwise product std::vector operator*(double k, const std::vector& v){ unsigned int n = v.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(k*v[i]); } return res; }; std::vector operator-(std::vector v1, const std::vector& v2){ unsigned int n = v1.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v1[i]-v2[i]); } return res; }; std::vector operator-(std::vector v1, const std::vector& v2){ unsigned int n = v1.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v1[i]-v2[i]); } return res; }; std::vector operator/(std::vector v, double k){ unsigned int n = v.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v[i]/k); } return res; }; std::vector operator/(std::vector v1, std::vector v2){ unsigned int n = v1.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v1[i]/v2[i]); } return res; }; std::vector operator+(std::vector v1, const std::vector& v2){ unsigned int n = v1.size(); std::vector res; for (size_t i = 0; i < n; i++) { res.push_back(v1[i]+v2[i]); } return res; }; std::vector as_vec(double c, unsigned int dim){ std::vector v(dim,c); return v; } std::vector as_vec(int c, unsigned int dim){ std::vector v(dim,c); return v; } void integral::grule(std::vector &bp, std::vector &wf) { /* [bp,wf]=grule(n) This function computes Gauss base points and weight factors using the algorithm given by Davis and Rabinowitz in 'Methods of Numerical Integration', page 365, Academic Press, 1975. https://sourceforge.net/p/octave/integration/ci/default/tree/inst/grule.m */ unsigned int n = bp.size(); if(wf.size()!= n){ // gestisci errore Rcpp::stop("Error in the C++ execution"); // exit(EXIT_FAILURE); } int iter=2; unsigned int m=std::trunc(double(n+1)/2); //Example: -2.3->-2; 2.3 -> 2 int e1=n*(n+1); int mm=4*m-1; std::vector t; for (auto i = 3; i < mm + 1; i=i+4) { double k= i* pi()/(4*n+2); t.push_back(k); }; double nn = double(1-(1-1.0/n)/(8*n*n)); std::vector xo(t.size()); auto f=[nn](double x){return std::cos(x)*nn;}; std::transform(t.begin(), t.end(), xo.begin(), f); std::vector h; std::vector d1; std::vector pk; std::vector dpn; std::vector d2pn; std::vector d3pn; std::vector d4pn; std::vector pkm1; std::vector pkp1; std::vector t1; std::vector den; std::vector u; std::vector v; std::vector p; std::vector dp; for( int j=0; j bp_temp= as_vec(0.0, xo_size)-xo-h; std::vector fx=d1-h*as_vec(double(e1), xo_size)*(pk+(h/as_vec(2.0, xo_size))*(dpn+(h/as_vec(3.0, xo_size))*(d2pn+(h/as_vec(4.0, xo_size))*(d3pn+(as_vec(0.2, xo_size)*h)*d4pn)))); std::vector wf_temp=as_vec(2.0, xo_size)*(as_vec(1.0, xo_size)-bp_temp*bp_temp)/(fx*fx); if ( (m+m) > n ){ bp_temp[m-1]=0; } if ( !((m+m) == n) ){ m=m-1; } std::vector jj; for (unsigned int i = 1; i <= m; i++) { jj.push_back(i); }; std::vector n1j= as_vec(int(n+1), jj.size())-jj; for (unsigned int i=0; i < jj.size(); i++) { bp[i]= bp_temp[i]; wf[i]= wf_temp[i]; bp[n1j[i]-1]=-bp_temp[i]; wf[n1j[i]-1]=wf_temp[i]; }; // % Linear map from[-1,1] to [a,b] // x=(a*(1-y)+b*(1+y))/2; // // % Compute the weights // w=(b-a)./((1-y.^2).*Lp.^2)*(N2/N1)^2; };