Mat-1.414, V2 kevät 2000

Harjoitus no 0

HA



Sisältö

  1. Tehtävä 2
  2. Tehtävä 4
  3. Tehtävä 6

Viitteitä


Tehtävä 2

Komennot

 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

Jos kyseessä olisi muu kuin polynomi

Tällöin täytyisi joko muodostaa derivaatan lauseke (Maplella tai käsin) ja kirjoittaa m-tiedostoksi tai hakea max ja min suoraan. Tehdään jälkimmäisellä (raakaan voimaan perustuvalla) tavalla.

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.

Ajo

No ei muuta kuin "cut/paste" ja Matlabiin.



Tehtävä 4

Aloitetaan teksti-Maplella:
> 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


Tehtävä 6

 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.



Minä Itse
TKK/tietotekn/informaatioverkostot
e-mail: mina.itse@hut.fi