FreeMat

FreeMat

Avtor: David Bukovšek

O programu

(orodje/logo.jpg)

FreeMat je prosto dostopen program za numerično računanje, matematično modeliranje, risanje grafov in obdelavo podatkov. Poleg tega je močan programski jezik, ki omogoča objektno programiranje. Napisan je v programskih jezikih C in C++. Namestimo ga lahko na operacijske sisteme Windows, Mac OS X in Linux.

Program je zelo podoben Matlabu in GNU Octave. Sintaksa je v primerjavi z Matlabom identična, zato so programi napisani v FreeMat-u kompatibilni z Matlabom. Obratno pa ne velja nujno, saj FreeMat ne pozna vseh ukazov, ki jih pozna Matlab.

Povezava na spletno stran

FreeMat

Dokumentacija

Delovna površina

FreeMat ima svoj urejevalnik za pisanje datotek in programov. Za datoteke, ki so napisane v FreeMat-u, je značilna končnica .m, kar kaže na kompatibilnost z Matlabom.

Nekaj osnovnih ukazov

  • clc Počistimo delovno površino.
  • help ime_ukaza Prikličemo pomoč za ukaz.
  • exit ali quit Zapustimo program FreeMat.
  • Za znakom % pišemo komentar.

Datoteke

Datoteke delimo na skriptne in funkcijske. Skriptne datoteke vsebujejo zaporedje ukazov, funkcijske datoteke pa predpis oblike

function [y_1, y_2, ... , y_m] = ime_funkcije(x_1, x_2, ... , x_n) ,

kjer so x1, x2, ... , xn vhodni parametri, y1, y2, ... , ym pa izhodni. Če je izhodni parameter samo eden, lahko oglate oklepaje izpustimo. Predpisu sledi zaporedje ukazov, na koncu pa je treba dodati end. Funkcijske datoteke je potrebno shraniti v imenik, kjer se nahaja program FreeMat, in sicer pod enakim imenom, kot je ime funkcije, v nasprotnem primeru datoteke ni mogoče priklicati. Za razliko od Matlaba, ki datoteko ob njenem zagonu samodejno prestavi v pravi imenik (če je to potrebno), mora pri FreeMat-u uporabnik sam poskrbeti za to.

Matrike in ukazi

Osnovni objekti v FreeMat-u so matrike. Števila so 1 x 1 matrike, vektorji pa vrstice ali stolpci. Matriko napišemo v obliki

A = [1, 2, 3; 4, 5, 6; 7, 8, 9] ali A = [1 2 3; 4 5 6; 7 8 9]

in jo shranimo pod spremenljivko A. Stolpce torej ločimo s presledkom ali vejico ali vejico in presledkom, vrstice pa s podpičjem. Do matričnih elementov lahko dostopamo z navedbo indeksov v oklepaju: A(i, j) nam vrne i,j-ti element matrike A.

Nekaj osnovnih ukazov

Numerično integriranje

Program FreeMat nam omogoča numerično integracijo.

Integriranje polinoma ukaz polyint

Polinom podamo s seznamom koeficientov:

p = [1, 2, 3, 4] je polinom .

Sintaksa:

  • polyint(p, k) Vrne seznam koeficientov zintegriranega polinoma s konstanto k.
  • polyint(p) Vrne seznam koeficientov zintegriranega polinoma s konstanto 0.

Aproksimacija funkcije s polinomom ukat polyfit

Poljubno funkcijo lahko aproksimiramo z ukazom polyfit .

Sintaksa:

  • polyfit(x, y, st) Vrne koeficiente polinoma, ki predstavlja aproksimacijo funkcije nad intervalom stopnje .

Program v ozadju izvede metodo najmanjših kvadratov. Vrne nam seznam koeficientov polinoma stopnje , ki se najbolje prilega vsem točkam , za katere velja in .

Integracija preko Taylorjevega polinoma

