[Matlab] Macierz Vandermonde'a

PAK
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 cze 2014, o 17:12
Płeć: Mężczyzna
Lokalizacja: Środkowa Polska
Podziękował: 118 razy

[Matlab] Macierz Vandermonde'a

Post autor: PAK »

Mam wygenerować macierz Vandermonde'a o rozmiarze \(\displaystyle{ N\times N}\) ,przy czym przedostatnia kolumna ma być \(\displaystyle{ [1,2,...,N] ^{T}}\).Napisałem kod :

Kod: Zaznacz cały

function [C] = Van(N)

V=(1:N)
B=vander(V)

for i=1:N
    B(i,end-1)=i;
    C=B;
end

end
Okazuje się jednak że nie następuje podmiana przedostatniej kolumny w pętli.Gdzie jest błąd ?
jarek4700
Użytkownik
Użytkownik
Posty: 939
Rejestracja: 26 gru 2009, o 17:38
Płeć: Mężczyzna
Lokalizacja: Mazowsze
Podziękował: 5 razy
Pomógł: 228 razy

[Matlab] Macierz Vandermonde'a

Post autor: jarek4700 »

Wydaje mi się że przedostatnia kolumna od razu powinna być w takiej postaci. I nic nie trzeba modyfikować. Pokaż co zwraca np.

Kod: Zaznacz cały

vander(1:5)
miodzio1988

[Matlab] Macierz Vandermonde'a

Post autor: miodzio1988 »



możesz też tak to robić
PAK
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 cze 2014, o 17:12
Płeć: Mężczyzna
Lokalizacja: Środkowa Polska
Podziękował: 118 razy

[Matlab] Macierz Vandermonde'a

Post autor: PAK »

Zapomniałem że matlab tworzy tę macierz tak jakby obróconą, i dlatego to podstawienie nic nie dawało.Dopiero jak teraz stworzyłem Vandermonde, obróciłem poleceniem fliplr i zrobiłem podstawienie w przedostatniej kolumnie to widać zmianę.Dzięki za pomoc.
Żeby nie zakładać nowego tematu, chciałbym zrobić coś takiego : Tworzę nową funkcje o nawie Uklad ,która na wejściu pobiera N - rozmiar układu równań oraz typ funkcji generującej wektor współczynników równania.Wektor wyrazów wolnych jest rozmiarów N i \(\displaystyle{ b=[1,1,...,1]^T}\).
Na wyjściu jest wektor rozwiązań X. Rozwiązanie następuje po przez operator \

Kod: Zaznacz cały

function [X] = Uklad(N,func)

b=ones(1,N)
A=func(N)
X=A\b;

end
No i potem jak to się wywoła np:

Kod: Zaznacz cały

>> Uklad(5,inline('Van'))
To wektor b jest dobrze generowany, ale A to powstaje tylko jedna liczba, zamiast macierzy.I nie wiem co jest nie tak.
jarek4700
Użytkownik
Użytkownik
Posty: 939
Rejestracja: 26 gru 2009, o 17:38
Płeć: Mężczyzna
Lokalizacja: Mazowsze
Podziękował: 5 razy
Pomógł: 228 razy

[Matlab] Macierz Vandermonde'a

Post autor: jarek4700 »

Wywołaj tak:

Kod: Zaznacz cały

Uklad(5,@(x)Van(x))
PAK
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 cze 2014, o 17:12
Płeć: Mężczyzna
Lokalizacja: Środkowa Polska
Podziękował: 118 razy

[Matlab] Macierz Vandermonde'a

Post autor: PAK »

No więc tak.Działa ale nie tak jak powinno.Jak liczba równań jest mniejsza od 4 to jest wszytko ok.Natomiast jak jest jest większa to wyświetla się ostrzeżenie :

" Warning: Matrix is singular to working precision "

I wektor rozwiązań jest wypełniony wartościami NaN


PS. W 3. linijce zrobiłem wektor kolumnowy b zamiast wierszowego bo wymiary by się nie zgadzały)
jarek4700
Użytkownik
Użytkownik
Posty: 939
Rejestracja: 26 gru 2009, o 17:38
Płeć: Mężczyzna
Lokalizacja: Mazowsze
Podziękował: 5 razy
Pomógł: 228 razy

[Matlab] Macierz Vandermonde'a

Post autor: jarek4700 »

Nie ma w tym nic dziwnego. Macierz ma dwie takie same kolumny (jak zrobisz ten fliplr i podmienisz przedostatnią kolumnę) wiec jej wyznacznik się zeruje. Jak macierz jest \(\displaystyle{ 3 \times 3}\) to podmienianie niczego nie zmienia i dlatego działa. Swoją drogą dla \(\displaystyle{ 2 \times 2}\) znów powinno nie działać.
W ogóle to kto to wymyślił żeby podmieniać tę kolumnę i po co?
Może chodziło tylko o wybór odpowiedniej wersji macierzy Vandermonde'a. Bo jedna jest taka jak Matlab generuje, a druga tak jakby odbiciem lustrzanym. Z tego by wynikało, że chodzi o tę wersję generowaną przez Matlaba.
PAK
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 cze 2014, o 17:12
Płeć: Mężczyzna
Lokalizacja: Środkowa Polska
Podziękował: 118 razy

[Matlab] Macierz Vandermonde'a

Post autor: PAK »

Nie mam pojęcia, znalazłem takie zadanie gdzieś w internecie.
Mam jeszcze jedno pytanie.Co to jest właściwie

Kod: Zaznacz cały

Uklad(5,@(x)Van(x))
?

Gdyby funkcja miała więcej danych wejściowych np: dwie to wtedy :

Kod: Zaznacz cały

Uklad(5,@(x,y)Van(x,y))
?
jarek4700
Użytkownik
Użytkownik
Posty: 939
Rejestracja: 26 gru 2009, o 17:38
Płeć: Mężczyzna
Lokalizacja: Mazowsze
Podziękował: 5 razy
Pomógł: 228 razy

[Matlab] Macierz Vandermonde'a

Post autor: jarek4700 »

Jest to przykład wykorzystania tzw. funkcji anonimowej.

Można ją zadeklarować np. tak:

Kod: Zaznacz cały

fun = @(x,y,z)(x+2*y+3*z)
Wtedy można wywołać tak:

Kod: Zaznacz cały

fun(1,2,0)
co zwróci \(\displaystyle{ 1+2\cdot 2 + 3\cdot 0 = 5}\)

W tamtym przypadku deklaracja powstała jakby w locie w parametrze wywołania.
Ponadto sposób w jaki funkcja działa jest opisany w m-pliku a nie od razu w deklaracji. Oba sposoby są możliwe.

Funkcja anonimowa jest przydatna właśnie jak chcemy przekazać ją do innej funkcji w parametrze wywołania.
ODPOWIEDZ