[matlab] jak uzywać fzero()

Mathematica, Matlab, Statistica, LaTeX i wszelkiego rodzaju oprogramowanie przydatne matematykowi w pracy. Miejsca w sieci poświęcone zagadnieniu.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

hej,
czy mógłby mi ktoś wytłumaczyć jak użyć funkcji fzero()?

Kod: Zaznacz cały

od = input('przedzial od: ');
do = input('przedzial do: ');
x = od : 0.1 : do;
y = input('Podaj wielomian: '); % niech bedzie np (x-0.15).^3

x_0 = = input('Podaj przyblizone miejsce zerowe: '); %dla naszego przykładu dalbym 0
miejsceZerowe = fzero(y, x_0);
dostaje : FUN must be a function, a valid string expression, or an
inline function object.

co z tym zrobić?
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Do fzero musisz przekazać funkcję, a przekazujesz stringa. Aby zamienić stringa na funkcję skorzystaj z str2func
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

użyłem

Kod: Zaznacz cały

miejsceZerowe = fzero(str2func(y), x_0)
error:
Undefined function 'str2func' for input arguments of
type 'double'.

dlaczego uważasz, że y to string? przeciez max(y) zadzialalo
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Przepraszam, źle odczytałem. Spróbuj linię 4 zamienić na y = input('Podaj wielomian: ','s'); i wtedy użyć miejsceZerowe = fzero(str2func(y), x_0)

Jak sam widzisz - u Ciebie \(\displaystyle{ y}\) jest typu double, a raczej powinno być typu function.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

teraz program blokuję się już na

Kod: Zaznacz cały

plot(x, y)
,

Kod: Zaznacz cały

plot(x, str2func(y))
też nie działa
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Ok. To zadziała na pewno:

Kod: Zaznacz cały

od = input('przedzial od: ');
do = input('przedzial do: ');
x = od : 0.1 : do;
y = str2func(['@(x)' input('Podaj wielomian: ','s')]);

x_0 = input('Podaj przyblizone miejsce zerowe: ');
miejsceZerowe = fzero(y, x_0);
Tyle, że tutaj \(\displaystyle{ y}\) jest funkcją, bo tego wymaga fzero. Natomiast do użycia plot potrzebujesz podać wektor liczb, a nie funkcję, więc przy pomocy tej funkcji możesz utworzyć taki wektor, aby przekazać go następnie do funkcji plot.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

jednak nie :P

Kod: Zaznacz cały

 Error using plot
Conversion to double from function_handle is not possible.

Kod: Zaznacz cały

Undefined function 'max' for input arguments of type 'function_handle'.
ale fzero działa


edit:
użyłem tego co napisałeś i zamist wstawiłem

Kod: Zaznacz cały

subs(y, x)
, teraz działa wszytko, zarówno min, max, plot jak i fzero. Możesz mi teraz wytłumaczyć jak to działa, bo ja nie mam zielonego pojęcia co tam się dzieje :D
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Nie wiem w jaki sposób wcześniej to konwertowałem. Natomiast, który fragment kodu dokładniej wytłumaczyć?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

zacznijmy od tego:
1)

Kod: Zaznacz cały

y = str2func(['@(x)' input('Podaj wielomian: ','s')]);
czym jest y? rozumiem, że jest to string, przekonwertorowany na funkcję, ale co w tym zapisie zmienia @?


2)

Kod: Zaznacz cały

x = -5 : 0.1 : 5;
y = input('Podaj wielomian: '); % niech bedzie np (x-0.15).^3
tutaj x jest macierzą (wektorem ?) 100 elementową, za to nie wiem czym jest y, komputer tutaj utworzył macierz [y] również 100 elementową z wartosciami \(\displaystyle{ y_i = f(x_i)}\) czy może jest to po prostu funkcja (nie w pojęciu matlaba tylko zwykłym)
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Ok, a więc po kolei:

1) Najłatwiej chyba będzie to pokazać na przykładzie prostej funkcji

Załóżmy, że input zwraca 2*x. Wtedy otrzymujesz str2func(['@(x)' '2*x']), co jest z kolei równoważne
str2func('@(x) 2*x'), a to z kolei jest równoważne @(x) 2*x czyli już nie string ale funkcja. W taki sposób tworzy się w matlabie funkcję anonimową (więcej o tym możesz przeczytać tutaj: ), która bierze \(\displaystyle{ x}\) jako swój argument i jej wartością dla tego argumentu jest \(\displaystyle{ 2 \cdot x}\).

