Question

Je suis en train de résoudre rapidement le problème suivant:

f[r_] := Sum[(((-1)^n (2 r - 2 n - 7)!!)/(2^n n! (r - 2 n - 1)!))
             * x^(r - 2*n - 1), 
         {n, 0, r/2}]; 

Nw := Transpose[Table[f[j], {i, 1}, {j, 5, 200, 1}]]; 

X1 = Integrate[Nw . Transpose[Nw], {x, -1, 1}]

Je peux obtenir la réponse rapidement avec ce code:

$starttime = AbsoluteTime[]; Quiet[LaunchKernels[]]; 
DIM = 50; 
Print["$Version = ", $Version, "  |||  ", 
      "Number of Kernels : ", Length[Kernels[]]]; 

Nw = Transpose[Table[f[j], {i, 1}, {j, 5, DIM, 1}]]; 
nw2 = Nw.Transpose[Nw]; 
Round[First[AbsoluteTiming[nw3 = ParallelMap[Expand, nw2]; ]]] 

intrule = (pol_Plus)?(PolynomialQ[#1, x]&) :> 
      (Select[pol, !FreeQ[#1, x] & ] /. 
         x^(n_.) /; n > -1 :> ((-1)^n + 1)/(n + 1)) + 2*(pol /. x -> 0)]); 

Round[First[AbsoluteTiming[X1 = ParallelTable[row /. intrule, {row, nw3}]; ]]]

X1 
Print["overall time needed in seconds: ", Round[AbsoluteTime[] - $starttime]]; 

Mais comment puis-je gérer ce code si je dois résoudre le problème suivant, où a et b sont des constantes connues?

       X1 = a Integrate[Nw.Transpose[Nw], {x, -1, 0.235}]
          + b Integrate[Nw.Transpose[Nw], {x,  0.235,1}]; 
Était-ce utile?

La solution

Voici une fonction simple des polynômes intégrales définies

polyIntegrate[expr_List, {x_, x0_, x1_}] := polyIntegrate[#, {x, x0, x1}]&/@expr
polyIntegrate[expr_, {x_, x0_, x1_}] := Check[Total[# 
  Table[(x1^(1 + n) - x0^(1 + n))/(1 + n), {n, 0, Length[#] - 1}]
  ]&[CoefficientList[expr, x]], $Failed, {General::poly}]

Sur son domaine d'application, cela est environ 100 fois plus rapide que l'utilisation Integrate. Cela devrait être assez rapide pour votre problème. Dans le cas contraire, il pourrait alors être parallélisé.

f[r_] := Sum[(((-1)^n*(2*r - 2*n - 7)!!)/(2^n*n!*(r - 2*n - 1)!))*
   x^(r - 2*n - 1), {n, 0, r/2}];
Nw = Transpose[Table[f[j], {i, 1}, {j, 5, 50, 1}]];

a*polyIntegrate[Nw.Transpose[Nw], {x, -1, 0.235}] + 
   b*polyIntegrate[Nw.Transpose[Nw], {x, 0.235, 1}] // Timing // Short

(* Returns: {7.9405,{{0.0097638 a+0.00293462 b,<<44>>,
             -0.0000123978 a+0.0000123978 b},<<44>>,{<<1>>}}} *)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top