c=[1,-4,4,-1] juuret=roots(c) polyval(c,juuret) % Lasketaan polynomin arvot juurissa. a=min(juuret)-.2 b=max(juuret)+.2 x=linspace(a,b); y=polyval(c,x); plot(x,y);grid % Zoomaamalla ja koskettamalla nollapistettä, % saadaan tosi tarkkaan. dc=polyder(c) % Matlab osaa derivoida polynomeja. dj=roots(dc) minmax=polyval(c,dj) [dj, minmax] hold on plot(dj,minmax,'o') ylim([min(minmax)-.2, max(minmax)+.2]) % pelkkä y-osa axis-komentoa. shg
Itse asiassa numeeriset optimointialgoritmit eivät yleensä hae derivaatan nollakohtia, vaan tekevät min/max-haun suoraan (brutaalisti, hienovaraisesti tai siltä väliltä).
plot(x,polyval(c,x));grid % Zoomataan maksimipistettä: x1=linspace(.6,.7); y1=polyval(c,x1); M=max(y1) joo=M==y1 xM=x1(joo) makspiste=[xM,M] % Zoomataan, 0.66 on aika lähellä, mutta % nyt ei resoluutio riitä. % Tarkennetaan: x1=linspace(.65,.67); y1=polyval(c,x1); M=max(y1) joo=M==y1 xM=x1(joo) makspiste=[xM,M] % Zoomataan, 0.6666 on aika lähellä, mutta >> format long >> makspiste=[xM,M] makspiste = 0.66676767676768 0.18518516478013Vastaavasti min-piste.
> h:=1-x^3+exp(-2*x)*sin(x); 3 h := 1 - x + exp(-2 x) sin(x) > dh:=diff(h,x); 2 dh := -3 x - 2 exp(-2 x) sin(x) + exp(-2 x) cos(x) > collect(dh,exp(-2*x)); 2 (-2 sin(x) + cos(x)) exp(-2 x) - 3 x > fortran(%); # On tähän varmasti parempikin. Sitäpaitsi työarkilla tehtäessä # voidaan kopioida syöteriville. t0 = (-2*sin(x)+cos(x))*exp(-2*x)-3*x**2Kirjoitetaan tiedosto hoo.m
function [y,dy]=hoo(x) y=1-x.^3+exp(-2*x).*sin(x); % * ja ^ muutettiin .* ja .^ dy=(-2*sin(x)+cos(x)).*exp(-2*x)-3*x.^2; % * ja ^ muutettiin .* ja .^Testataan ja verrataan Mapleen:
>> [y,dy]=hoo([0 1]) y = 1.0000 0.1139 dy = 1.0000 -3.1546
x1=linspace(0,2);x2=linspace(2.01,4);x=[x1,x2]; y=(x.^2-4)./(x.^3-8); x0=x(isnan(y)); y(isnan(y))=1/3; clf;plot(x,y,'r');hold on;plot(x0,1/3,'ob');grid;shg;Siis m-tiedosto: f6.m
function y=f6(x) y=(x.^2-4)./(x.^3-8); y(isnan(y))=1/3;Tässä ei pyydetty palauttamaan poikkeuspisteen x-koordinaattia, tosin tyypillisesti se lienee jo tiedossa. Yllä olevassa istunnossa se hoidettin yleisluontoisesti.
Huom: Ohjelmankehitys kannattaa yleensä tehdä ideoimalla ensin yllä olevaan tapaan, sitten vasta ruvetaan kirjoittamaan funktiotiedostoa. (Niin minä ainakin teen.) Toinen tapa on tietysti käyttää debuggeria, sekin on olemassa.
|