DMUG-Archiv 2011

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: NIntegrate mit einer compelierten Funktion

Hi Peter,

mehrere Sachen fallen mir auf:

- du weisst gar nicht, ob NIntegrate *sofort* numerische Werte fuer x
einsetzt. Vielleicht will es vorher testen, ob deine Funktion ein netter
analytischer Ausdruck wird, den man vorher untersuchen kann, um die
Integration genauer/schneller/besser auszufuehren. Deshalb solltest du
nicht direkt die CompiledFunction zum Integrieren nehmen, sondern das
noch einmal kapseln:

f[x_?NumericQ] := Subsidencefunction$internal$xy$ohne$if$compiled[1, 2,
3, x, 5, 6, 7]

und dann f integrieren

- es ist durchaus ratsam sich manchmal mit CompilePrint anzuschauen, wie
Compile deine Funktion verwurstet hat. Bei mir am Rechner faellt dabei
naemlich auf, dass in deiner kompilierten Funktion noch solche Sachen
drin stehen:

MainEvaluate[ Hold[Rational][ I4, I3]]

Deshalb ist bei der Verwendung von Compile auf jeden Fall etwas
Aufmerksamkeit notwendig.

- wer um Himmels Willen benutzt solche Variablennamen?

Alles in allem:

fc = Compile[{{a, _Real}, {b, _Real}, {l, _Real}, {M, _Real}, {x, 
_Real}, {y, _Real}, {H, _Real}}, -((0.25*(Erf[(0.7071067811865475*
             a*(b - 2.*x))/Sqrt[-1. + H/M]] +               
         Erf[(0.7071067811865475*a*(b + 2.*x))/Sqrt[-1. + H/M]])*
           (Erf[(0.7071067811865475*a*(l - 2.*y))/Sqrt[-1. + H/M]] + 
              Erf[(0.7071067811865475*a*(l + 2.*y))/Sqrt[-1. + H/M]]))/
        (-1. + 2.718281828459045^(2.*M*(-1.*H + M)))), 
  CompilationTarget -> "C"];
f[x_?NumericQ] := fc[1, 2, 3, x, 5, 6, 7]
NIntegrate[f[x], {x, 0, 1}]

Bis 10 konnte ich nicht hochintegrieren. Das konvergiert nicht.

Cheers
Patrick

On Thu, 2011-06-09 at 15:49 +0200, klamser wrote:
> Hallo liebe Mitglieder der DMUG,
> 
> wenn ich die folgende compelierte Funktion
> 
> Subsidencefunction$internal$xy$ohne$if$compiled=Compile[{{a,_Real},{b,_Real},{l,_Real},{M,_Real},{x,_Real},{y,_Real},{H,_Real}},Times[Rational[-1,4],Power[Plus[-1,Power[E,Times[2,M,Plus[Times[-1,H],M]]]],-1],Plus[Erf[Times[Power[1.4142135623730951`
>  
> Power[Plus[-1,Times[H,Power[M,-1]]],Rational[1,2]],-1],(l-2 y) 
> a]],Erf[Times[Power[1.4142135623730951` 
> Power[Plus[-1,Times[H,Power[M,-1]]],Rational[1,2]],-1],(l+2 y) 
> a]]],Plus[Erf[Times[Power[1.4142135623730951` 
> Power[Plus[-1,Times[H,Power[M,-1]]],Rational[1,2]],-1],(b+2 x) 
> a]],Erf[Times[Power[1.4142135623730951` 
> Power[Plus[-1,Times[H,Power[M,-1]]],Rational[1,2]],-1],(b-2 x) 
> a]]]],CompilationTarget->"C"]
> 
> NIntegrate[Subsidencefunction$internal$xy$ohne$if$compiled[1,2,3,x,5,6,7],{x,0,10}]
> 
> 
> integrieren will erhalte ich immer die Fehlermeldung
> 
> CompiledFunction::cfsa: Argument x at position 4 should be a 
> machine-size real number. >>
> 
> Was kann ich dagegen tun?
> 
> Danke & frohe Pfingsten wÃŒnscht
> 
> Peter




Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html