Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to compute the drag of a plate enter image description here

Below is the code I am using to integrate the function

velcenter = {dotx, doty, 0};                     
 r = {Cos[θ[t]], Sin[θ[t]], 0};
veltanA = {-Sin[θ[t]], Cos[θ[t]], 0};
 velxpoint = Part[Cross[velcenter, r], 3];
 dragD = 1/2*ρ*cofD*h*Integrate[(Abs[velxpoint - s*dotθ])*(velcenter + 
                                       s*dotθ*veltanA), {s, a - l, a}];

The integration is so slow and I want to speed it up. Any suggestions are welcome !

share|improve this question
    
conbine the Abs functon and the integrate function .the runing time is unbelievable – Ann Feb 26 '14 at 8:41
    
Is your integrand intended to be a scalar or a vector ? – b.gatessucks Feb 26 '14 at 8:49
    
integrand is a vector,3-D – Ann Feb 26 '14 at 13:29
    
The difficulty lies in the integral variable in Norm function,it makes the running time longer – Ann Feb 28 '14 at 1:06

Integrate seems to prefer Sqrt[x^2] instead of Abs[x]. It also is wise to suppress Sin and Cos temporarily. I would assume you do know for which parameters your integrand is
valid, thus you can use GenerateConditions -> False. Then:

velcenter = {dotx, doty, 0};
r = {Cos[θ[t]], Sin[θ[t]], 0};
veltanA = {-Sin[θ[t]], Cos[θ[t]], 0};
velxpoint = Part[Cross[velcenter, r], 3];
SetOptions[Integrate, GenerateConditions -> False];
dragD = 1/2*ρ*cofD*h*
    Inactive[Integrate][(Abs[velxpoint - s*dotθ])*(velcenter + s*dotθ*veltanA), 
              {s, a - l, a}] /.Cos -> Inactive[Cos] /. Sin -> Inactive[Sin]

AbsoluteTiming[
 res = Activate[Activate[dragD /. Abs :> (Sqrt[#^2] &), Integrate]] /. 
   Sqrt[zz_^2] :> Abs[zz]]

gives, after about half a minute (on my 2011 laptop) with Mathematica 10.3

enter image description here

You can check a specific point, e.g.:

Activate[
  (dragD==res) /. {dotx -> .2, doty -> .3, θ[t]-> 2., ρ->.2,
                   a-> 2.4,h-> 3.,l-> .9, dotθ-> .6,cofD -> .6}
]
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.