DMUG-Archiv 2011

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

Re: NIntegrate mit einer compelierten Funktion

Liebe Kollegen,

erste einmal vielen Dank für die kompetenten Antworten.

Hier noch ein paar Hinweise die deutlich machen, was ich will.

Wenn man auf eine Funktion stößt, die man integrieren will, dann sucht man zuerst natürlich die Lösung für das Integral. Leider habe ich bis heute keine analytische Lösung gefunden. Mit dem Tool "Introduction to Ordinary Differential Equations with Mathematica: An Integrated Multimedia Approach" von Alfred Gray, Michael J. Mezzino Jr., Mark Pinsky (Publisher: TELOS/Springer-Verlag, Year: 1997, ISBN: 0387944818 (Hardcover), 890 pp, Book Includes: CD-ROM, http://www.wolfram.com/books/profile.cgi?id=3708; wird leider nicht weiter entwickelt...) hatte ich das Integral als gewöhnliche Differentialgleichung formuliert und lösen lassen: Mit dem Ansatz Method -> Lagrange wurde eine Lösung ausgegeben, aber die hat gewisse Schwächen, wenn man die Lösung numerisch mit den Ergebnissen vergleicht, die man mit NIntegrate nach M erhält:

((1-\[Epsilon])*(E^((4*H^2*M)/(-2*H-2*M))*(-2*Sqrt[2]*(-E^(-((2*H*(-H-2*M)*M)/(-H-M)))+E^((2*M^3)/(H+M)))*H*(b*(E^((M*(b-2*y)^2*Tan[\[Gamma]]^2)/(2*(H+M)))+E^((M*(b+2*y)^2*Tan[\[Gamma]]^2)/(2*(H+M))))-2*(E^((M*(b-2*y)^2*Tan[\[Gamma]]^2)/(2*(H+M)))-E^((M*(b+2*y)^2*Tan[\[Gamma]]^2)/(2*(H+M))))*y)*(Erf[((l+2*x)*Tan[\[Gamma]])/Sqrt[-((2*H)/M)-2]]+Erf[((l-2*x)*Tan[\[Gamma]])/Sqrt[-((2*H)/M)-2]])*Tan[\[Gamma]]+2*Erf[((b+2*y)*Tan[\[Gamma]])/Sqrt[-((2*H)/M)-2]]*(2*Sqrt[-(H/M)-1]*M*(H+M)*(E^((2*M^3)/(H+M))*(2*H+4*M+2)-2/E^((2*H*(-H-2*M)*M)/(-H-M)))*Sqrt[Pi]*Erf[(Sqrt[-(H/M)-1]*M*(l+2*x)*Tan[\[Gamma]])/(Sqrt[2]*(-H-M))]+2*Sqrt[-(H/M)-1]*M*(H+M)*(E^((2*M^3)/(H+M))*(2*H+4*M+2)-2/E^((2*H*(-H-2*M)*M)/(-H-M)))*Sqrt[Pi]*Erf[(Sqrt[-(H/M)-1]*M*(l-2*x)*Tan[\[Gamma]])/(Sqrt[2]*(-H-M))]-Sqrt[2]*(-E^(-((2*H*(-H-2*M)*M)/(-H-M)))+E^((2*M^3)/(H+M)))*H*((E^((M*(l-2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M)))+E^((M*(l+2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M))))*l-2*(E^((M*(l-2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M)))-E^((M*(l+2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M))))*x)*Tan[\[Gamma]])+2*Erf[((b-2*y)*Tan[\[Gamma]])/Sqrt[-((2*H)/M)-2]]*(2*Sqrt[-(H/M)-1]*M*(H+M)*(E^((2*M^3)/(H+M))*(2*H+4*M+2)-2/E^((2*H*(-H-2*M)*M)/(-H-M)))*Sqrt[Pi]*Erf[(Sqrt[-(H/M)-1]*M*(l+2*x)*Tan[\[Gamma]])/(Sqrt[2]*(-H-M))]+2*Sqrt[-(H/M)-1]*M*(H+M)*(E^((2*M^3)/(H+M))*(2*H+4*M+2)-2/E^((2*H*(-H-2*M)*M)/(-H-M)))*Sqrt[Pi]*Erf[(Sqrt[-(H/M)-1]*M*(l-2*x)*Tan[\[Gamma]])/(Sqrt[2]*(-H-M))]-Sqrt[2]*(-E^(-((2*H*(-H-2*M)*M)/(-H-M)))+E^((2*M^3)/(H+M)))*H*((E^((M*(l-2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M)))+E^((M*(l+2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M))))*l-2*(E^((M*(l-2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M)))-E^((M*(l+2*x)^2*Tan[\[Gamma]]^2)/(2*(H+M))))*x)*Tan[\[Gamma]]))))/(16*(E^(-2*H*M)-E^(2*M^2))^2*Sqrt[-(H/M)-1]*M*(H+M)*Sqrt[Pi])

Kennt Ihr eine (bessere) analytische Lösung?

Nun, wenn man analytisch nicht weiter kommt, dann eben numerisch. Das dauert aber garantiert 2 Zehnerpotenzen länger. Folglich will man das dann für ein Webmathematica Tool dann nur noch möglichst schnell einen Zahlenwert für das betreffende Integral. Da hatte ich gehofft, dass MMA 8 mit den Fähigkeiten zur Erzeugung von C-Code weiter hilft (ging über MathLink natürlich schon früher... ;-) ).

Also soll MMA ganz ganz schnell einen Zahlenwert liefern (was es glaube ich seit Version 6 schon ganz gut kann). Deswegen hatte ich das mal mit der Option CompilationTarget -> "C" versucht, so richtig schnell wurde es dadurch aber immer noch nicht.

Frage: Wie geht das Integrieren es richtig schnell?

Danke & freundliche Grüße von

Peter

##########################

Am 09.06.2011 23:12, schrieb rolfm:
Subsidencefunction$internal$xy$ohne$if$compiled = Compile[{{a, _Real}, {b,
_Real}, {l, _Real}, {M, _Real}, {x, _Real}, {y, _Real},
      {H, _Real}}, ((-(1/4))*(Erf[((l - 2*y)*a)/(1.4142135623730951*(-1 +
H/M)^(1/2))] +
        Erf[((l + 2*y)*a)/(1.4142135623730951*(-1 + H/M)^(1/2))])*(Erf[((b +
2*x)*a)/(1.4142135623730951*(-1 + H/M)^(1/2))] +
        Erf[((b - 2*x)*a)/(1.4142135623730951*(-1 + H/M)^(1/2))]))/(-1 +
E^(2*M*(-H + M))), CompilationTarget ->  "C"];
suf[(z__)?NumberQ] := Subsidencefunction$internal$xy$ohne$if$compiled[z];
NIntegrate[suf[1, 2, 3, 4, x, 6, 7], {x, 0, 10}, AccuracyGoal ->  8]

funktioniert.

Man sollte meinen dass man so eine Hilfsfunktion (suf) nicht braucht, aber
in dem Fall wohl doch.

Gruss,

Rolf Mertig
GluonVision GmbH
Berlin


--
Mit freundlichen Grüßen

Uta&  Peter Klamser




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

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