Dano funkcijo lahko integriramo s pomočjo Taylorjevega polinoma. Najprej funkcijo čim bolje aproksimiramo s Taylorjevim polinomom. Nato integriramo dobljen polinom, saj ga je običajno precej lažje integrirati od dane funkcije. Nazadnje vstavimo zgornjo in spodnjo mejo in ju odštejemo ter tako dobimo rezultat.

FreeMat ne pozna Taylorjevega polinoma, lahko pa poskusimo s funkcijo polyfit .

Postopek:

  • Definiramo vektor .
  • Na vektorju definiramo funkcijo .
  • Uporabimo ukaz polyfit: p = polyfit(x, y, st) .
  • Na dobljenem polinomu uporabimo polyint: i = polyint(p) .
  • Uporabimo ukaz polyval: b = polyval(i, max(x)) .
  • Še enkrat uporabimo polyval: a = polyval(i, min(x)) .
  • b - a nam da vrednost integrala funkcije na intervalu .

Ta postopek je seveda nezanesljiv, poleg tega deluje dobro samo za dovolj "lepe" funkcije, pa še stopnja mora biti dovolj velika.

Ukaza trapz in cumtrapz

FreeMat pozna dva ukaza za numerično integriranje.

V ozadju ukaza trapz se izvede trapezna metoda.

  • trapz(x, y) sprejme vektor in funkcijo . Recimo, da je spodnja meja vektorja , pa njegova zgornja meja. Ukaz nam vrne vrednost izraza .
  • cumtrapz(x, y) sprejme vektor in funkcijo . Vrne vrednosti integrala na vsakem elementu vektorja .

Numerično integriranje si lahko ogledate na posnetku.


Video

Video

Na spodnjem posnetku si lahko pogledate integriranje s pomočjo aproksimacije s polinomom in z ukazom trapz .



Numerično integriranje

Graf funkcije ene spremenljivke

Osnove

  • Najprej definiramo vektor , ki nam predstavlja definicijsko območje .
  • Nad vektorjem definiramo funkcijo .
  • Uporabimo ukaz plot za risanje 2D grafov.

Sintaksa:

  • x = a:0.1:b; Vektor . Dobimo ga lahko tudi z ukazom linspace(a, b, k) , ki nam interval razdeli na delov.
  • y = exp(x); Definiramo funkcijo .
  • plot(x, y); Narišemo graf funkcije .

Dodatno

  • hold on Uporabimo, ko želimo na isto sliko narisati več grafov.
  • axis([x<sub>min</sub>, x<sub>max</sub>, y<sub>min</sub>, y<sub>max</sub>]) Narišemo graf znotraj meja in .
  • legend('besedilo_1', 'besedilo_2', ..., 'besedilo_k') Naredimo legendo za k grafov.
  • text(x, y, 'besedilo') V graf vstavimo besedilo na mesto s koordinatama .

Graf funkcije dveh spremenljivk

Osnove

  • Definiramo definicijsko območje. To je nek pravokotnik .
  • Nad definicijskim območjem definiramo funkcijo .
  • Narišemo graf z ukazom surf .

Sintaksa:

  • [x, y] = meshgrid(linspace(a, b, k), linspace(c, d, k)); definiramo matriko x in y koordinat tistih točk, ki ležijo na mreži .
  • z = x.^2 - y.^4; Definiramo funkcijo .
  • surf(x, y, z); ali samo surf(z); Narišemo poliedrski graf 3D ploskve nad definicijskim območjem.

Dodatno

  • grid on Dodamo mrežo v graf.
  • grid off Odstranimo mrežo iz grafa.
  • axis equal Na vseh koordinatnih oseh so enote enako velike.
  • xlabel('besedilo') Označimo x-os z nizom besedilo.
  • ylabel('besedilo') Podobno z y-osjo.
  • zlabel('besedilo') Podobno z z-osjo.
  • view(3) 3D pogled.

Nivojnice

Osnove

