8. laborgyakorlat

Numerikus számítások fizikusoknak

Az anyag bizonyos részei nem publikálódnak html formátumba. Ezek a részek kikommentelve szerepelnek a fájlban.

Contents

clear all, close all

Adatbekérés

Szöveg vagy szám bekérése.

%{
n=input('Adjunk egy egész számot! ');
n/2

pause
nev=input('Mi a neve? ');
nev

% A szöveget karakterláncként tárolja a matlab.

whos nev
%}

Grafikus adatbekérés.

%{
ezplot(@sin)
pontok=ginput(4)
hold on
plot(pontok(:,1),pontok(:,2))
%}

Szöveg kiírása a képernyőre

A disp paranccsal egyszerű szöveget irathatunk ki a képernyőre, formázási lehetőség nélkül. Formázott szöveget az fprintf paranccsal tudunk a képernyőre írni.

Egy karakterlánc kiírása a képernyőre.

disp('Az A mátrix:')
A=[1,2;3,4];
disp(A)
Az A mátrix:
     1     2
     3     4

Több karakterláncot vektorba kell foglalni, a mátrixokat karaktereket tartalmazó mátrixba kell konvertálni a num2str paranccsal. Itt is figyelni kell a karakterekből álló mátrixok méretére!

num2str(A)
% disp(['Az A mátrix:',num2str(A),' alakú.']) % hibaüzenetet adna
disp(['Az A mátrix első sora: ', num2str(A(1,:)),' alakú.'])
whos
ans =
1  2
3  4
Az A mátrix első sora: 1  2 alakú.
  Name      Size            Bytes  Class     Attributes

  A         2x2                32  double              
  ans       2x4                16  char                

Formázott kiírás az fprintf paranccsal. fprintf(szöveg formázójelekkel, a formázójelek által meghatározott változók felsorolása) Az általában használt formázások f (fixpontos), e (normál alak), g (a kettő közül a rövidebb), \n új sor, \t tabuláció, \b backspace. %a.bf: a: a kiírt karakterek minimális száma, b: tizedesjegyek száma Lásd bővebben a Matlab helpjét!

x=sqrt(2);
y=-sqrt(2);
fprintf('Az egyenlet egyik megoldása %f,\na másik %f.\n',x,y)
fprintf('Az egyenlet egyik megoldása %10.2f,\na másik %10.2e.\n',x,y)
fprintf('A hiba %4.2f%%-os\n',x)
Az egyenlet egyik megoldása 1.414214,
a másik -1.414214.
Az egyenlet egyik megoldása       1.41,
a másik -1.41e+000.
A hiba 1.41%-os

Példa: egész számok és négyzeteik.

fprintf(' i     i^2\n')
for i=1:10
    fprintf('%2.0f  %4.0f\n',i,i^2)
end
 i     i^2
 1     1
 2     4
 3     9
 4    16
 5    25
 6    36
 7    49
 8    64
 9    81
10   100

Hibaüzenet a képernyőre

% error('Hiba történt')

% Figyelmeztető hangjelzés
beep

Elágazások

if elágazás

x=15;
if x<16
    beep % a felhasználó figyelmeztetése
    disp('A zh sikertelen.')
else % opcionális
    disp('A zh sikeres.')
end
A zh sikertelen.

elseif elágazás

pont=25;
if pont<16
    beep % a felhasználó figyelmeztetése
    disp('A gyakjegy ''elégtelen''.')
elseif pont<55
    disp('A gyakjegy ''elégséges''.')
elseif pont<70
    disp('A gyakjegy ''közepes''.')
elseif pont<85
    disp('A gyakjegy ''jó''.')
else
    disp('A gyakjegy ''jeles''.')
end
A gyakjegy 'elégséges'.

Switch/case elágazás

jegy=3;
switch jegy
    case 1
        beep
        disp('Elégtelen')
    case 2
        disp('Elégséges')
    case 3
        disp('Közepes')
    case 4
        disp('Jó')
    case 5
        disp('Jeles, gratulálok!')
    otherwise % opcionális
        error('Ilyen jegy nincs, adjon meg másikat!') % hibaüzenet írása
end
Közepes

Példa

