Funkcja wielowymiarowa w Octave/MatLab - jak to zrobić?
-
- 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ć?
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ć?
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ć?
- Szemek
- 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ć?
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.
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.
-
- 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ć?
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 ?
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 ?
-
- 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ć?
nie jestem pewny, czy o to Tobie chodzi, ale myślę, że przydadzą się Tobie funkcje "eval", "feval".
\(\displaystyle{ A(x,y)=\left[ \begin{array}{cc}x^2&2y&3y^3&x+1\end{array}\right]}\)
napiszesz w Matlab/Octave coś takiego: I potem poprostu żeby odwołać się do funkcji \(\displaystyle{ 2y}\) napiszesz coś takiego:
(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
\(\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)'}
Kod: Zaznacz cały
res = eval(A(1,2))
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
-
- 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ć?
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.
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.
-
- 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ć?
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:
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
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
Niestety function_handle nie da się zapisać w normalnej macierzy - trzeba korzystać z list. Mam nadzieje jednak, że to wystarczy do Twojego zadania.
pozdrawiam
-
- 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ć?
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.:
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.
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)'}
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.