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.18518516478013
Vastaavasti 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**2
Kirjoitetaan 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.
|