Hallo,
für die Uni muss ich eine Aufgabe mit Gnu Octave lösen, leider ist die
Zeit bis zur Abgabe mittlerweile knapp.
Ich bin auf ein Problem gestoßen und konnte bei Google nichts
hilfreiches dazu finden.
Ich soll fminsearch auf eine selbstgeschriebene Funktion anwenden, um
einen Parameter (das Argument der Funktion) zu schätzen.
Innerhalb der Funktion benötige ich Variablen, die außerhalb der
Funktion stehen. Wie kann die Funktion auf diese Variablen zugreifen?
Mit dem Schlüsselwort 'global' klappt es nicht. Gibt es vielleicht ein
Schlüsselwort, was eine ähnliche Wirkung wie 'volatile' in C hat?
Ich weiß nicht, ob/wie ich noch erklären könnte, warum ich die Variablen
nicht als Argumente übergeben kann.
Bei der fminsearch Funktion übergibt man nur die Funktion ohne
Argumente, also wie kann man dann bei der selbstgeschriebenen Funktion
die Variablen übergeben?
Hoffe, ich habe das Problem einigermaßen klar umreißen können. Falls
nein, kann ich gerne weitere Frage beantworten oder mehr ins Detail
gehen, schwitz.
Es geht übrigens nur um den unteren Teil der Aufgabe.
Bzw.
>> help fminsearch
X = fminsearch (FUN, X0, OPTIONS, FUN_ARG1, FUN_ARG2, ...)
Du hast FUN geschrieben, wenn ich Dich recht verstanden habe. Über
FUN_ARGn gibst Du Parameter an die Funktion.
Jingling Caterpillar schrieb:> Du hast FUN geschrieben, wenn ich Dich recht verstanden habe. Über> FUN_ARGn gibst Du Parameter an die Funktion.
Schon mal vielen Dank für den Hinweis!
Ich hab jetzt mal versucht, die Parameter zu übergeben mit dem Aufruf:
1
min = fminsearch(FUN=G, ARG2=pb, ARG3=t) % datei at line 38 column
wobei pb und t Vektoren sind, die ich vorher definiert habe.
Jedoch tritt ein Fehler auf in der Funktion G, die so aussieht (die
Funktion pK habe ich ebenfalls vorher definiert):
1
function g = G(alpha, argpb, argt)
2
sum=0
3
for k=1:10
4
s=0
5
s=argpb(k)-pK(k,alpha, argt) % line 29 column 6
6
s=s*s
7
sum=sum+s
8
end
9
g=sum
10
end
Der Fehler ist folgender:
1
error: 'argpb' undefined near line 29 column 7
2
error: called from
3
G at line 29 column 6
4
datei at line 38 column 5
Ich verstehe nicht, wieso argpb nicht gefunden wird, eigentlich wurden
die Parameter doch übergeben? (Außer alpha, aber über alpha soll ja das
Minimum gebildet werden.)
Kann mir da noch jemand weiterhelfen?
kim schrieb:> min = fminsearch(FUN=G, ARG2=pb, ARG3=t) % datei at line 38 column
Nach weiterer Recherche ist mir aufgefallen, dass diese Schreibweise mit
FUN= usw nicht verwendet wird. Da habe ich wohl zu sehr an R gedacht.
Aber wie übergebe ich dann die Argumente?
Ich habe folgendes versucht, aber da gibt es wieder einen Fehler:
1
min = fminsearch(@(alpha) G, [0;0], pb, t)
2
3
error: Invalid call to fminsearch. Correct usage is:
4
5
-- X = fminsearch (FUN, X0)
6
-- X = fminsearch (FUN, X0, OPTIONS)
7
-- [X, FVAL] = fminsearch (...)
8
error: called from
9
print_usage at line 91 column 5
10
fminsearch at line 73 column 5
11
datei at line 38 column 5
Ich würde mich sehr freuen, wenn mir da noch jemand weiterhelfen könnte!
Hi,
fminsearch nimmt 3 Argumente:
- einen Funktionspointer
- einen Vektor mit dem initial Guess
- optionen
lassen wir mal die optionen weg. Damit kannst du dich später befassen.
Beispiel, definiere eine anonyme funktion:
func = @(x,y,z) sin(x)*cos(y)*exp(z)
jetzt sollen die Parameter x,y und z bestimmt werden, damit der
Funktionswert minimal wird. Als initiale Werte verwenden wir jeweils 0.
fminsearch(func, [0, 0, 0])
liefert als ergebis die x, y und z, sodass func minimiert wird. N.B.:
fun muss keine anonyme Funktion sein; du kannst auch beliebig komplexe
Funktionen aus einem function-File hernehmen.
Funktionen mit Parametern: nehmen wir noch an, dass deine Funktion einen
Parameter hat, den du konstant lassen willst:
parameterfunc = @(x,y,z) sin(x)*cos(y)*exp(z)
func = @(x,y) parameterfunc(x, y, 42)
fminsearch(func, [0, 0])
wie oben, aber wir belassen z konstant auf 42. Das geht über den 'Umweg'
einer Hilfsfunktion.
Das sollte so in Matlab laufen; Octave kenne ich weniger gut, aber würde
erwarten, dass es da genauso geht.
Tobias P. schrieb:> Beispiel, definiere eine anonyme funktion:
Ah, vielen Dank für das Beispiel, jetzt ist mir schon etwas klarer, wie
das funktioniert!
Tobias P. schrieb:> wie oben, aber wir belassen z konstant auf 42. Das geht über den 'Umweg'> einer Hilfsfunktion.
Das habe ich nun mit meinen Funktionen versucht.
Da kommt ein neuer Fehler:
1
error: vertical dimensions mismatch (1x6 vs 1x4)
2
error: called from
3
GHelp at line 52 column 5
4
Serie10_Aufgabe2>@<anonymous> at line 59 column 27
5
fminsearch>nmsmax at line 173 column 8
6
fminsearch at line 76 column 5
7
datei at line 59 column 5
Eigentlich arbeite ich nur mit Vektoren der Größe 10 und mit Schleifen
von 1 bis 10, woran könnte der Fehler dann liegen?
Der Fehler steht doch da ;-) die Dimensionen irgendwelcher Vektoren
passen nicht. Du musst aber schon deinen Cod zeigen, wenn man dir helfen
können soll! hast du mein Beispiel ausführen können? lief das überhaupt?
Kann mir vielleicht jemand Literatur dazu empfehlen? Ich hab nicht viel
hilfreiches zu den Funktionen gefunden. Nach dem, was ich gelesen habe,
sollte die Argumentübergabe so funktionieren.
Hallo
Tobias P. schrieb:> Der Fehler steht doch da ;-) die Dimensionen irgendwelcher Vektoren> passen nicht. Du musst aber schon deinen Cod zeigen, wenn man dir helfen> können soll! hast du mein Beispiel ausführen können? lief das überhaupt?
Ich habe jetzt einige Funktionen außer meiner Hilfsfunktion GHelp zum
Laufen gebracht:
Ich verstehe nicht, wo die Dimensionen 1x6 und 1x4 herkommen (meine
Vektoren müssten die Dimension 10x1 haben).
Vielleicht hab noch jemand eine Idee dazu? Das würde mir wirklich sehr
weiterhelfen!
kim schrieb:> Ich habe jetzt einige Funktionen außer meiner Hilfsfunktion GHelp zum> Laufen gebracht:
Ich konnte jetzt den Fehler in GHelp fixen (Zeilenumbrüche zu viel...).
Allerdings will fminsearch immer noch nicht funktionieren:
1
>> min = fminsearch(@(alpha) GHelp, [0])
2
3
pb =
4
5
Columns 1 through 5:
6
7
0.0066667 0.0200000 0.0466667 0.1000000 0.1466667
8
9
Columns 6 through 10:
10
11
0.1833333 0.1700000 0.1600000 0.1300000 0.0366667
12
13
t =
14
15
Columns 1 through 6:
16
17
0.00000 0.10000 0.20000 0.30000 0.40000 0.50000
18
19
Columns 7 through 10:
20
21
0.60000 0.70000 0.80000 0.90000
22
23
error: 'alpha' undefined near line 4 column 8
24
error: called from
25
GHelp at line 4 column 5
26
@<anonymous> at line 1 column 27
27
fminsearch>nmsmax at line 173 column 8
28
fminsearch at line 76 column 5
Steht [0] nicht für den Anfangswert von a? Weshalb wird a nicht
gefunden?