Graf funkcije dveh spremenljivk je običajno neka ploskev v prostoru. Graf lahko projeciramo na ravnino . Dobimo nivojnice, ki nam povedo, kakšen je prečni prerez ploskve na določeni višini.

  • Definiramo definicijsko območje .
  • Definiramo funkcijo .
  • Z ukazom contour narišemo nivojnice.

Sintaksa:

  • [x, y] = meshgrid(linspace(a, b, k), linspace(c, d, k)); Definicijsko območje funkcije.
  • z = x.*exp(x.^2 - y.^2); Definiramo funkcijo .
  • contour(x, y, z, n); Narišemo n nivojnic grafa v ravnino .
  • contour3(x, y, z, n); Narišemo n nivojnic grafa v prostor .

Dodatno

Naj bo h = contour(x, y, z, n) . Potem lahko graf opremimo z napisi vrednosti funkcije .

  • clabel(h, parameter1, parameter2, ...) V graf vnesemo vrednosti funkcije oziroma njeno "nadmorsko višino". Ukaz clabel omogoča dodatne parametre:
  • 'edgecolor' Niz, ki mu dodamo konkretno vrednost barve v obliki barvnega vektorja. S tem damo vrednosti funkcije v okvirček.
  • 'backgroundcolor' Niz, ki mu dodamo barvni vektor. Pobarva nam ozadje okvirja, v katerem se nahajajo vrednosti funkcije.

Graf krivulje v prostoru

Osnove

Krivuljo v prostoru običajno podamo v parametrični obliki.

  • Najprej definiramo vektor , ki pomeni parameter.
  • Definiramo funkcije , in .
  • Z ukazom plot3 narišemo krivuljo.

Sintaksa:

  • t = linspace(a, b, k); Vektor, ki pomeni parameter.
  • x = cos(t); y = sin(t); z = t; Definiramo funkcijo v parametrični obliki.
  • plot3(x, y, z); Narišemo krivuljo v prostoru.

Graf parametrično podane ploskve

Osnove

Ploskev lahko podamo tudi parametrično. Potrebujemo dva parametra.

  • Definiramo parametra in .
  • Definiramo funkcije , in .
  • Z ukazom surf narišemo ploskev.

Sintaksa:

  • [u, v] = meshgrid(linspace(a, b, k), linspace(c, d, k)); Definiramo parametra in .
  • x = r*sin(u).*cos(v); y = r*sin(u).*sin(v); z = r*cos(u); Definiramo sfero s središčem v in polmerom .
  • surf(x, y, z); Narišemo sfero.

Dodatno

  • axis square Ne glede na velikost osi , in jih naredimo vse enako velike.
  • title('besedilo') Grafu dodamo naslov besedilo.

Oglati geometrijski liki in telesa

Osnove

Orodje FreeMat nam omogoča risanje oglatih geometrijskih likov in teles v prostoru .

  • Najprej je potrebno definirati točke oziroma oglišča. Če ima geometrijski lik ali telo oglišč, jih definiramo z matriko, kjer vsaka vrstica predstavlja svoje oglišče, prvi stolpec predstavlja koordinate, drugi stolpec koordinate in tretji stolpec koordinate oglišč.
  • Nato definiramo lica ali ploskve lika. Če ima geometrijsko telo ploskev, kjer je vsaka ploskev -kotnik, to storimo z matriko. V vsaki vrstici matrike povemo katere točke iz prejšnje matrike bi radi povezali. To storimo tako, da povemo indekse vrstic matrike točk.
  • Matriko točk in ploskev povežemo z ukazom patch .

Sintaksa:

  • tocke = [x_1, y_1, z_1; x_2, y_2, z_2; ... ; x_n, y_n, z_n]; Definiramo matriko točk oziroma oglišč.
  • lica = [i_1, i_2, i_3; ... ; i_m-2, i_m-1, i_m]; Na tem primeru definiramo matriko ploskev, kar pomeni, da je geometrijsko telo sestavljeno iz trikotnikov.
  • patch('Faces', lica, 'Vertices', tocke); ploskve in točke povežemo med seboj, da nastane lik oziroma telo.

