Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

inferno
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 lip 2010, o 17:47
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: inferno »

Hej Wam,

piszę pewien program w Octave, który jako wejście powinien dostawać funkcję "wielowymiarową". Nie wiem czy jest to określenie poprawne ale chodzi mi o coś takiego:

A(x,y) = \(\displaystyle{ \left[\begin{array}{ccc}x^2& \frac{2}{x} &3\\4x^2&5x&6y\\7&8y&9x+1\end{array}\right]}\)

Generalnie rzecz biorąc powinna być to macierz która zamiast konkretnych wartości (niekoniecznie na wszystkich polach) posiada równania funkcji.
Argumenty w trakcie obliczeń będą się zmieniać i przy każdej zmianie powinienem mieć możliwość obliczania nowej macierzy dla tych zmienionych wartości.

Powinno to być metoda działająca dla przypadku n czyli macierzy o różnych wymiarach - dla konkrentego przypadku mógłbym sam napisać odpowiednią funkcję, to mnie jednak nie urządza a napisanie funkcji uniwersalnej byłoby bardziej czasochłonne i skomplikowane niż program w którym chce to wykorzystać...

Przypuszczam, że Octave posiada odpowiednie metody do tego, być może ktoś z Was je zna. Ja niesety nie.

Wiecie jak to zrobić?
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: Szemek »

Domyślam się, że chodzi Ci o obliczanie wyznacznika z macierzy.

Przejrzyj dokumentację do programu szukając zagadnień związanych z: matrix, determinant.
Zwykle w programach matematycznych, aby obliczyć wyznacznik trzeba wywołać funkcję det na macierzy.
inferno
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 lip 2010, o 17:47
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: inferno »

Nie, nie chodzi mi o wyznaczenie wyznacznika z macierzy. Jeżeli to ma jakieś znaczenie to chcę zaimplementować wielowymiarową metodę Newtona i tam muszę jako wejście podać wektor z równaniam funkcji i Jakobian który jest macierzą z równaniami funkcji.
Tak bym później mógł na przykład zrobić coś takiego J(z) gdzie z jest wektorem, który będzie się zmieniał i otrzymać wartość Jakobiana dla aktualnej wartości wektora.

------ Na Forum matematycznym prawie nikt nie korzysta z Octave/MatLaba ?
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: pfauel »

nie jestem pewny, czy o to Tobie chodzi, ale myślę, że przydadzą się Tobie funkcje "eval", "feval".

Wtedy przykładowo, dla macierzy:
\(\displaystyle{ A(x,y)=\left[ \begin{array}{cc}x^2&2y&3y^3&x+1\end{array}\right]}\)
napiszesz w Matlab/Octave coś takiego:

Kod: Zaznacz cały

A = {'power(x,2)', '2*y';'3*power(y,3)', 'sin(x)'}
I potem poprostu żeby odwołać się do funkcji \(\displaystyle{ 2y}\) napiszesz coś takiego:

Kod: Zaznacz cały

res = eval(A(1,2))
(jeśli y miało wartość przykładowo 4 to teraz res otrzyma wartość 8 :) )
oczywiście przedtem musisz jakoś sobie zdefiniować x i y.

Mało używam Octave, ale widzę, że nikt Tobie nie odpisuje to spróbowałem. Mam nadzieję, że pomogłem.
pozdrawiam
inferno
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 lip 2010, o 17:47
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: inferno »

Dzięki za odpowiedź. Jest to jakieś rozwiązanie choć niestety nadal nie idealne...
Mogę napisać sobie funkcję która będzie tworzyć z tak podanych funkcji macierz i będzie to słuszne dla przypadku ogólnego n czyli jakiś postęp jest. Niestety problem polega na tym, że przy takiej opcji będzie to się sprawdzało tylko dla konkrentej liczby zmiennych (np. dwóch - x i y) a przynajmniej ja tak to widzę - może po prostu nie wpadłem na to jak to rozwiązać inaczej.

Ideałem byłoby natomiast rozwiązanie które pozwalałoby mi podawać wektor który by zawierał kolejne wartości. Czyli jak mam wektor o wymiarze 2x1 (czy 1x2) to mam tak jakby przypadek dla funkcji ze zmiennymi x1, x2 (x, y jak kto woli) jak ma wymiar 3x1 (czy 1x3) to x1,x2,x3 (czy x,y,z) itd.

Po prostu przy powyższym wypadku zawsze muszę dać jako wejście do programu np. x, y dlatego liczba zmiennych dla funkcji jest ograniczona. Gdybym mógł dać wektor to by takiego ograniczenia nie było.
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: pfauel »

ok, chyba mam rozwiązanie, chociaż to się po mału dość skomplikowane robi :)
jeśli dobrze zrozumiałem to chcesz korzystać z tych funkcji, co masz zapisane w macierzy, i chcesz mieć możliwość przekazywania im dowolnych zmiennych, jako parametru, a nie żeby dana funkcja zawsze wykonywała się ze zmienną np. x. Dobrze rozumiem?
Rozwiązanie wygląda tak:
Dla przykładowej matrycy:
\(\displaystyle{ A=\left[ \begin{array}{cc}x^2&2x&sin(x)&x+y\end{array}\right]}\)
kod w Matlab'ie będzie wyglądał tak:

Kod: Zaznacz cały

% tworzymy nasza liste z funkcjami:
A = cell(2);
A{1,1} = @(x) power(x,2);
A{1,2} = @(x) 2*x; 
A{2,1} = @(x) sin(x);
A{2,2} = @(x,y) x+y;
% tworzymy wektor na przykładzie, którego pokażemy możliwosc wybierania parametrow dla poszczególnych funkcji:
v = rand(4,1);
% a teraz sposób w jaki będziemy wywoływać nasze funkcje z roznymi parametrami
feval(A{1,2}, v(1)) % oczywiscie parametr nie musi pochodzic teraz z wektoru, macierzy itp, parametr jest teraz dowolny...
feval(A{2,2}, v(3), v(4)) % dwa parametry, bo funkcja ma dwa parametry
Funkcje zapisuję na liste jako function_handle.

Niestety function_handle nie da się zapisać w normalnej macierzy - trzeba korzystać z list. Mam nadzieje jednak, że to wystarczy do Twojego zadania. :)
pozdrawiam
inferno
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 lip 2010, o 17:47
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?

Post autor: inferno »

Dzięki ale jak to później przemyślałem to okazało się, że to co poprzednio mi napisałeś wystarczy. Może dałoby się to zrobić lepiej ale i tak jest nieźle.

Zrobiłem sobie funkcję która przyjmuje jako parametr wektor i listę funkcji w takiej postaci jak podałeś wyżej tj.:

Kod: Zaznacz cały

A = {'power(x,2)', '2*y';'3*power(y,3)', 'sin(x)'}
Z taką różnicą, że zamiast x czy y podaje się w(i) gdzie w to wektor.
Funkcja ta sprawdza rozmiar A i jako wyjście tworzy gotową macierz. Odpowiednią ilość razy jest wywoływana we właściwym programie (dane w wektorze się zmieniają) i wszystko działa tak jak trzeba.
Dzięki temu nie ma ograniczenia na ilość zmiennych czy wymiar macierzy :)
Problem można więc uznać za rozwiązany chyba, że ktoś wpadnie na prostszy sposób.
ODPOWIEDZ