Gnu Octave - Problem, kann Variablen nicht übergeben

Gast #5880274
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.
Angehängte Dateien:
Gast #5880288
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.
Gast #5880866
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?
Gast #5880954
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!
#5881060
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.
Gast #5881082
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?
Gast #5881286
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.
Angehängte Dateien:
Gast #5881586
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!
Angehängte Dateien:
Gast #5881595
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren