2011-12-02 50 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](http://superuser.com/questions/315337) – Simon

+0

什麼是不明確的西蒙?我需要首先X1 =積分[Nw。轉置[Nw],{x,-1,1}];現在我需要X1 = a * Integrate [Nw。 Transpose [Nw],{x,-1,0.235}] + b * Integrate [Nw .Transpose [Nw],{x,0.235,1}];所以試着用代碼來獲得這兩個積分,這全是 –

回答

6

這裏有一個簡單的功能做多項式

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

在它的應用範圍的定積分,這比使用Integrate快大約100倍。這應該足夠快,可以解決您的問題。如果不是,那麼它可能是並行的。

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

我正要告誡你,因爲沒有對'polyIntegrate'進行充分的保護來處理'expr == constant'和'expr == 1/x',但顯然'polyIntegrate'處理第一個很好,第二個一個人從來不會出現,儘管看起來會像。順便說一句,+1。 – rcollyer

+0

謝謝親愛的西蒙,無論如何它可以並行化? –

+0

@Simon我只是使用舊的並行化代碼,但在前面使用poly進行改進,並且工作速度非常快。非常感謝你! –

相關問題