Pergunta

Estou tentando resolver rapidamente o seguinte problema:

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}]

Posso obter uma resposta rápida com este código:

$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]]; 

Mas como posso gerenciar esse código se preciso resolver o seguinte problema, onde a e b são constantes conhecidas?

       X1 = a Integrate[Nw.Transpose[Nw], {x, -1, 0.235}]
          + b Integrate[Nw.Transpose[Nw], {x,  0.235,1}]; 
Foi útil?

Solução

Aqui está uma função simples para fazer integrais definidas de polinômios

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}]

Em sua gama de aplicabilidade, é cerca de 100 vezes mais rápido do que usar Integrate.Isso deve ser rápido o suficiente para o seu problema.Caso contrário, pode ser paralelizado.

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>>}}} *)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top