티카

2011-12-02 10 views
-1

내가 빨리 다음과 같은 문제를 해결하기 위해 노력하고 2 적분의 합에 대한 코드를 만들려면 :티카

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

가이 코드에 신속하게 답변을 얻을 수 있습니다 :

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

하지만 어떻게 a 및 b가 알려진 상수 인 다음 문제를 해결해야하는 경우이 코드를 관리 할 수 ​​있습니까?

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

이 질문은 특히 명확하지 않으며 매우 형식이 잘못되어 읽기가 어려워 사람들이 나를 도와주지 못하게합니다. [당신] (http://stackoverflow.com/users/1031298) 그것을 고치려고하십시오 (이것은 코드 주위의 제목과 텍스트를 포함합니다)? - 좋은 질문은 좋은 대답을 격려하고 모든 사람들이 유익하다는 것을 유의하십시오! – Simon

+0

관련 질문 : [SO/8021501] (http://stackoverflow.com/q/8021501) & [SU/315337] – Simon

+0

Simon이 명확하지 않은 점은 무엇입니까? 나는 첫째로 X1 = Integrate [Nw. 전치 [Nw], {x, -1, 1}]; 이제 X1 = a * Integrate [Nw. 전치 [Nw], {x, -1, 0.235}] + b * 적분 [Nw.Transpose [Nw], {x, 0.235,1}]; 따라서 제시된 코드로이 두 적분을 얻으려고 시도하십시오. 이것은 모두 –

답변

6

여기에이 약 100 배 빠른 Integrate을 사용하는 것보다, 다항식 적용의 범위에

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

의 명확한 적분을 할 수있는 간단한 함수입니다. 이것은 귀하의 문제에 대해 충분히 빠를 것입니다. 그렇지 않다면 병렬화 될 수 있습니다.

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.000a+0.000b},<<44>>,{<<1>>}}} *) 
+0

'expr == constant'와'expr == 1/x'를 처리하기 위해'polyIntegrate'에 충분한 보호 기능을 넣지 않은 것에 대해 당신에게 충고했지만 분명히'polyIntegrate'가 첫 번째 것을 잘 처리하고 두 번째를 처리합니다 그 것처럼 보이는 것처럼 보이지만, 결코 나타나지 않습니다. btw, +1. – rcollyer

+0

친애하는 Simon, 어떤 경우에도 병렬 처리가 가능합니까? –

+0

@Simon 방금 오래된 병렬 코드를 사용했지만 폴리곤을 앞면으로 개선하면 매우 빠르게 작동합니다. 고마워요! –