MATLAB sopii hyvin erilaisten numeeristen ongelmien ratkaisuun. Alla muutamia perusongelmia ja niihin liittyviä MATLAB-esimerkkejä.
Matemaattiset kaavat tehdään MathJax:lla, tässä testi: $$e^{i\, \pi} = -1$$Lineaarinen yhtälöryhmä ratkeaa MATLABin takakeno-operaatiolla. Jos yhtälöitä on enemmän kuin tuntemattomia (kerroinmatriisin aste on pienempi kuin tuntemattomien lukumäärä) saadaan pienimmän neliösumman ratkaisu.
Yhtälöryhmä
| 10x1-7x2 | = 7 |
| -3x1+2x2+6x3 | = 4 |
| 5x1-x2+5x3 | = 6 |
» A=[10,-7,0;-3,2,6;5,-1,5]
A =
10 -7 0
-3 2 6
5 -1 5
» b=[7,4,6]'
b =
7
4
6
Yhtälöryhmä ratkeaa takakenolla
» x=A\b
x =
0
-1
1
ja ratkaisun voi tarkistaa matriisikertolaskulla:
» A*x
ans =
7
4
6
Tarkastellaan vektoreihin x ja y talletettuja
datapisteitä. Polynomi-interpolaatio datapisteille saadaan
polyfit-funktiolla. Se palauttaa sovituspolynomin
kertoimet, joita vastaavan polynomin arvoja voi laskea
polyval:n avulla.
Interpoloituja taulukkohakuja voi tehdä interp1-
ja interp2-funktioilla.
Esimerkki: Valitaan funktiosta
tasavälisesti pisteitä ja piirretään polynomi-interpolaatiot, jotka kulkee valittujen pisteiden kautta. (Esimerkki on peräisin Runge-nimiseltä matemaatikolta (1901). )
rungefun=@(x)1./(1+25*x.^2) x=linspace(-1,1); plot(x,rungefun(x),'k'); hold on; axis([-1,1,-0.4,1.3]) for n = [4,6,8,10,20] xp = linspace(-1,1,n); yp = rungefun(xp); plot(x,polyval(polyfit(xp,yp,n-1),x)); end hold off; axis normal;
Datan sovitus annettuun funktioluokkaan (malliin) on sukua interpoloinnille. Polynomin voi sovittaa, joko tarkasti tai pienimmän neliösumman mielessä.
Esimerkki: suoran y = a + b x sovitus datapisteisiin. Generoidaan pisteet x = 0,1,2,...10 ja y = 1 + 2x + epsilon, missä epsilon on nomaalijakautunut satunnaismuuttuja, odotusarvona 0 ja hajontana 0.5. Sovitetaan pienimmän neliösumman regressiosuora tähän pistejoukkoon.
x = linspace(0,1,10)'; y=2*x+1 + randn(10,1)*0.5; A = [ones(length(x),1) x] b=A\y xx=linspace(min(x),max(x)); plot(x,y,'o',xx,b(1)+xx*b(2))
Splini-interpolaatiossa sovitetaan datapisteiden kautta kulkemaan
paloittain määritelty käyrä, joka on kahden vierekkäinen x-datapisteen
välissä kolmannen asteen polynomi ja jossa lisäksi asetetaan
ensimmäiset ja toiset derivaatat datapisteissä samoiksi. Näin
saadaan sovitus, joka usein näyttää kulkevan jouhevasti datapisteiden
kautta. Splinisovitus saadaan komennolla spline,
edellisen esimerkin datapisteisiin yksinkertaisimmillaan komennolla
» plot(x,y,'o',xx,spline(x,y,xx))
Epälineaariset yhtälöt ja yhtälöryhmät eivät ratkea
yksinkertaisilla matriisioperaatioilla vaan tarvitaan iteratiivisia
ratkaisijoita. MATLABissa reaalifunktion nollakohtaa voi etsiä
funktion fzero avulla. Polynomiyhtälöä varten on
funktio roots.
Piirretään funktio 9sin(x)-x ja valitaan hiirellä klikkaamalla alkuarvaus nollakohdalle. Kootaan alla olevat komennot skriptiksi plotscript1.m
%% plotscript1.m
clf % Clear Graphics
f=@(x) 9*sin(x)-x; % Funktiomääritys
fplot(f,[0 10]); grid on;shg
title('Valitse hiirellä piste nollakohdan läheltä')
[x0,y] = ginput(1);
hold on
plot(x0,0,'o');
x00=fzero(f,x0);
display(['Nollakohta = ' num2str(x00)])
plot(x00,f(x00),'r*') % r='red'
legend('Kuvaaja','Alkupiste x0','Nollakohta x00')
Ajetaan skripti kirjoittamalla komentoikkunassa
>> plotscript1 Nollakohta = 2.8226 % Tulos
Reaaliarvoisen funktion f(x) määrätyn integraalin

integral.quad- alkuisia funktioita on edelleen tarjolla.
Sinifunktion integraali välillä [0,
/2]
» integral(@sin,0,pi/2)
ans =
1.0000
Integroidaan funktio x cos(30x) sin(x) välillä [0,2
]. Tehdään
MATLAB-funktion sisään globaali laskuri, jotta nähdään kuinka monta
kertaan funktiota on kutsuttu. Lisäksi talletetaan laskentapisteet
ja piirretään kuva.
Tiedosto: fun.m ------------------------- function y=fun(x) global samples count samples= [samples,x]; count=count+length(x); y=x.*cos(30*x).*sin(x);
» global count samples
» count=0; samples=[];
» I=integral(@fun,0,2*pi)
I =
0.0070
» count
count =
1590
» fplot(@fun,[0,2*pi])
» hold on; plot(samples,fun(samples),'or'); hold off
MATLABin perusasennuksessa on mukana laskentarutiinit tavallisten
1. kertaluvun differentiaaliyhtälöryhmien alkuarvotehtävien
ratkaisemiseksi. Fuktiot ode45,
ode23 ja ode15s.
Korkeampaa kertalukua olevat
tavalliset dy:t on muutettavan 1. kl:n muotoon ennen
ratkaisua.
Osittaisdifferentiaalityhtälöiden ratkaisijoita on
Differential Equation Toolbox:ssa
Esimerkki: Toisen kertaluvun tehtävä putoavasta kappaleesta, jossa ilmanvastus on suoraan verrannollinen nopeuteen.
MATLAB-ratkaisua varten kirjoitetaan oma, diffyhtälö(systeemi)n y'=f(t,y) määrittelevä (vektori)funktio.
function ydot=omafun(t,y)
missä t on riippumaton muuttuja
(usein aika) ja y riippuva (vektori)muuttuja.
Funktio palauttaa arvon/arvot f(t,y).
function yp=pallo_putoaa(t,y) m = 0.125; g=9.81; yp(1) = y(2); yp(2) = -g-y(2)/m; yp=yp(:); % yp:n oltava pystyvektori
MATLAB-ode-ratkaisijan syntaksi on
odexx(@omafun,aikavektori,alkuarvot)
» aika = linspace(0,4); » H = 10; v0=0; » [t,y]=ode45(@pallo_putoaa,aika,[H,v0]); » plot(t,y(:,1))
MATLABin optimointirutiineita ovat fminsearch ja
fminbnd. Erillisessä Optimization
Toolbox:ssa on lisää rutiineita.