Maple mehrere Unbekannte < Maple < Mathe-Software < Mathe < Vorhilfe
|
Hallo liebe Mitleser,
Es geht um folgendes:
Eine funktion mehrere Variablen definiert man ja in Maple bekannterweise z.B. so
f:=(x,y,z)->x+y+z
Nehmen wir jetz einfach mal an ich hätte eine Liste mit Variablen
ListOfVal := [x,y,z]
Gibt es eine möglichkeit jetz etwas der Art
f:=(ListOfVal[i],i=1..nops(ListOfVal))->x+y+z
zu definieren?
Also dass er mir als Variablen quasi die Liste ausliest.
Ich will mir ein Vorlagen-Worksheet erstellen für die Praktikumsauswertung.
Und da ich da jedes mal unterschiedlich viele Variablen habe, wäre etwas der Art sehr hilfreich.
Mit freundlichen Grüßen,
Phil.
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
> Hallo liebe Mitleser,
>
> Es geht um folgendes:
>
> Eine funktion mehrerer Variablen definiert man ja in Maple
> bekannterweise z.B. so
>
> f:=(x,y,z)->x+y+z
>
> Nehmen wir jetz einfach mal an ich hätte eine Liste mit
> Variablen
>
> ListOfVal := [x,y,z]
>
> Gibt es eine möglichkeit jetz etwas der Art
>
> f:=(ListOfVal,i=1..nops(ListOfVal))->x+y+z
>
> zu definieren?
>
> Also dass er mir als Variablen quasi die Liste ausliest.
>
> Ich will mir ein Vorlagen-Worksheet erstellen für die
> Praktikumsauswertung.
> Und da ich da jedes mal unterschiedlich viele Variablen
> habe, wäre etwas der Art sehr hilfreich.
>
> Mit freundlichen Grüßen,
> Phil.
>
> Ich habe diese Frage in keinem Forum auf anderen
> Internetseiten gestellt.
Hallo Phil,
das Funktionsbeispiel, das du angibst, ist sehr einfach
(Summe der Variablen). Dies kann man bestimmt auch
in Maple mit dem Summenbefehl so formulieren, dass
es für eine beliebige Anzahl von Summanden klappt.
Falls du aber auch an andere Arten von Funktionen
denkst, müsstest du schon klarer spezifizieren, was
dir denn wirklich vorschwebt.
Gib also mal ein paar typische Beispiele konkret an,
damit man sich das besser vorstellen kann !
LG Al-Chw.
Nebenbei:
wozu die große Mühe mit dem kursiv gesetzten Text ?
Die einschließenden Zeichen [i] und [/i] müssen doch
nur einmal gesetzt werden, nämlich am Anfang und
am Ende des kursiven Textes - falls du solchen
überhaupt willst.
|
|
|
|
|
Okay sagen wir jetz mal ich will von 3 Messgrößen
ListOfVal:=[R,Is,P]
wobei R den verwendeten Widerstand der Schaltung, Is den Strom und P die Leistung angibt über eine Differenzfunktion überprüfen, ob P = [mm] R*Is^2 [/mm] stimmt.
Dazu definiere ich mir
[mm] f:=(R,Is,P)->P-R*Is^2
[/mm]
Bei nur drei Variablen geht das ja noch mit eintippen, aber die Frage ist, ob ich es auch
[mm] f:=(seq(ListOfVal[i],i=1..nops(ListOfVal)))->P-R*Is^2 [/mm]
schreiben könnte.
Die Summe war nur ein kleines Beispiel, aber die Funktion kann beliebiger Art sein.
Es geht nur darum, wie ich einer funktion als Variable eine Liste bzw einen Vektor übergeben kann, die dann mit den einzelnen Einträgen/Komponenten arbeitet.
Z.b.
ListOfVal:=[x1,x2,y1,y2,z1,z2,a1,a2]
f:=(seq(ListOfVal[i],i=1..nops(ListOfVal))->x1*y2-x2*y1+a1*z2-a2*z2
Hoffe es wurde nun ein bisschen klarer.
Mit freundlichen Grüßen,
Phil.
|
|
|
|
|
> Okay sagen wir jetz mal ich will von 3 Messgrößen
>
> ListOfVal:=[R,Is,P]
>
> wobei R den verwendeten Widerstand der Schaltung, Is den
> Strom und P die Leistung angibt über eine
> Differenzfunktion überprüfen, ob P = [mm]R*Is^2[/mm] stimmt.
>
> Dazu definiere ich mir
> [mm]f:=(R,Is,P)->P-R*Is^2[/mm]
>
>
> Bei nur drei Variablen geht das ja noch mit eintippen, aber
> die Frage ist, ob ich es auch
>
> [mm]f:=(seq(ListOfVal[i],i=1..nops(ListOfVal)))->P-R*Is^2[/mm] [/i][/mm]
> [mm][i][/i][/mm]
> [mm][i]schreiben könnte.[/i][/mm]
> [mm][i] [/i][/mm]
> [mm][i]Die Summe war nur ein kleines Beispiel, aber die Funktion [/i][/mm]
> [mm][i]kann beliebiger Art sein.[/i][/mm]
> [mm][i] [/i][/mm]
> [mm][i]Es geht nur darum, wie ich einer funktion als Variable eine [/i][/mm]
> [mm][i]Liste bzw einen Vektor übergeben kann, die dann mit den [/i][/mm]
> [mm][i]einzelnen Einträgen/Komponenten arbeitet.[/i][/mm]
> [mm][i] [/i][/mm]
> [mm][i]Z.b.[/i][/mm]
> [mm][i] [/i][/mm]
> [mm][i][/i][/mm]
> [mm][i]ListOfVal:=[x1,x2,y1,y2,z1,z2,a1,a2][/i][/mm]
> [mm][i] [/i][/mm]
> [mm][i]f:=(seq(ListOfVal[i],i=1..nops(ListOfVal))->x1*y2-x2*y1+a1*z2-a2*z2 [/i][/i][/mm]
> [mm][i][i][/i][/i][/mm]
> [mm][i][i][/i][/i][/mm]
> [mm][i][i][/i][/i][/mm]
> [mm][i][i]Hoffe es wurde nun ein bisschen klarer.[/i][/i][/mm]
> [mm][i][i] [/i][/i][/mm]
> [mm][i][i]Mit freundlichen Grüßen,[/i][/i][/mm]
> [mm][i][i] Phil. [/i][/i][/mm]
Sorry, aber ich sehe da nicht weiter. In den angegebenen
Beispielen hat doch jeweils die Funktion f eine ganz
bestimmte Anzahl von Variablen (im ersten Beispiel
genau 3, im zweiten genau 8). Da ist mir rätselhaft, wie
eine Vereinfachung für eine beliebige Anzahl von
Variablen aussehen sollte.
Allenfalls könntest du einfach für jede Funktion, die du
je gebrauchen willst, eine umfassende Variablenliste
benützen, in welche du einfach alles reinschmeißt, was
du an Variablen je zu verwenden gedenkst. Dann kannst
du wohl für diese Liste eine Abkürzung wie etwa "varlist"
benützen und einfach bei jeder Funktion auf diese varlist
zurückgreifen.
LG
|
|
|
|
|
naja sagen wir so,
Ich will gaußsche fehlerfortpflanzung machen und dafür brauch ich nunmal die summe über aller ableitungen
Sagen wir einfach Sys[i][j] hat in der Zeile [i] die entsprechende Größe und in der Spalte steht jeweils der Fehler der größe der entsprechenden Messung und ebenso steht in Messung[i][j] die entsprechenden Messdaten , wobei die spaltenanzahl bis Numb geht.
ich würde nun gerne etwas derart machen
sys:=1/Numb*add( sqrt(add( eval( (diff (f(ListOfVal[i],i=1..nops(ListOfVal)), ListOfVal[k])*Sys[k][j] [mm] )^2, [/mm] seq(ListOfVal[i]=Messung[i][j], i=1..nops(ListOfVal)), k=1..nops(ListOfVal) ), j=1..Numb)
Damit die Formel mal übersichtlicher wird gilt n = nops(ListOfVal)
[mm] sys:=\frac{1}{Numb} \sum\limits_{j=1}^{Numb} \sqrt{ \sum\limits_{k=1}^{n} \left( \frac{\mathrm{d} f(x_1,\dots,x_n)}{\mathrm{d} x_k} \cdot Sys_{k,j} |_{x_l = Messung_{l,j} } \right)^2 } [/mm]
so dass ich einfach nurnoch via readdata die messdaten und die fehler einlesen muss und die zu untersuchende funktion vorher via
[mm] f(x_1,\dots,x_n) = \cdots [/mm]
definieren kann, sofern ListOfVal:=[x1,...,xn] definiert ist.
|
|
|
|
|
Ich schreib mal genauer auf was ich bisher habe
Nehmen wir eine Matrix Messungen in der in der Zeile i die Messdaten zur Größe ListOfVal[i] stehen und in der in der j-ten Spalte das Ergebnis des j-ten Versuchs steht.
Das Gleiche gilt für die Matrix Fehler, nur das dort eben die Fehler drin stehen.
Definiere ich mir f:=(x,y,z)->3*x-2*y+z und ListOfVal:=[x,y,z]
kann ich folgendes ohne probleme anwenden.
[mm] sysmittel:=1/Size(Messungen,2)*add(sqrt(add(eval((diff(f(x,y,z),ListOfVal[i])*Fehler[i][j])^2,[ [/mm] seq(ListOfVal[k]=Messungen[k][j],k=1..nops(ListOfVal))]),i=1..nops(ListOfVal))),j=1..Size(Messungen,2));
Achtung : Wers auch anwenden will muss ArrayTools einbinden für den Size befehl.
Jetz würde ich aber gerne in dem sysmittel-Aufruf das f(x,y,z) durch f(ListOfVal) ersetzen, so dass ich diesen Befehl einfach nur copy & pasten muss, um ihn bei verschiedenen Funktionen mit unterschiedlich vielen Variablen anwenden zu können.
Mit freundlichen Grüßen,
Phil.
|
|
|
|
|
Wie genau kann ich den Thread als gelöst markieren?
|
|
|
|
|
Hallo,
da du weiter unten schreibst, dass du eine Lösung gefunden hast, entferne ich hiermit den "Frage offen Status".
Damit's nicht aussieht, wie das Ergaunern von Antwortpunkten, will ich wenigstens noch auf das Folgende hinweisen:
> alternierendeSumme := proc (x::(seq(anything))) [mm] -add((-1)^k*[x][k], [/mm] k = 1 .. nops([x])) end proc:
> alternierendeSumme(a, b, c, d, e, f, g, h);
a-b+c-d+e-f+g-h
Gruß,
Peter
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:10 Do 23.02.2012 | Autor: | wieschoo |
Warum schreibst du dir keine Prozedur, die als Parameter einen Vektor von Indizies deiner Messmatrix nimmt. Und dann nach Schema berechnet
deine Matrix
0 1 2 3 4 5 6 7 8 9
x1 x2 y1 y2 z1 z2 a1 a2 b1 b2
myfunc := proc( x )
print(x[1]+x[2]+x[3]);
end proc:
Um dann x1+y1+z1 zu berechnen rufst du deine Funktion myfunc([1,2,4]) auf
Aber so wirklich wird man da noch nicht klug, was du nun wirklich einsparen möchtest. Solange du die Formel auf der Rechtenseite vom "->" eingeben musst, solange kannst du auch die Parameter explizit angeben.
Bis jetzt hast du nur Beispiele angegeben, wo die Funktion explizit angegeben war. Du hast doch nur eine Formel zu berechnen, oder?
|
|
|
|
|
Ich habe nun die Prozedur
Sys:=proc(f,ListOfVal, Messungen, Fehler ) [mm] 1/Size(Messungen,2)*add(sqrt(add(eval((diff(f(seq(ListOfVal[count],count=1...nops(ListOfVal))),ListOfVal[i])*Fehler[i][j])^2,[ [/mm] seq(ListOfVal[k]=Messungen[k][j],k=1..nops(ListOfVal))]),i=1..nops(ListOfVal))),j=1..Size(Messungen,2)) end proc;
(Achtung, zum ausprobieren wieder ArrayTools einbinden)
durch die Auswertung der Funktion, ist es nunmal erforderlich , dass die Funktionsparameter genau in der Reihenfolge wie sie in der Liste stehen definiert werden.
Ich habe jedoch gerade herausgefunden wies funktioniert.
einfach f:=Liste-> Funktionendefinition, wobei ich dann in der Definition nicht die eigentlichen Variablen verwenden darf, sondern Liste[i].
Trotzdem herzlichen Dank euch allen,
Mfg Phil
|
|
|
|