2) Tak, \(\displaystyle{ x}\) jest wektorem \(\displaystyle{ 100}\)-elementowym. W przypadku tego kodu \(\displaystyle{ y}\) również jest wektorem \(\displaystyle{ 100}\)-elementowym składającym się z wartości obliczonych przez funkcję (w ujęciu zwykłym, nie matlaba), którą podałeś w inpucie. Matlab liczy to w taki sposób: bierze po kolei elementy z wektora \(\displaystyle{ x}\) (czyli taka pętla for) i podstawia pod \(\displaystyle{ x}\) w inpucie, który podasz daną wartość, np. dla wektora \(\displaystyle{ x=\left[ 1\mbox{ }2\mbox{ }3 \right]}\) wektor \(\displaystyle{ y}\) zostałby obliczony następująco:

y(1)=input('Podaj wielomian: ') gdzie \(\displaystyle{ x=1}\)
y(2)=input('Podaj wielomian: ') gdzie \(\displaystyle{ x=2}\)
y(3)=input('Podaj wielomian: ') gdzie \(\displaystyle{ x=3}\)

np. dla input=x.^2 mamy:

y(1)=1.^2=1.0

y(2)=2.^2=4.0

y(3)=3.^2=9.0

Czyli otrzymujesz wektor \(\displaystyle{ y}\) składający się z liczb (typ double): \(\displaystyle{ y=\left[ 1.0\mbox{ }4.0\mbox{ }9.0\right]}\) . Czyli \(\displaystyle{ y}\) jest traktowany przez matlaba jako wektor liczb, nie funkcja.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

więc co mam zrobić jeżeli chcę obliczyć miejsca zerowe, jeżeli krok w dziedzinie to 0,1,a miejsce zerowe jest w jakimś pkt .05 ??

i jak zaimplementować coś takiego (chodzi o szukanie miejsce zerowych

Kod: Zaznacz cały

for int i = poczatek_dziedziny : 0.1: koniec_dziedziny
     if y(i)*y(i+1) < 0
         x_0 = fzero(y, x(i));
     end
end
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Jak dobrze rozumiem to taki kod powinien dać dobry wynik:

Kod: Zaznacz cały

poczatek_dziedziny = input('przedzial od: ');
koniec_dziedziny = input('przedzial do: ');
x = poczatek_dziedziny : 0.1 : koniec_dziedziny;
y = str2func(['@(x)' input('Podaj wielomian: ','s')]);
wartosci_y = y(x);
wartosci_x_w_dziedzinie = x(y(x)>=poczatek_dziedziny & y(x)<=koniec_dziedziny);
wartosci_y_w_dziedzinie = wartosci_y(wartosci_y>=poczatek_dziedziny & wartosci_y<=koniec_dziedziny);

for i = 1:1:numel(wartosci_y_w_dziedzinie)-1
     if wartosci_y_w_dziedzinie(i)*wartosci_y_w_dziedzinie(i+1) <= 0
         x_0 = fzero(y, wartosci_x_w_dziedzinie(i));
     end
end

Ser Cubus
Użytkownik
Użytkownik
Posty: 1401
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[matlab] jak uzywać fzero()

Post autor: Ser Cubus »

przy obliczaniu wartosci_x_w_dziedzinie się sypie, coś mu się z nawiasami nie podoba, ale dzięki Tobie wpadlem na odpowiednie rozwiązanie

mógłbym napisać do Ciebie na gg w sprawie tego programu?


teraz mam taki problem:

Kod: Zaznacz cały

for int i =1  :  jakas_wart
     if ....
         i = i+2;
    end
end
czemu nie mogę zwiększyć indeksu?
pawellogrd
Użytkownik
Użytkownik
Posty: 843
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[matlab] jak uzywać fzero()

Post autor: pawellogrd »

Może masz innego matlaba niż ja - mi tamten kod działa bezproblemowo - może podaj dokładną treść błędu?

GG niestety nie używam.

Co do pętli for - nie możesz zwiększyć indeksu, bo i tak to nic nie zmieni. Matlab przy każdym przebiegu pętli resetuje wartość \(\displaystyle{ i}\), tzn. przypisuje do tej zmiennej kolejną wartość z wektora \(\displaystyle{ \left[ 1\mbox{...}jakas_wartosc\right]}\), więc tutaj nie możesz tak zrobić. Powinien być inny sposób na to, co chcesz osiągnąć.
ODPOWIEDZ