Problem mit NIntegrate < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 02:01 So 27.07.2008 | Autor: | PaRu |
ich möchte eine nummerische lösung für eine gleichung in der die variable, nach der gelöst werden soll, in einem integral steht. das ganze habe ich versucht wie folgt zu lösen:
[mm] D_c[\text{En}]\text{:=}\frac{1}{4 \pi ^2}\sqrt{\text{En}\left(\frac{2 m_e}{\text{hBar}^2}\right)^3}\\
[/mm]
[mm] \text{Ea}=\left(\text{En}-h \frac{c}{\lambda _{\text{gap}}}\right)\frac{m_{\text{hh}}}{m_e+m_{\text{hh}}}\\
[/mm]
[mm] f_c[\text{En}]\text{:=}\frac{1}{1+\text{Exp}\left[\frac{\text{Ea}-\text{En}_{\text{fc}}}{k T}\right]}\\
[/mm]
[mm] \text{NSolve}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En}],\left\{\text{En},0,10^{-18}\right\}\right], \text{En}_{\text{fc}}\right]
[/mm]
das problem scheint zu sein, dass NIntegrate nicht [mm] \text{En}_{\text{fc}} [/mm] kennt. wie kann man das problem umgehen?
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
> ich möchte eine nummerische lösung für eine gleichung in
> der die variable, nach der gelöst werden soll, in einem
> integral steht. das ganze habe ich versucht wie folgt zu
> lösen:
>
> [mm]D_c[\text{En}]\text{:=}\frac{1}{4 \pi ^2}\sqrt{\text{En}\left(\frac{2 m_e}{\text{hBar}^2}\right)^3}\\[/mm]
>
> [mm]\text{Ea}=\left(\text{En}-h \frac{c}{\lambda _{\text{gap}}}\right)\frac{m_{\text{hh}}}{m_e+m_{\text{hh}}}\\[/mm]
>
> [mm]f_c[\text{En}]\text{:=}\frac{1}{1+\text{Exp}\left[\frac{\text{Ea}-\text{En}_{\text{fc}}}{k T}\right]}\\[/mm]
>
> [mm]\text{NSolve}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En}],\left\{\text{En},0,10^{-18}\right\}\right], \text{En}_{\text{fc}}\right][/mm]
>
> das problem scheint zu sein, dass NIntegrate nicht
> [mm]\text{En}_{\text{fc}}[/mm] kennt.
NIntegrate ist eine numerische Integration: und dies setzt voraus, dass der Integrand für jeden Wert der Integrationsvariablen auf eine Konstante heruntergekocht werden kann, was hier nicht der Fall ist. Kurz: So geht's sicher nicht.
> wie kann man das problem umgehen?
Allenfalls könntest Du darauf hoffen, dass sich der Wert dieses Integrals durch Integrate symbolisch (d.h. als Funktion von [mm] $\text{En}_{\text{fc}}$) [/mm] berechnen lässt (also mit Integrate, statt NIntegrate). Dass dies möglich ist, scheint mir aber auf den ersten Blick eher unwahrscheinlich. Ein solches, symbolisches Ergebnis der Integration könntest Du dann natürlich von NSolve nach [mm] $\text{En}_{\text{fc}}$ [/mm] auflösen lassen.
Ich denke, Du müsstest versuchen, NSolve dazu zu veranlassen, NIntegrate für jeden Wert von [mm] $\text{En}_{\text{fc}}$ [/mm] neu aufzurufen. (Dürfte dramatisch negative Konsequenzen für die Geschwindigkeit von NSolve haben: aber besser langsam als gar nicht...)
Vielleicht würde es für diesen Zweck schon genügen, eine eigene Funktion zu definieren, die für [mm] $\text{En}_{\text{fc}}$ [/mm] den Wert von NIntegrate zurück gibt, und NSolve nur diese eigene Funktion zu übergeben, um eine voreilige symbolische Expansion von NIntegrate im Body von NSolve zu verhindern. - Mangels Zugang zu Mathematica kann ich aber in diese Richtung zur Zeit nicht experimentieren...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:01 Mo 28.07.2008 | Autor: | PaRu |
danke erst einmal. doch leider verstehe ich deinen letzten absatz nicht so recht. zudem bin ich auch nicht so der mathematica experte.
> Vielleicht würde es für diesen Zweck schon genügen, eine
> eigene Funktion zu definieren, die für
> [mm]\text{En}_{\text{fc}}[/mm] den Wert von NIntegrate zurück gibt,
> und NSolve nur diese eigene Funktion zu übergeben, um eine
> voreilige symbolische Expansion von NIntegrate im Body von
> NSolve zu verhindern.
normalerweise würde man das problem über ein optimierungsverfahren lösen. man setzt für [mm]\text{En}_{\text{fc}}[/mm] einen wert ein und schaut ob das ergebnis zu groß oder zu klein ist. dementsprechend ändert man [mm]\text{En}_{\text{fc}}[/mm] ab. das ganze itteriert so lange, bis die differenz von dem soll-wert zum ist-wert ([mm]N_{z}[/mm]) sehr klein ist. da gibt es doch bestimmt auch fertige verfahren in mathematica.
|
|
|
|
|
> danke erst einmal. doch leider verstehe ich deinen letzten
> absatz nicht so recht. zudem bin ich auch nicht so der
> mathematica experte.
> > Vielleicht würde es für diesen Zweck schon genügen, eine
> > eigene Funktion zu definieren, die für
> > [mm]\text{En}_{\text{fc}}[/mm] den Wert von NIntegrate zurück gibt,
> > und NSolve nur diese eigene Funktion zu übergeben, um eine
> > voreilige symbolische Expansion von NIntegrate im Body von
> > NSolve zu verhindern.
Bei Deiner Verwendung von Solve
[mm] [center]$\text{NSolve}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En}],\left\{\text{En},0,10^{-18}\right\}\right], \text{En}_{\text{fc}}\right] [/mm] $[/center]
Enthält der Körper des an NIntegrate übergebenen Integranden noch eine Variable. Deshalb kann NIntegrate keine numerische Integration mit den gegebenen Grenzen machen. Du musst meiner Meinung nach Solve beim Vergleich mit [mm] $N_z$ [/mm] auf der rechten Seite von $==$ eine Funktion angeben, die [mm] $\mathrm{En}_{\text{fc}}$ [/mm] als explizites Argument engegennimmt.
>
> normalerweise würde man das problem über ein
> optimierungsverfahren lösen. man setzt für
> [mm]\text{En}_{\text{fc}}[/mm] einen wert ein und schaut ob das
> ergebnis zu groß oder zu klein ist. dementsprechend ändert
> man [mm]\text{En}_{\text{fc}}[/mm] ab. das ganze itteriert so lange,
> bis die differenz von dem soll-wert zum ist-wert ([mm]N_{z}[/mm])
> sehr klein ist. da gibt es doch bestimmt auch fertige
> verfahren in mathematica.
Schon, nur versucht Mathematica den Ausdruck [mm] $\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En}],\left\{\text{En},0,10^{-18}\right\}\right]$ [/mm] zuerst soweit zu evaluieren, bis es überhaupt erkennen kann, wo denn der Wert von [mm] $\text{En}_{\text{fc}}$ [/mm] eingesetzt werden kann. Bei diesem Versuch NIntegrate zu evaluieren, kommt es zu einem Fehler, weil ja eben [mm] $\text{En}_{\text{fc}}$ [/mm] noch gar nicht definiert ist. Also könntest Du eine explizite Funktion definieren, die [mm] $\text{En}_{\text{fc}}$ [/mm] als Argument entgegen nimmt und als Wert den Wert von NIntegrate (für diesen Wert von [mm] $\text{En}_{\text{fc}}$) [/mm] zurückgibt.
Es würde wahrscheinlich auch genügen, den Integranden von NIntegrate als Funktion zu schreiben, der der Parameter [mm] $\text{En}_{\text{fc}}$ [/mm] explizit übergeben wird. Das heisst, Du könntest Deine Funktion [mm] $f_c$ [/mm] mit zwei Parametern versehen, so:
[mm]f_c[\text{En},\text{En}_{\text{fc}}]\text{:=}\frac{1}{1+\text{Exp}\left[\frac{\text{Ea}-\text{En}_{\text{fc}}}{k T}\right]}[/mm]
und dann Solve + NIntegrate etwa in dieser Form aufrufen:
[mm]\text{NSolve}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En},\text{En}_{\text{fc}}],\left\{\text{En},0,10^{-18}\right\}\right], \text{En}_{\text{fc}}\right][/mm]
Kurz: Du darfst die Einsetzung konkreter Zahlenwerte für [mm] $\text{En}_{\text{fc}}$ [/mm] nicht über den blossen Kontext, das "Environment" machen lassen, sondern musst die Einsetzung explizit über Einsetzen von Werten für einen Funktionsparameter vornehmen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:40 Mo 28.07.2008 | Autor: | PaRu |
leider funktioniert dein vorschlag nicht. es macht keinen unterschied, ob ich die variable [mm]\text{En}_{\text{fc}}[/mm] expliziet im funktionskopf erwähne.
ich habe noch die funktion findroot gefunden, bei der ich mir erhoft habe, dass sie nach dem von mir beschriebene algorithmus funktioniert.
[mm]\text{FindRoot}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En},\text{En}_{\text{fc}}],\left\{\text{En},0,10^{-18}\right\}\right], \{\text{En}_{\text{fc}}, \text{En}_0\}\right][/mm]
doch leider bekomme ich wieder ohne ende fehlermeldungen.
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
|
> leider funktioniert dein vorschlag nicht. es macht keinen
> unterschied, ob ich die variable [mm]\text{En}_{\text{fc}}[/mm]
> expliziet im funktionskopf erwähne.
>
> ich habe noch die funktion findroot gefunden, bei der ich
> mir erhoft habe, dass sie nach dem von mir beschriebene
> algorithmus funktioniert.
>
> [mm]\text{FindRoot}\left[N_z==\text{NIntegrate}\left[D_c[\text{En}] f_c[\text{En},\text{En}_{\text{fc}}],\left\{\text{En},0,10^{-18}\right\}\right], \{\text{En}_{\text{fc}}, \text{En}_0\}\right][/mm]
>
> doch leider bekomme ich wieder ohne ende fehlermeldungen.
Das erstaunt mich nicht, denn Du hast im Integranden ja noch weitere Variablen drin, wie etwa $k$ und $T$. Wo sind denn für diese Symbole konkrete numerische Werte definiert, so dass numerisches Integrieren überhaupt möglich ist? Wenn Du den Integranden [mm] $D_c[\text{En}] f_c[\text{En},\text{En}_{\text{fc}}]$ [/mm] mit einer konkreten Zahl anstelle von [mm] $\text{En}_{\text{fc}}$ [/mm] von Mathematica evaluieren lässt: kommt dann ein Term heraus, in dem [mm] $\text{En}$ [/mm] (die Integrationsvariable für NIntegrate) die einzige verbleibende Variable ist? - Wenn nicht, musst Du eben diesen weiteren Variablen konkrete Werte zuweisen, bevor Du NIntegrate anwendest.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 17:47 Mo 28.07.2008 | Autor: | PaRu |
ich hatte eigentlich eine neue nb-datei anghängt, bei der alles definiert ist? egal ich poste sie nochmal.
ich kann En_fc nicht angeben, da dieser wert optimiert werden soll. es geht nicht! jeder optimierungsalgorithmus benutzt einen startwert und iteriert so lange, bis es passt. anscheinend ist das aber bei FindRoot nicht der fall. FindRoot und NIntegrate kommunizieren wohl nicht so recht miteinander. muss ich das nun über eine while-schleife selber programmieren?
das integral läßt sich nummerisch ohne probleme lösen. in der nb-datei schätze ich einen startwert mit dem es prima geht.
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:05 Mi 30.07.2008 | Autor: | PaRu |
ich habe es hin bekommen, indem ich die funktionen direkt in dem NIntegrate-befehl ersetzt habe.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:06 Mi 30.07.2008 | Autor: | PaRu |
kann mir bitte jemand erklären, warum mathematica hier fehler ausgibt?
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 10:23 Mi 30.07.2008 | Autor: | PaRu |
warum kann mathematica die funktionen in NIntgrate nicht auflösen?
das problem lässt sich nur lösen, wenn ich die funktionen direkt in den von NIntegrate zu lösenden term schreibe. ich würde aber gerne der übersicht halber die funktionen weiter benutzen. kann man da etwas mit Block, Evaluate oder holdall machen oder ist dass die völlig falsche richtung?
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:26 Do 31.07.2008 | Autor: | PaRu |
das problem liegt nicht an NIntegrate sondern an der definition der einen funktion. mein einer eingabeparameter hatte ein indice und das verträgt sich nicht mit dem unterstrich in der funktionsdefinition.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Sa 30.08.2008 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|