Scilab

Scilabin käyttö on hyvin samantyylistä kuin Matlabin, jota monet ovat koulussa ehkä käyttäneet. Matlabin hinnoittelu ei vaan ole kovin käyttäjäystävällistä oppilaitosten ulkopuoliseen käyttöön.

Seuraavassa on pari yksinkertaista esimerkkiä Scilabin käytöstä.

Lineaarinen yhtälöryhmä

Lineaarisen yhtälöryhmän ratkaisu on matriisilaskennan “Hello World”-esimerkki.

1x + 2y + 3z = 4
7x – 3y +2z = -5
1x + 0y – 1z = 2

Kirjoitetaan yhtälöryhmä matriisimuotoon:

Ax = b, joka kerrotaan vasemmalta A:n käänteismatriisilla inv(A):

x = inv(A)*b. Lopuksi tarkastetaan, että tulos täsmää:

Ax – b. Tulokseksi pitäisi saada nollavektori.

Ja sama scilabilla:

--> A = [1 2 3; 7 -3 2; 1 0 -1]
 A  = 

   1.   2.   3.
   7.  -3.   2.
   1.   0.  -1.

--> b = [4; -5; 2]
 b  = 

   4.
  -5.
   2.

--> x = inv(A) * b
 x  = 

   0.9333333
   3.1333333
  -1.0666667

--> A * x - b
 ans  =

   1.776D-15
  -8.882D-16
   0.       

Matka pallon pintaa pitkin

Toinen (hieman monimutkaisempi tai ainakin pitempi) esimerkki vektorilaskennan puolelta.

Kuinka pitkä matka on Hervannan uimahallin pihasta Pariisin Notre Damen aukiolle (teoreettisen) maapallon pintaa pitkin? Ja mihin suuntaan pitäisi lähteä?

Lähtötietoja

Paikat (Google maps)
Piha: 61.453161, 23.842881
Aukio: 48.853581, 2.348070

Ikivanhan metrin määritelmän mukaan matka päiväntasaajalta (pohjois)navalle on kymmenen miljoonaa metriä eli 10 000 km.

Laskenta

Matka

  • Määritetään laskentakoordinaatisto, jonka origo on maapallon keskipisteessä, x-akselin suunta on päiväntasaajalle nollapituuspiirin kohdalla ja y-akselin suunta on pohjoisnavalle.
  • Halkaistaan maapallo kahtia nollapituuspiirin kohdalta ja määritetään tasolle yksikkövektori, joka osoittaa maapallon keskipisteestä päiväntasaajalle.
  • Kierretään em. yksikkövektoria leveyspiirin verran (pohjoiseen). Saadaan suuntavektorin y-koordinaatti.
  • Viipaloidaan maapallo sitten em. leveyspiirin kohdalta.
  • Kierretään edellisessä kierrossa saatua x-koordinaattia pituuspiirin verran (itään). Saadaan suuntavektorin x- ja z-koordinaatit.
  • Sama homma toiselle paikalle ja on saatu kaksi suuntavektoria.
  • Suuntavektorien (pituus=1) välisen kulman kosini on vektorien pistetulo. Tästä saadaan niiden välinen kulma.
  • Kaaren pituus on säde kertaa kulma (radiaaneina). Ongelman ensimmäinen osa on ratkaistu!

Suunta

  • Määritetään tason, jolla ovat pihan ja aukion suuntavektorit, suunta sitä vastaan kohtisuoralla vektorilla.
  • Määritetään tason, jolla ovat pihan ja pohjoisnavan suuntavektorit, suunta sitä vastaan kohtisuoralla vektorilla.
  • Lasketaan edellisten vektoreiden välinen kulma pistetulon avulla.
  • Arvataan meneekö edellä saatu kulma idän vai lännen puolelle. Ongelma on ratkaistu!

Ja sama scilabilla:

// Matka

--> Piha = [61.453161, 23.842881];

--> Piha = Piha * %pi/180 //Kulmat radiaaneiksi
 Piha  = 

   1.07256   0.4161368

--> Aukio = [48.853581, 2.348070];

--> Aukio = Aukio * %pi/180 //Kulmat radiaaneiksi
 Aukio  = 

   0.8526558   0.0409816

--> MaapR = 2 * 10000 / %pi //Maapallon säde
 MaapR  = 

   6366.1977

--> x = [1;0]; //Yksikkövektori

--> Lev = rotate(x,Piha(1))
 Lev  = 

   0.477877 
   0.8784267

--> SPiha = Lev(2); //y-koordinaatti talteen

--> Lev(2) = 0;

--> Pit = rotate(Lev,Piha(2))
 Pit  = 

   0.4370938
   0.1931722

--> SPiha = [Pit(1); SPiha; -Pit(2)] //x- ja z-koordinaatit talteen
 SPiha  = 

   0.4370938
   0.8784267
   -0.1931722

--> Lev = rotate(x,Aukio(1))
 Lev  = 

   0.6579855
   0.7530306

--> SAukio = Lev(2); //y-koordinaatti talteen

--> Lev(2) = 0;

--> Pit = rotate(Lev,Aukio(2))
 Pit  = 

   0.6574331
   0.0269577

--> SAukio = [Pit(1); SAukio; -Pit(2)] //x- ja z-koordinaatit talteen
 SAukio  = 

   0.6574331
   0.7530306
   -0.0269577

--> Pistetulo = sum(SPiha.*SAukio)
 Pistetulo  = 

   0.9540496

--> Kulma = acos(Pistetulo)
 Kulma  = 

   0.3043246

--> Matka = Kulma * MaapR
 Matka  = 

   1937.3904

// Suunta

--> RTulo = cross(SAukio, SPiha) //Ristitulo on kohtisuorassa
 RTulo  = 

  -0.1217842
   0.1152147
   0.2483618

--> Pituus = sqrt(sum(RTulo.*RTulo))
 Pituus  = 

   0.2996488

--> STAukio = RTulo / Pituus //Suunta yksikkövektoriksi
 STAukio  = 

  -0.406423 
   0.3844992
   0.828843 

--> SPohj = [0; 1; 0]; //Pohjoisnavan suunta

--> RTulo = cross(SPohj, SPiha) //Ristitulo on kohtisuorassa
 RTulo  = 

  -0.1931722
   0.       
  -0.4370938

--> Pituus = sqrt(sum(RTulo.*RTulo))
 Pituus  = 

   0.4778770

--> STPohj = RTulo / Pituus //Suunta yksikkövektoriksi
 STPohj  = 

  -0.40423  
   0.       
  -0.9146574

--> Pistetulo = sum(STAukio.*STPohj)
 Pistetulo  = 

  -0.5938190

--> Suunta = acos(Pistetulo)
 Suunta  = 

   2.2065933

--> Suunta = Suunta * 180/%pi //Suunta asteiksi
 Suunta  = 

   126.42849

--> Suunta = 360 - Suunta //Lännen puolella
 Suunta  = 

   233.57151

Taajuusvaste

Lainataan XCos-esimerkissä olevan jousi-massa-vaimennin-järjestelmän siirtofunktiota, mutta hieman pienemmällä vaimennuksella, ja määritellään sille taajuusvaste (Bode).

Siirtofunktio: 1 / (s2 + s + 20)

Scilab:

--> s = %s
 s  = 

  s

--> G = 1/(s*s+s+20)
 G  = 

              
       1      
   ---------  
   20 +s +s²  

--> sys = syslin('c',G)
 sys  = 

              
       1      
   ---------  
   20 +s +s²  

--> bode(sys,0.1,5)

Ja tulos:

x