Dodatno

Ukaz patch ima lahko dodatne parametre. Glavna dva sta parametra, s katerima določimo barvo notranjosti in barvo roba.

  • 'FaceColor' Niz, ki mu dodamo barvni vektor. Pobarvamo ploskve oziroma lica.
  • 'EdgeColor' Niz, ki mu dodamo barvni vektor. Pobarvamo rob telesa.

Histogram

Osnove

Program FreeMat nam omogoča risanje stolpičnih histogramov.

  • Najprej definiramo vektor , ki nam pove, katere vrednosti nas zanimajo.
  • Vektor nam pove, kolikokrat se pojavi določena komponenta v vektorju .

Sintaksa:

  • x = linspace(a, b, k); Definiramo vektor vrednosti, ki nas zanimajo.
  • y(1:n_1) = x(1); y(1:n_2) = x(2); ... y(1:n_k) = x(k); Definiramo vektor , ki prešteje, kolikokrat se ponovi določena komponenta iz vektorja . V tem primeru se prva komponenta vektorja ponovi n1-krat, druga n2-krat, ..., zadnja nk-krat. To pomeni, da bo prvi stolpec visok n1, drugi n2, ..., zadnji pa nk.
  • hist(y, x); Narišemo stolpični histogram.

Podgrafi

Včasih bi radi na isto sliko narisali več grafov, da bi uporabniku lažje uprizorili določen problem. Če na isto sliko narišemo preveč grafov, lahko stvar hitro postane nepregledna. V tem primeru si lahko pomagamo s podgrafi.

  • Če želimo narisati grafov, platno razdelimo na delov. Grafi bodo razdeljeni na vrstic in stolpcev.

Sintaksa:

  • subplot(m, n, 1); Želimo narisati grafov. Trenutno rišemo prvi graf na mestu z indeksoma . Zadnji parameter ima vrednosti med 1 in . Če ima vrednost , rišemo graf na mestu z indeksoma .

Primerjava FreeMat in Matlab

FreeMat ukazi za numerično integriranje in risanje

  • poyint integriranje polinoma
  • trapz numerično integriranje s trapezno metodo
  • cumtrapz odsekoma numerično integriranje
  • plot graf krivulje v ravnini
  • plot3 graf krivulje v prostoru
  • surf poliedrski graf ploskve v prostoru
  • contour nivojnice v ravnini
  • contour3 nivojnice v prostoru
  • hist histogram
  • subplot risanje podgrafov

To je nekaj glavnih ukazov, ki smo jih spoznali. Matlab poleg omenjenih pozna še nekaj dodatnih.

Matlab - dodatni ukazi za integriranje in risanje

  • quad numerično integriranje po Simpsonovi metodi
  • quad2 numerično integriranje dvojnega integrala
  • mesh mrežni graf v prostoru
  • fplot graf funkcije
  • polar graf v polarnih koordinatah
  • bar paličasti graf
  • errorbar paličasti graf napak
  • stairs stopničasti graf
  • rose kotni histogram
  • compass kompasni graf
  • feather pernati graf
  • sphere sfera
  • cylinder valj

Zaključek - primerjava z Matlabom

Prednosti

  • Je zastonj, dosegljiv na spletni strani.
  • Kdor pozna Matlab, pozna tudi FreeMat.
  • Za najbolj osnovno uporabo je primerljiv z Matlabom.
  • Datoteke imajo končnico .m, zato lahko odpiramo Matlabove datoteke.

Slabosti

  • Za bolj kompleksno uporabo je slabši, pozna manj ukazov od Matlaba.
  • Na forumih so samo kode, napisane v Matlabu, ki pa v FreeMatu ne delajo nujno (ker pozna premalo ukazov).
  • Okno za risanje dela prepočasi.
0%
0%