Funktionsparameter bestimmen < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 08:53 Mi 13.08.2014 | Autor: | SKD |
Hi,
Also ich möchte im Moment eine Funktin mit bestimmten Randbedingungen erstellen und dazu Mathematica nutzen.
Als Grundfunktion wollte ich diese nutzen
f(x) = a * exp(d1 * b) + c
Hier die Randbedingungen:
f(0) = p0
f(d1)=p1
f'(d1) = m
daraus erhalte ich folgende Bedingungen:
a*exp(d1*b) + c= p1
a + c = p0
b*a*exp(b*d1)=m
Ich möchte zunächst allgemein die Parameter a, b, c bestimmen und später für bestimmte Fälle Zahlenwerte bestimmen.
In Mathematica sieht das ganze dann so aus:
in1:
equations := {a*exp[b*d1] + c == p1,
a + c == p0,
b*a*exp[b*d1] == m}
in2: Solve[equations, {a, b, c}]
Leider berechnet er das nichts. Auch Eingabe der übrigen Werte und anschließendes NSolve liefert nicht wirklich etwas.
p0 = 0.15
p1 = 3
d1 = 23
d2 = 25
m = 3/2
Ich muss dazu sagen, dass ich ein ziemlicher Neuling in Mathematica bin.
Hat jemand eine Idee, was ich falsch mache oder wie man besser vorgehen könnte? Danke schonmal!
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
> Hi,
> Also ich möchte im Moment eine Funktion mit bestimmten
> Randbedingungen erstellen und dazu Mathematica nutzen.
> Als Grundfunktion wollte ich diese nutzen
> f(x) = a * exp(d1 * b) + c
>
> Hier die Randbedingungen:
>
> f(0) = p0
> f(d1)=p1
> f'(d1) = m
>
> daraus erhalte ich folgende Bedingungen:
> a*exp(d1*b) + c= p1
> a + c = p0
> b*a*exp(b*d1)=m
>
> Ich möchte zunächst allgemein die Parameter a, b, c
> bestimmen und später für bestimmte Fälle Zahlenwerte
> bestimmen.
>
> In Mathematica sieht das ganze dann so aus:
>
> in1:
> equations := {a*exp[b*d1] + c == p1,
> a + c == p0,
> b*a*exp[b*d1] == m}
>
> in2: Solve[equations, {a, b, c}]
>
> Leider berechnet er das nichts. Auch Eingabe der übrigen
> Werte und anschließendes NSolve liefert nicht wirklich
> etwas.
>
> p0 = 0.15
>
> p1 = 3
>
> d1 = 23
>
> d2 = 25
>
> m = 3/2
Hallo SKD
hast du bemerkt, dass in der Definition von f(x), die du oben
angegeben hast, das x überhaupt nicht auftritt ?
Ferner würde ich unbedingt empfehlen, genau diese (korrigierte !)
Funktionsgleichung auch Mathematica zu füttern. Damit ersparst
du dir weitere mögliche Fehler durch eigenes Einsetzen in die
Formel. Wenn schon Mathematica, dann nutze dessen Fähigkeiten
auch richtig ! ...
Mein entsprechender Mathematica-Text würde also etwa so
beginnen:
f[x_]:= a*Exp[b*x] + c
f1[x_]:=D[f[x],x] (Ableitungsfunktion)
equations:= {f[0]==p0, f[d1]==p1, f1[d1]==m}
..........
LG , Al-Chwarizmi
|
|
|
|
|
Hallo SKD,
in einer Mitteilung habe ich dir schon Tipps gegeben.
Jetzt habe ich mir deinen Text noch etwas genauer
angeschaut und gemerkt, warum das so wohl nicht
funktioniert.
equations := {a*exp[b*d1] + c == p1,
a + c == p0,
b*a*exp[b*d1] == m}
Zwar hast du dran gedacht, dass man für Funktions-
klammern in Mathematica eckige Klammern braucht,
aber nicht daran, dass die eingebauten Grundfunktionen
alle mit Großbuchstaben anfangen, also nicht sin, cos, exp,
sondern Sin , Cos und eben auch Exp !
LG , Al-Chw.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:39 Mi 13.08.2014 | Autor: | SKD |
Hey,
schonmal vielen Dank. Du hast recht, in der Fkt-Glg kam das x nicht vor, hatte versehentlich schon das d1 eingesetzt, aber das hattest du ja ganz richtig interpretiert.
Mit dem Mathematica "richtig nutzen" hast du sicherlich recht. Da ich mich aber noch kaum auskenne mit dem Syntax von Mathematica wollte ichs erstmal so versuchen.
Auch das mit der Großschreibung stimmt natürlich, wusste ich auch schonmal ^^.
Vielen Dank also schonmal!
Habe es jetzt alles so gemacht wie du sagtest. Aber es scheint sich, als gäbe es keine Lösung, da irgendwo ein Logarithmus einer negativen Zahl gebildet wird. So ganz ist für mich nicht nachvollziehbar, warum es nicht möglich sein soll diese e-Fkt zu fitten?
Da die Fkt in diesem Bereicht streng monoton verlaufen und einen Bogen beschreiben soll, kommt eine ganzrationale Fkt aber nicht in Frage, daher dachte ich an die e-Fkt...?
|
|
|
|
|
> Hey,
> schonmal vielen Dank. Du hast recht, in der Fkt-Glg kam das
> x nicht vor, hatte versehentlich schon das d1 eingesetzt,
> aber das hattest du ja ganz richtig interpretiert.
> Mit dem Mathematica "richtig nutzen" hast du sicherlich
> recht. Da ich mich aber noch kaum auskenne mit dem Syntax
> von Mathematica wollte ichs erstmal so versuchen.
> Auch das mit der Großschreibung stimmt natürlich, wusste
> ich auch schonmal ^^.
> Vielen Dank also schonmal!
> Habe es jetzt alles so gemacht wie du sagtest. Aber es
> scheint sich, als gäbe es keine Lösung, da irgendwo ein
> Logarithmus einer negativen Zahl gebildet wird. So ganz ist
> für mich nicht nachvollziehbar, warum es nicht möglich
> sein soll diese e-Fkt zu fitten?
> Da die Fkt in diesem Bereicht streng monoton verlaufen und
> einen Bogen beschreiben soll, kommt eine ganzrationale Fkt
> aber nicht in Frage, daher dachte ich an die e-Fkt...?
Weshalb soll eine ganzrationale Funktion nicht in Frage kommen,
wenn du nur eine Annäherung auf einem begrenzten Intervall
brauchst. Oder welche Gründe hast du für einen Ansatz mit
einer global monotonen Funktion ?
Für die Art des gewählten Modells ist es wichtig zu wissen,
wozu es denn wirklich dienen soll. Gib uns also bitte noch an,
zu welchem konkreten Zweck du denn einen solchen Kurven-
Fit brauchst. Dann kann man sich überlegen, welche Art von
Funktion aus dem reichhaltigen Angebot an Möglichkeiten
am besten passen könnte.
LG , Al-Chw.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:21 Mi 13.08.2014 | Autor: | SKD |
Hi,
der konkrete Sinn ist ein Wasserfilter, der sich mit zunehmender Verschmutzung (x-Wert) zusetzt und einen erhöhten Differenzdruck erzeugt.
Die Kurve sieht so aus: Es gibt einen Anfangsdifferenzdruck p0 (quasi vom sauberen Filter), von diesem aus steigt die Kurve zunächst nur langsam an, irgendwann kommt dann mit zunehmender Verschmutzung ein stärkerer Anstieg, die Fkt macht quasi eine Kurve und geht dann fast linear nach oben.
Diese lineare Stück soll auch als gerade definiert sein (ab d1). Daher soll der Graph hier die gleiche Steigung wie die Gerade haben (nämlich m). Gleichzeitig soll die Kurve auf dem Punkt liegen (d1/p1) => 3 Bedingungen.
Und noch eine Frage konkret zum Umgang mit Mathematica. Manchmal (aber irgendwie nicht immer) erhalte ich die Fehlermeldung "23 is not a valid variable". Es scheint an der Art der Variablenzuweisung zu liegen. Kann bzw soll ich das ganze anders gestalten?
In[31]:= f[x_] := a * Exp[b * x] + c
In[32]:= f1[x_]:=D[f[x],x]
In[21]:= p0:=0.15
d1:=23
p1:=3
m:=3/2
In[33]:= equations:={f1[d1]==m, f[d1]==p1, f[0]==p0 }
In[35]:= Solve[equations, {a,b,c}]
During evaluation of In[35]:= General::ivar: 23 is not a valid variable. >>
During evaluation of In[35]:= Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information. >>
During evaluation of In[35]:= Solve::svars: Equations may not give solutions for all "solve" variables. >>
Out[35]= {}
|
|
|
|
|
> Hi,
> der konkrete Sinn ist ein Wasserfilter, der sich mit
> zunehmender Verschmutzung (x-Wert) zusetzt und einen
> erhöhten Differenzdruck erzeugt.
> Die Kurve sieht so aus: Es gibt einen Anfangsdifferenzdruck
> p0 (quasi vom sauberen Filter), von diesem aus steigt die
> Kurve zunächst nur langsam an, irgendwann kommt dann mit
> zunehmender Verschmutzung ein stärkerer Anstieg, die Fkt
> macht quasi eine Kurve und geht dann fast linear nach
> oben.
Dieses Verhalten erinnert mich an Potenzfunktionen wie z.B.
[mm] y=x^4 [/mm] oder etwas allgemeiner [mm] y=a*x^b+c [/mm] . Wenn du darin
c:=p0 setzt, ist die erste Bedingung schon erfüllt, und man
hat an der Stelle 0 die Steigung 0 . Mittels Anpassung von
a und b sollte man dann die Bedingungen an der Stelle d1
erfüllen können.
Wenn das Ganze aber das Verhalten des Filters realistisch
und recht gut modellieren soll, bräuchte man wohl auch im
Bereich zwischen x=0 und x=d1 noch so zwei, drei weitere
Messwerte. Allerdings ist wohl so etwas wie ein "präzises"
Modell ohnehin illusorisch (aber wohl auch nicht nötig).
> Dieses lineare Stück soll auch als Gerade definiert sein
> (ab d1). Daher soll der Graph hier die gleiche Steigung wie
> die Gerade haben (nämlich m).
Für ein geradliniges Stück braucht man dann natürlich
die Tangentengleichung: y= p1+m*(x-d1)
> Und noch eine Frage konkret zum Umgang mit Mathematica.
> Manchmal (aber irgendwie nicht immer) erhalte ich die
> Fehlermeldung "23 is not a valid variable". Es scheint an
> der Art der Variablenzuweisung zu liegen. Kann bzw soll ich
> das ganze anders gestalten?
>
> In[31]:= f[x_] := a * Exp[b * x] + c
>
> In[32]:= f1[x_]:=D[f[x],x]
>
> In[21]:= p0:=0.15
> d1:=23
> p1:=3
> m:=3/2
>
> In[33]:= equations:={f1[d1]==m, f[d1]==p1, f[0]==p0 }
> In[35]:= Solve[equations, {a,b,c}]
> During evaluation of In[35]:= General::ivar: 23 is not a
> valid variable. >>
> During evaluation of In[35]:= Solve::ifun: Inverse
> functions are being used by Solve, so some solutions may
> not be found; use Reduce for complete solution information.
> >>
> During evaluation of In[35]:= Solve::svars: Equations may
> not give solutions for all "solve" variables. >>
> Out[35]= {}
Bin nicht sicher, aber setz mal (wenigstens bei den konkreten
Datenwerten) ein gewöhnliches "=" anstatt ":="
(Leider habe ich im Moment kein Mathematica zur Verfügung,
wo ich es ausprobieren könnte)
LG , Al-Chw.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:27 Mi 13.08.2014 | Autor: | Marcel |
Hallo,
> Hi,
> Also ich möchte im Moment eine Funktin mit bestimmten
> Randbedingungen erstellen und dazu Mathematica nutzen.
> Als Grundfunktion wollte ich diese nutzen
> f(x) = a * exp(d1 * b) + c
es wurde ja schon [mm] $f(x)=a*\exp(b*x)+c\,$ [/mm] korrigiert.
>
> Hier die Randbedingungen:
>
> f(0) = p0
> f(d1)=p1
> f'(d1) = m
>
> daraus erhalte ich folgende Bedingungen:
> a*exp(d1*b) + c= p1
> a + c = p0
> b*a*exp(b*d1)=m
Also, um's mal schöngeschrieben zu sehen
[mm] $a+c=p_0\,,$
[/mm]
[mm] $a*\exp(d_1*b)+c=p_1\,,$
[/mm]
[mm] $a*b*\exp(b*d_1)=m\,.$
[/mm]
Das sind drei Gleichungen in 3 Unbekannten. Den Fall [mm] $b=0\,$ [/mm] nehme ich mal
als ausgeschlossen an (Du kannst ihn ansonsten gesondert behandeln),
dann kannst Du obiges äquivalent umschreiben zu
[mm] $a+c=p_0\,,$
[/mm]
[mm] $m+b*c=b*p_1\,,$
[/mm]
[mm] $a*b*\exp(b*d_1)=m\,,$
[/mm]
also
[mm] $a=p_0-c\,,$
[/mm]
[mm] $b=\frac{m}{p_1-c}\,,$
[/mm]
[mm] $a*b*\exp(b*d_1)=m\,,$
[/mm]
Ein [mm] $c\,$ [/mm] wie gewünscht muss also
[mm] $\frac{(p_0-c)*m}{(p_1-c)}*\exp(\tfrac{m}{p_1-c}*d_1)=m\,,$
[/mm]
d.h.
[mm] $\exp(\tfrac{m}{p_1-c}*d_1)=\frac{p_1-c}{p_0-c}$
[/mm]
erfüllen.
Man kann nun
$c [mm] \mapsto \exp(\tfrac{m}{p_1-c}*d_1)-\frac{p_1-c}{p_0-c}$
[/mm]
plotten und davon mal die Nullstelle(n)(?) ausgeben lassen. Damit
bekommt man (Kandidate(n) für) [mm] $c\,$ [/mm] und folglich auch [mm] $a\,$ [/mm] und [mm] $b\,$ [/mm] mit
[mm] $a=p_0-c\,,$
[/mm]
[mm] $b=\frac{m}{p_1-c}\,.$
[/mm]
P.S. Ansonsten kannst Du das ganze auch mit gnuplot machen. Wenn die
Parameter [mm] $a,b,c\,$ [/mm] gesucht sind, Du aber konkrete Werte für
[mm] $p_0,$ $p_1,$ $d_1$ [/mm] und [mm] $m\,$
[/mm]
hast, wird das sicher funktionieren. Wenn Du nicht weißt, wie: Ich kann
das später nochmal durchtesten.
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:55 Mi 13.08.2014 | Autor: | Marcel |
P.S.
Ich habe das Ergebnis mal grob durchgetestet:
Mit bspw.
[mm] $m=5\,,$
[/mm]
[mm] $p_0=2\,,$
[/mm]
[mm] $p_1=7\,,$
[/mm]
[mm] $d_1=3$
[/mm]
plotte ich mir mit Funkyplot
$x [mm] \mapsto \exp((5*3)/(7-x))-(7-x)/(2-x)$ ($=\exp(\tfrac{m*d_1}{p_1-c})-\frac{p_1-c}{p_0-7}$)
[/mm]
Funkyplot liefert mir die Nullstellenkandidaten (das sind natürlich
Näherungswerte)
[mm] $x_1=1,68$
[/mm]
und
[mm] $x_2=6,97\,.$
[/mm]
(Natürlich könnte man hier auch ein numerisches Verfahren bemühen, und
evtl. auch *prüfen*, ob das alle Nullstellen sind oder es noch andere geben
kann (mit analytischen Argumenten)).
[mm] $x_2$ [/mm] kann als Wert für [mm] $c\,$ [/mm] nicht in Frage kommen, weil dann
[mm] $a=p_0-c$
[/mm]
negativ wäre, zugleich aber
[mm] $b=\frac{m}{p_1-c}$
[/mm]
positiv.
Mit
[mm] $c=x_1$
[/mm]
erhält man
$a=2-1,68=0,32$
und
[mm] $b=\frac{5}{7-1,68}=0,94\,.$
[/mm]
Zur Kontrolle berechnet man
[mm] $a*b*\exp(b*d_1)=0,32*0,94*\exp(0,94*3)=5,05=m\,.$
[/mm]
(Wie gesagt: "Gleichheit" ist das nur näherungsweise, Du kannst meinetwegen
an allen Stellen auch [mm] $=\,$ [/mm] durch [mm] $\approx$ [/mm] ersetzen, ich war zu faul, das jedes
Mal so abzutippen!)
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:03 Mi 13.08.2014 | Autor: | Marcel |
Hallo,
nur zur Zusammenfassung halte ich mal fest, wie Du auch vorgehen kannst:
Für die Funktion
[mm]x \mapsto \exp(\tfrac{m}{p_1-x}*d_1)-\frac{p_1-x}{p_0-x}[/mm]
bestimme die Nullstellen - da ich mir keine großen Gedanken machen wollte,
sagen wir einfach mal, diese heißen [mm] $x_1,...,x_n.$ [/mm] Ich denke, man kann auch
"schnell" Argumente finden, warum das nur endlich viele sein können, vllt.
kann man sogar noch mehr dazu sagen, aber das ist egal. (Man könnte
auch eine Variablensubstitution durchführen und und und...)
Setze nun $k=1$ und [mm] $c=x_k\,.$ [/mm] Dann berechne
[mm]a=p_0-c\,,[/mm]
[mm]b=\frac{m}{p_1-c}\,.[/mm]
Nun prüfe, ob
[mm] $a*b*\exp(b*d_1)=m$ [/mm]
gilt. Falls ja: $(a,b,c)$ ist ein Parametertripel wie gewünscht. Falls nein: Erhöhe
[mm] $k\,$ [/mm] um [mm] $1\,$ [/mm] und mache den gleichen Testlauf mit dem neuen [mm] $c\,.$
[/mm]
Gruß,
Marcel
|
|
|
|