Forum: PC Hard- und Software Gnu Octave - Problem, kann Variablen nicht übergeben


von kim (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Jingling Caterpillar (Gast)


Lesenswert?

>> help fminsearch

Example:

          fminsearch (@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])

Das scheint ein Funktionspointer zu sein.

von Jingling Caterpillar (Gast)


Lesenswert?

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.

von kim (Gast)


Lesenswert?

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?

von kim (Gast)


Lesenswert?

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!

von Tobias P. (hubertus)


Lesenswert?

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.

von kim (Gast)


Lesenswert?

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?

von Tobias P. (hubertus)


Lesenswert?

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?

von kim (Gast)


Angehängte Dateien:

Lesenswert?

Tobias P. schrieb:
> hast du mein Beispiel ausführen können? lief das überhaupt?

Das hätte ich wohl zuerst probieren sollen...
1
>> function r = fun(x,y,z)
2
r=sin(x)*cos(y)*exp(z)
3
end
4
>> fminsearch(fun, [0,0,0])
5
error: 'x' undefined near line 2 column 7
6
error: called from
7
    fun at line 2 column 2

Ich hab meinen Code trotzdem schon mal angehängt: DichteB_n300.m enthält 
die u_x-Werte und datei.m meinen eigentlichen Code.

von kim (Gast)


Lesenswert?

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.

von kim (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
function fx = fX(t,alpha)
2
  fx = (t^alpha)*(1-t)*(alpha+1)*(alpha+2)
3
end
4
5
function pk = pK(alpha, tk)
6
  pk = 0.1*fX(tk+0.5,alpha)
7
end
8
9
function g = G(alpha, argpb, argt)
10
  sum=0
11
  for k=1:10
12
    s=0
13
    s=argpb(k)-pK(alpha, argt(k))
14
    s=s*s
15
    sum=sum+s
16
  end
17
  g=sum
18
end
19
20
function g = GHelp(alpha)
21
  pb=[0.0066667   0.0200000   0.0466667   0.1000000   0.1466667   0.1833333
22
   0.1700000  0.1600000  0.1300000  0.0366667]
23
   t=[0.00000   0.10000   0.20000   0.30000   0.40000   0.50000
24
   0.60000   0.70000   0.80000   0.90000]
25
   g=G(alpha, pb, t)
26
 end

Beim Aufruf von GHelp passiert folgendes:
1
>> GHelp(2)
2
3
error: vertical dimensions mismatch (1x6 vs 1x4)
4
error: called from
5
    GHelp at line 2 column 5

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!

von kim (Gast)


Lesenswert?

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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.