2012-02-06 15 views
16

Czy istnieje idiomatyczny sposób wiązania zmiennych w funkcji MATLAB? Wydaje się, że byłoby dość powszechne utworzenie funkcji, powiązanie kilku argumentów, a następnie przekazanie nowej funkcji do jakiegoś optymalizatora (w moim przypadku solver Newtona). Nie wygląda na to, że reguły o zmiennym zakresie pozwalają na rozwiązanie z funkcjami zagnieżdżonymi lub wbudowanymi. Czy powinienem po prostu stworzyć zajęcia? Wygląda na to, że MATLAB nie ma pierwszorzędnych obiektów funkcyjnych, czy to prawda? Moje poszukiwania kung-fu są coraz krótsze. Dzięki!Częściowa ocena funkcji w MATLAB

Jako przykład, przypuśćmy, że chcę znaleźć korzenie f (c, x) = x^3 + cx^2 + 2x + 3 dla różnych wartości parametru c. Mam metodę Newtona, która przyjmuje funkcję jednej zmiennej, a nie dwóch. Pętliłem więc różne wartości c, a następnie przekazałem związaną funkcję do solwera.

for c=1:10 
    g=f(c); % somehow bind value of c 
    seed=1.1; % my guess for the root of the equation 
    root=newton(g,seed); % compute the actual root 
end 
+1

Mógłbyś podać przykład tego, co mówisz? Co to jest poza 'f = @ (x, y) (x + y)'? –

+1

Masz na myśli funkcję zwracającą funkcję? na przykład 'g = @ (podstawa, x) (@ (x) mod (x, podstawa)); f = g (3); 'a teraz' f (x) 'to po prostu' mod (x, 3) '? –

Odpowiedz

19

Można to zrobić tak:

f = @(c,x)(@(x)(x^3+c*x^2+2*x+3)); 

for c=1:10 
    g=f(c); % g is @(x)(x^3+c*x^2+2*x+3) for that c 
    .... 
end 

Kluczem jest pierwsza linia: jest to funkcja, która zwraca funkcję.

tj IT powraca@(x)(x^3+c*x^2+2*x+3), o wartości c związany w.

+0

Jaka jest nazwa tego użycia @ -operatora w MATLAB (do celów wyszukiwania)? – dls

+1

Funkcja zdefiniowana za pomocą '@ (args) (return val)' nazywa się * anonimową * funkcją, a 'f' (i' g') są również nazywane "uchwytami funkcyjnymi". Zobacz [tutaj] (http://www.mathworks.com.au/help/techdoc/matlab_prog/f4-70115.html). –

+2

Imponujące, właśnie to zweryfikowałem w Octave. Drugi argument do f okazuje się być fałszywą wartością. –

0

Jestem prawie pewien, że funkcja zagnieżdżona może być używana z fminsearch. Nie wiem konkretnie o metodzie Newtona, ale domyślam się, że nie ma problemu.

+0

W przeciwieństwie do funkcji wbudowanych (które wydają się raczej bezcelowe, z uwagi na istnienie funkcji zagnieżdżonych i anonimowych), funkcje zagnieżdżone działałyby tak, jak każda zmienna w bloku kodu zagnieżdżania jest w zasięgu. Jedyną wadą jest to, że musisz jawnie nadać tym zmiennym nazwę dostępu do nich. Jest to ok, jeśli zamierzasz używać ich do czegoś innego, ale wydaje się zbędne, jeśli zamierzasz je zdefiniować i zainicjować, jeśli tylko będzie się odwoływał w funkcji zagnieżdżonej. – dls

Powiązane problemy