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