%{
cel=input('Budapestre vagy Szegedre szeretne utazni (''B''/''S'')?: ');

switch cel
    case 'B'
        disp('2855 Ft')
    case 'S'
        disp('5680 Ft')
    otherwise
        disp('Helytelen település')
end
%}

Nemlineáris egyenletek megoldása (egyváltozós eset)

fzero parancs

f=@(x)cos(x)-x;
ezplot(f,[0,1])
fzero(f,0.6) % közelítő zérushely
pause
fzero(f,[0.5,0.8]) % előjelváltó intervallum
pause
[x,ertek,flag]=fzero(f,0.6)
ans =
   0.739085133215161
ans =
   0.739085133215161
x =
   0.739085133215161
ertek =
     0
flag =
     1

Hátrányok - rossz eredményt ad

fzero(@tan,2)
ans =
   1.570796326794896

A zérushelykeresési paraméterek beállítása.

% optimset('fzero') % Megnézi a jelenlegi paraméterbeállítást
% pause
options=optimset('Display','iter','TolFun',10^-8)
fzero(f,0.6,options)
options = 
                   Display: 'iter'
               MaxFunEvals: []
                   MaxIter: []
                    TolFun: 1.000000000000000e-008
                      TolX: []
               FunValCheck: []
                 OutputFcn: []
                  PlotFcns: []
           ActiveConstrTol: []
                 Algorithm: []
    AlwaysHonorConstraints: []
            BranchStrategy: []
           DerivativeCheck: []
               Diagnostics: []
             DiffMaxChange: []
             DiffMinChange: []
               FinDiffType: []
         GoalsExactAchieve: []
                GradConstr: []
                   GradObj: []
                   HessFcn: []
                   Hessian: []
                  HessMult: []
               HessPattern: []
                HessUpdate: []
           InitialHessType: []
         InitialHessMatrix: []
          InitBarrierParam: []
     InitTrustRegionRadius: []
                  Jacobian: []
                 JacobMult: []
              JacobPattern: []
                LargeScale: []
        LevenbergMarquardt: []
            LineSearchType: []
                  MaxNodes: []
                MaxPCGIter: []
             MaxProjCGIter: []
                MaxRLPIter: []
                MaxSQPIter: []
                   MaxTime: []
             MeritFunction: []
                 MinAbsMax: []
       NodeDisplayInterval: []
        NodeSearchStrategy: []
          NonlEqnAlgorithm: []
        NoStopIfFlatInfeas: []
            ObjectiveLimit: []
      PhaseOneTotalScaling: []
            Preconditioner: []
          PrecondBandWidth: []
            RelLineSrchBnd: []
    RelLineSrchBndDuration: []
              ScaleProblem: []
          ShowStatusWindow: []
                   Simplex: []
       SubproblemAlgorithm: []
                    TolCon: []
                 TolConSQP: []
                TolGradCon: []
                    TolPCG: []
                 TolProjCG: []
              TolProjCGAbs: []
                 TolRLPFun: []
               TolXInteger: []
                  TypicalX: []
               UseParallel: []
 
Search for an interval around 0.6 containing a sign change:
 Func-count    a          f(a)             b          f(b)        Procedure
    1             0.6      0.225336           0.6      0.225336   initial interval
    3        0.583029      0.251769      0.616971      0.198664   search
    5           0.576      0.262648         0.624      0.187548   search
    7        0.566059      0.277962      0.633941      0.171758   search
    9           0.552      0.299477         0.648      0.149293   search
   11        0.532118      0.329617      0.667882      0.117253   search
   13           0.504      0.371658         0.696     0.0714129   search
   15        0.464235      0.429929      0.735765    0.00555337   search
   17           0.408      0.509916         0.792    -0.0895768   search
 
Search for a zero in the interval [0.408, 0.792]:
 Func-count    x          f(x)             Procedure
   17           0.792    -0.0895768        initial
   18        0.734622    0.00746157        interpolation
   19        0.739034   8.5067e-005        interpolation
   20        0.739085 -3.23665e-009        interpolation
   21        0.739085  3.64153e-014        interpolation
   22        0.739085             0        interpolation
 
Zero found in the interval [0.408, 0.792]
ans =
   0.739085133215161