Strona 1 z 1
[matlab] jak uzywać fzero()
: 16 mar 2013, o 20:19
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ć?
[matlab] jak uzywać fzero()
: 16 mar 2013, o 20:40
autor: pawellogrd
Do fzero musisz przekazać funkcję, a przekazujesz stringa. Aby zamienić stringa na funkcję skorzystaj z str2func
[matlab] jak uzywać fzero()
: 16 mar 2013, o 20:52
autor: Ser Cubus
użyłem
error:
Undefined function 'str2func' for input arguments of
type 'double'.
dlaczego uważasz, że y to string? przeciez max(y) zadzialalo
[matlab] jak uzywać fzero()
: 17 mar 2013, o 00:16
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.
[matlab] jak uzywać fzero()
: 17 mar 2013, o 08:36
autor: Ser Cubus
teraz program blokuję się już na
,
też nie działa
[matlab] jak uzywać fzero()
: 17 mar 2013, o 15:53
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.
[matlab] jak uzywać fzero()
: 17 mar 2013, o 22:01
autor: Ser Cubus
jednak nie
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
, 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

[matlab] jak uzywać fzero()
: 20 mar 2013, o 21:27
autor: pawellogrd
Nie wiem w jaki sposób wcześniej to konwertowałem. Natomiast, który fragment kodu dokładniej wytłumaczyć?
[matlab] jak uzywać fzero()
: 20 mar 2013, o 21:58
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)
[matlab] jak uzywać fzero()
: 20 mar 2013, o 22:16
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.
[matlab] jak uzywać fzero()
: 20 mar 2013, o 22:34
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
[matlab] jak uzywać fzero()
: 21 mar 2013, o 00:56
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
[matlab] jak uzywać fzero()
: 21 mar 2013, o 09:06
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?
[matlab] jak uzywać fzero()
: 21 mar 2013, o 12:01
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ąć.