DMUG-Archiv 2011

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

Re: NIntegrate mit einer compelierten Funktion

... Danke, es soll aber nach M und nicht nach x integriert werde.

MfG Peter

Am 10.06.2011 12:14, schrieb Rolf Mertig:
Also

FullSimplify[Integrate[(1/(-1 + E^(2*M*(-H + M))))*
  ((-(1/4))*(Erf[((l - 2*y)*a)/(1.4142135623730951*Sqrt[-1 + H/M])] +
    Erf[((l + 2*y)*a)/(1.4142135623730951*Sqrt[-1 + H/M])])*
   (Erf[((b + 2*x)*a)/(1.4142135623730951*Sqrt[-1 + H/M])] +
Erf[((b - 2*x)*a)/(1.4142135623730951*Sqrt[-1 + H/M])])),{x,x0,x1}]]//InputForm

evaliert in M-8.0.1 bei mir zu:

(-0.125*(-1. + Coth[M*(-H + M)])*
((-0.3989422804014327*E^((a^2*M*(-0.4999999999999999*b^2 - 1.9999999999999996*b*
           x0 - 1.9999999999999996*x0^2))/(H - 1.*M)) +
0.3989422804014327*E^((a^2*M*(-0.4999999999999999*b^2 + 1.9999999999999996*b*
           x0 - 1.9999999999999996*x0^2))/(H - 1.*M)) +
0.3989422804014327*E^((a^2*M*(-0.4999999999999999*b^2 - 1.9999999999999996*b*
           x1 - 1.9999999999999996*x1^2))/(H - 1.*M)) -
0.3989422804014327*E^((a^2*M*(-0.4999999999999999*b^2 + 1.9999999999999996*b*
           x1 - 1.9999999999999996*x1^2))/(H - 1.*M)))*Sqrt[-1. + H/M]*
    Sqrt[H - 1.*M] +
   a*(Sqrt[H - 1.*M]*(-1.*x0*Erf[(0.7071067811865475*a*(b - 2.*x0))/
Sqrt[-1. + H/M]] - 1.*x0*Erf[(0.7071067811865475*a*(b + 2.*x0))/
          Sqrt[-1. + H/M]] + x1*(Erf[(0.7071067811865475*a*(b - 2.*x1))/
           Sqrt[-1. + H/M]] + Erf[(0.7071067811865475*a*(b + 2.*x1))/
           Sqrt[-1. + H/M]])) + b*Sqrt[-1. + H/M]*Sqrt[M]*
(-0.5*Erf[(a*Sqrt[M]*(-0.7071067811865475*b + 1.414213562373095*x0))/ Sqrt[H - 1.*M]] - 0.5*Erf[(0.7071067811865475*a*Sqrt[M]*(b + 2.*x0))/
          Sqrt[H - 1.*M]] + 0.5*Erf[(a*Sqrt[M]*(-0.7071067811865475*b +
            1.414213562373095*x1))/Sqrt[H - 1.*M]] +
0.5*Erf[(0.7071067811865475*a*Sqrt[M]*(b + 2.*x1))/Sqrt[H - 1.*M]])))*
  (Erf[(0.7071067811865475*a*(l - 2*y))/Sqrt[-1 + H/M]] +
Erf[(0.7071067811865475*a*(l + 2*y))/Sqrt[-1 + H/M]]))/(a*Sqrt[H - 1.*M])

Am 10.06.2011 10:23, schrieb Dr. Peter Klamser:
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




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

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