ia2_l3
TRANSCRIPT
-
8/15/2019 IA2_L3
1/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 45
L3. Elemente de programare MATLAB. Functii de interpolare numerica adatelor
1. Scopul lucrarii
Scopul acestei lucrari de laborator consta în însusirea principalelor elemente de programare MATLAB, respectiv în fixarea comenzilor si facilitatilor de interpolarenumerica a datelor.
2. Chestiuni de studiat
2.1. Fisiere de tip M2.2. Tipuri de variabile si de operatori2.3. Instructiuni de control logic2.4. Interactiunea program-utilizator 2.5. Operatii cu siruri de caractere2.6. Functii MATLAB de interpolare si aproximare a datelor 2.7. Aplicatii numerice
3. Elemente teoretice si exemple de calcul
3.1. Fisiere de tip M
MATLAB lucreaza fie în mod linie de comanda, caz în care fiecare linie de instructiunieste prelucrata si rezultatele sunt imediat afisate, fie utilizând programe scrise în fisiere.Fisierele ce contin instructiuni MATLAB se numesc fisiere M, întrucât au extensia .m. Un
fisier M poate fi de doua tipuri, script sau function. Ambele tipuri de fisiere sunt scrise înformat ASCII , iar algoritmul implementat poate fi urmarit si modificat cu usurinta daca secunosc conventiile si sintaxa limbajului de programare MATLAB. Aceste tipuri de fisiereM permit crearea unor noi functii care pot completa setul functiilor MATLAB existente.Astfel MATLAB poate fi extins, permitând abordarea anumitor aplicatii specifice din stiinta
si inginerie.
3.1.1. Fisiere de tip script . Fisierele script sunt fisiere externe de tip text care continsecvente de comenzi MATLAB. Prin apelarea numelui fisierului, se executa secventele decomenzi MATLAB continute în fisier. Dupa executia completa a unui fisier script variabilele cu care acesta a operat ramân în Workspace. Aceste fisiere nu permit integrarea
în programe mari, realizate pe principiul modularizarii. Fisierele script pot fi folosite larezolvarea unor probleme care necesita un numar relativ mare de instructiuni a caror lansarela linia de comanda ar deveni greoaie.
3.1.2. Fisiere de tip function. În cazul în care prima linie a unui fisier M contine cuvântulcheie function fisierul respectiv intra în categoria fisierelor de tip function. Un fisier de tip
function difera de un fisier de tip script prin faptul ca accepta argumente de intrare. În plus,la terminarea executiei unei functii, în memoria calculatorului nu ramân decât variabilele deiesire ale functiei respective. Forma generala a primei linii a unui fisier functie este:
-
8/15/2019 IA2_L3
2/18
46 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
function [par_iesire1, par_iesire2...] = nume_functie(par_intrare1, par_intrare2...) (1)
unde : function reprezinta un cuvânt cheie obligatoriu prin care se declara ca fisierul este de tip
functionnume_functie reprezinta numele functiei, adica numele sub care este salvat fisierul, însafara extensie. Numele functiei nu poate fi identic cu cel al unui fisier M deja existent.
par_iesire1, par_iesire2 reprezinta parametri de iesire ce trebuiesc separati prin virgulasi cuprinsi între paranteze drepte. Daca functia nu are parametri de iesire, parantezeledrepte si semnul egal nu mai au sens.
par_intrare1, par_intrare2 reprezinta parametri de intrare ce trebuiesc separati prinvirgula si cuprinsi între paranteze rotunde. Daca functia nu are parametri de intrare,
parantezele rotunde nu mai au sens.
Puteti construi propriile dvs. f isierele de tip functie ce pot fi adaugate ca functii noi în
structura MATLAB. Instructiunile si comenzile utilizate o noua functie trebuiesc slavateîntr -un fisier de tip text cu extensia .m. De pilda creati si salvati în directorul curent fisierulde tip functie cu numele medie.m, care contine instructiunile de mai jos si care permitecalculul mediei aritmetice a elementelor unui vector:
function m = medie(x) (2)n = length(x);
m = sum(x)/n;
y = ['Media aritmetica a numerelor este: ', num2str(m)];
disp(y);
Pentru a calcula media aritmetica a elementelor vectorului V = [1:100] , utilizând functia noucreata medie, se foloseste urmatoarea secventa de instructiuni MATLAB:
» V = [1:100] (3)» medie(V)
Raspunsul MATLAB va fi urmatorul:
Media aritmetica a numerelor este: 50.5 (4)ans =
50.5000
MATLAB transmite prin valoare doar argumentele functiilor pe care acestea le modifica.Daca o functie nu altereaza un argument ci doar îl utilizeaza în calcule, MATLAB transmiteargumentul prin referinta pentru a optimiza folosirea memoriei.
Fiecar e functie MATLAB are alocata o anumita cantitate de memorie diferita deWorkspace-ul de baza MATLAB. Aceasta memorie reprezinta Workspace-ul functieirespective. În cursul rularii MATLAB-ului, singurele variabile pe care le puteti accesa suntcele din Work space-ul curent, fie ca acesta este Workspace-ul de baza sau Workspace-ulunei functii. Variabilele pe care le transmiteti unei functii trebuie sa apartina
-
8/15/2019 IA2_L3
3/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 47
Workspace-ului curent si functia întoarce argumente de iesire spre Workspace-ul curent.Puteti totusi sa definiti variabile ca variabile globale, acestea putând fi accesate din maimulte Workspace-uri.
3.1.3. Includerea de comentarii si informatii de tip help într-un fisier M. Introducereaunui comentariu într-un program se realizeaza prin adaugarea caracterului procent (%)
plasat la începutul liniei. Daca semnul procent (%) apare pe prima pozitie într-o linie,aceasta va fi omisa de compilator, iar daca apare în oricare alta pozitie într-o linie de
program, partea de program care urmeaza dupa acest caracter va fi omisa.Un comentariu poate aparea în oricare pozitie într-un program însa este recomandata
pozitionarea comentariilor la începutul fisierului script sau dupa prima linie care declara ofunctie în cazul fisierelor de tip function. În acest caz, comentariul respectiv care apare laînceputul unui fisier script sau imediat dupa linia de declarare a unei functii, constituiehelp-ul fisierului respectiv. Daca se apeleaza: help nume_script sau help nume_functie seafiseaza liniile care încep cu semnul procent si sunt situate între prima linie de comentariu si
prima linie libera în cazul fisierelor script , respectiv între prima linie de comentariu dupadeclararea functiei si prima linie libera sau prima instructiune ce urmeaza acestui grupcompact de linii.
Prin urmare pen tru a atasa un help unui program MATLAB se scriu liniile de programîncepând cu semnul procent (%) si se plaseaza între prima linie dupa declararea functiei si
prima linie libera sau prima instructiune ce urmeaza acestui grup compact de linii.Dupa ultima linie a help-ului se lasa o linie libera sau se trece direct la o instructiune
MATLAB, ca în exemplul de mai jos, care permite adaugare de informatii de tip helpfunctiei medie definite anterior :
function m = medie(x) (5)
% Functia calculeaza media aritmetica% a elementelor unui vector
% n reprezinta lungimea vectorului
n = length(x);
m = sum(x)/n;
y = ['Media aritmetica a numerelor este: ', num2str(m)];
disp(y);
Pentru a obtine informatii de tip help asociate functiei MATLAB medie.m definita ca maisus se foloseste sintaxa:
» help medie (6)
MATLAB va afisa informatiile de tip help asociate functiei medie:
Functia calculeaza media aritmetica (7)a elementelor unui vector
-
8/15/2019 IA2_L3
4/18
48 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
3.1.4. Crearea si editarea fisierelor M. Puteti crea si edita fisiere de tip M folosind oricareeditor de text, cum ar fi Notepad, WordPad , etc. dar salvând fisierul sub format text. Pentrua fi considerate de catre MATLAB drept fisiere M, fisierele create cu aceste editoaretrebuiesc salvate cu extensia .m.
3.2. Tipuri de variabile si de operatori
3.2.1. Tipuri de variabile. MATLAB contine doua tipuri de variabile: locale si globale.Regulile si recomandarile privind folosirea variabilelor în programarea MATLAB de tiplinie de comanda ramân valabile si în cazul programarii utilizând fisiere de tip M . Astfeltrebuiesc avute în vedere urmatoarele aspecte:
Nu este necesara declararea variabilelor folosite în fisiere M, în afara de cazul cândacestea trebuiesc declarate ca variabile de tip global ;Înainte de a asigna o variabila alteia, trebuie sa va asigurati ca variabila din dreaptaasignarii exista si are o anumita valoare;Orice operatie de alocare a unei valori unei variabile conduce la crearea variabilei dacaaceasta nu exista, sau în cazul în care aceasta deja exista, alocarea conduce la rescriereaunei noi valori în respectiva variabila;Verificarea numelui unei variabile poate fi efectuata folosind functia exist pentruasigurare ca numele este valid înainte de a fi folosit;La definirea unei variabile asigurati-va ca numele respectivei variabile nu este dejaafectat unei functii.
3.2.1.1. Variabile locale. Functiile MATLAB au propriile lor variabile locale. Acestea suntseparate de variabilele altor functii si de acelea ale Workspace-ului de baza al MATLAB-ului. Variabilele definite într -o functie nu ramân în memorie de la un apel la altul al functiei,decât daca sunt definite ca variabile globale .
Fisierele script nu au Workspace separat. Acestea stocheaza variabilele într-unWorkspace care este partajat cu apelatorul scriptului. Când sunt apelate de la linia decomanda, acestea partajeaza Workspace-ul de baza. Când sunt apelate dintr-o functie,acestea partajeaza Workspace-ul acelei functii.
3.2.1.2. Variabile globale. Daca o variabila de tip global este declarata în acelasi timp înmai multe functii si chiar în Workspace-ul de baza al MATLAB-ului, atunci toate acestea
partajeaza o singura copie a acelei variabile. Orice alocare a acelei variabile în oricare dintrefunctii este vizibila pentru celelalte functii care au declarat acea variabila drept globala.Fiecare functie MATLAB care foloseste variabile globale poate avea propriile sale variabilelocale. Înainte ca o functie sa poata folosi o variabila globala trebuie mai întâi sa declare
aceasta variabila globala. Declaratiile de variabile globale trebuiesc plasate la începutulfunctiei. De pilda pentru a declara variabila VAL ca variabila globala se folosesteinstructiunea:
» global VAL (8)
Daca fisierul M contine deasemenea subfunctii, atunci fiecare subfunctie care necesitaacces la variabila globala trebuie sa declare mai întâi variabila drept globala. Pentru a puteaaccesa o variabila globala de la linia de comanda, variabila respectiva trebuie mai întâideclarata ca fiind globala la linia de comanda.
-
8/15/2019 IA2_L3
5/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 49
Se recomanda ca numele de variabile globale MATLAB sa fie în general mai lungi si mai
sugestive decât numele variabilelor locale si sa contina litere mari. Aceste remarci nu suntobligatorii, ci sunt recomandari pentru a creste claritatea codului MATLAB si pentru areduce sansa de redefinire accidentala a unei variabile globale.
Pentru a vizualiza doar variabilele declarate globale, folositi functiile who sau whos cuspecificatia, global . Pentru exemplificare tastati comenzile de mai jos:
» global MAXLUNG MAXLAT (9)» MAXLUNG = 36; MAXLAT= 78;
» lung = 5; lat = 21;
» whos global (10) Name Size Bytes Class
MAXLUNG 1x1 8 double array (global)
MAXLAT 1x1 8 double array (global)
Grand total is 2 elements usin g 16 bytes
Exista câteva sugestii în ceea ce priveste folosirea variabilelor globale. În primul rândtrebuie stiut faptul ca exista un anumit risc asociat folosirii nejustificate a variabilelor globale si din aceasta cauza se recomanda sa le utilizati fara abuz.
Ati putea de exemplu, fara sa stiti, sa dati în interiorul unei functii, un nume uneivariabile globale care este deja folosit pentru o variabila globala din alta functie. Cândlansati aplicatia, o functie poate suprascrie neintentionat variabila folosita de cealaltafunctie. Acest tip de eroare este uneori dificil de depistat.
O alta problema apare când doriti sa schimbati numele variabilei. Pentru a face oschimbare fara a introduce o eroare în aplicatie, trebuie sa gasiti fiecare aparitie a aceluinume în codul dvs.
3.2.2. Tipuri de operatori. Exista trei tipuri de operatori MATLAB: operatori aritmetici(prezentati în lucrarile de laborator anterioare), operatori relationali si operatori logici.Operatorii relationali permit compararea cantitativa a doua marimi, Tabel 2.
Tabel 2Operator Descriere
< Mai mic decât Mai mare decât>= Mai mare sau egal cu= = Egal cu~ = Diferit de
Operatorii logici sunt folositi la diverse operatii logice MATLAB, dupa cum este prezentat în Tabelul 3. Pentru exemplificare se considera A = [0 1 1 0 1], B = [1 1 0 0 1].
Tabel 3Operator Descriere Exemplu
& Întoarce 1 pentru fiecare locatie de element care esteadevarata în ambii vectori
A & B = [0 1 0 0 1]
| Întoarce 1 pentru fiecare locatie de element care esteadevarata în unul sau în celalalt vector
A | B = [1 1 1 0 1]
-
8/15/2019 IA2_L3
6/18
50 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
~ Întoarce 0 pentru fiecare locatie de element care esteadevarata si 1 pentru fiecare locatie de element care estefalsa
~A = [1 0 0 1 0]
xor Întoarce 1 pentru fiecare locatie de element care esteadevarata doar într-un vector si 0 pentru toate celelalte
elemente
xor(A, B) = [1 0 1 0 0]
3.3. Instructiuni de control logic
Exista mai multe instructiuni de control logic care se folosesc în mod curent în a plicatiileMATLAB.
3.3.1. Instructiunea if. Instructiunea if împreuna cu else si elseif , executa un grup deinstructiuni în cazul în care este îndeplinita o anumita conditie logica, conform sintaxeigenerice de mai jos:
if expresie_logica (11) instructiuniend
Daca expresie_logica este adevarata (valoarea 1), MATLAB executa toate instructiunilecuprinse între if si end . Ulterior programul continua executia cu instructiunea situata pe liniaimediat urmatoare dupa instructiunea end . Daca expresia logica este falsa (valoarea 0),MATLAB sare peste toate instructiunile cuprinse între if si end si continua executiaîncepând cu linia situata imediat dupa instructiunea end . De exemplu tastati urmatoareasecventa de instructiuni:
» a=3; (12)» b=2;
» if a>b
disp('a este mai mare decât b')
elseif b>=a
disp('b este mai mare sau egal cu a')
end
3.3.2. Instructiunea while. Instructiunea while executa un grup de instructiuni de un numar de ori determinat de îndeplinirea unei conditii logice. Sintaxa generica a instructiunii whileeste:
» while expresie_logica
instructiuni (13)end
Daca expresie_logica este adevarata sunt executate instructiunile cuprinse între while siend . Tastati spre exemplificare comenzile de mai jos:
» n = 1; (14)» while prod(1:n) < 1e100
n = n + 1
end
-
8/15/2019 IA2_L3
7/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 51
3.3.3. Instructiunea for. Instructiunea for executa un grup de instructiuni de un numar impus de ori. Sintaxa generica a instructiunii este:
» for index = n1:increment:n2 (15) instructiuniend
Incrementul implicit este 1. Puteti specifica orice increment, inclusiv unul negativ. Pentru
indici pozitivi, executia se termina când valoarea indexului depaseste valoarea n2; pentruincrement negativ, bucla se încheie atunci când indexul devine mai mic decât valoarea n2.Tastati secventa de instructiuni de mai jos:
» m=3; (16)» n=5;
» for i = 1:m
for j = 1:n
A(i, j) = 1/(i + j - 1)
end end
3.3.4. Instructiunea break. Instructiunea break termina executia unei bucle for sau whileca în exemplul de mai jos.
» clc; (17)» clear all;
» m=30;
» for i = 1:m
A(i) =floor(10*rand(1))
if (A(i) ==0) break
end
end
În ultimele versiuni de MATLAB exista si alte instructiuni de control logic cum ar ficontinue, switch, case, otherwise etc.
3.4. Interactiunea program-utilizator
Exista trei modalitati de interactiune a unui program cu utilizatorul pe durata executieiunui program MATLAB:
Obtinerea unui raspuns de la tastatura;Definirea unei pauze pâna când utilizatorul apasa o tasta;Constructia unei interfete grafice cu utilizatorul, (posibila în versiunile recente deMATLAB), chestiune care nu va fi tratata în acest material.
3.4.1. Obtinerea unui raspuns de la tastatura. Functia input afiseaza un prompt siasteapta un raspuns al utilizatorului. Sintaxa functiei este
» n = input('prompt_string') (18)
-
8/15/2019 IA2_L3
8/18
52 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
Functia afiseaza sirul de caractere prompt_string , asteapta raspunsul de la tastatura siapoi afecteaza valoarea introdusa variabilei n. Daca utilizatorul introduce o expresie, functiao evalueaza si întoarce valoarea acesteia. Aceasta functie este folositoare pentruimplementarea aplicatiilor cu meniu. Functia input poate întoarce deasemenea un raspuns alutilizatorului de tip string . Pentru un raspuns de tip string , adaugati 's' ca argument alfunctiei:
» adresa = input('Introduceti adresa: ','s'); (19)
3.4.2. Definirea unei pauze. Anumite fisiere M necesita definirea unor pauze întreexecutiile anumitor pasi. Comanda pause, fara nici un argument, opreste executia pâna cândutilizatorul apasa o tasta. Pentru a face o pauza de n secunde, folositi functia sub forma pause(n).
3.5. Operatii cu siruri de caractere
MATLAB pune la dispozitia utilizatorului o biblioteca de functii cu siruri de caractere,câteva dintre acestea fiind prezentate în Tabelul 4.
Tabel 4Categorie Functie Descriere
blanks Creaza siruri de blancuriGeneraladeblank Sterge blancurile de la sfârsitul sirurilor de caractere
findstr Cauta un sir de caractere în altullower Converteste un sir de caractere în litere micistrcmp Compara siruri de caracterestrrep Înlocuieste un sir de caractere cu altul
Operatii cu siruri
de caractere
(stringuri)
upper Converteste siruri de caractere în litere mariisletter Întoarce adevarat în cazul literelor alfabetuluiTeste pe siruri de
caractere isspace Întoarce adevarat în cazul blancurilor int2str Converteste întregi în siruri de caracteremat2str Converteste matrice în siruri de caracterenum2str Converteste numere în siruri de caracteresprintf Scrie date formatate în siruri de caractere
Conversie între
siruri de
caractere si
numere
str2num Converteste sirurile de caractere în numere
De pilda pentru a solicita utilizatorului introducerea interactiva a numelui de familie se poate folosi urmatoarea secventa de comenzi MATLAB:
» nume = input('Introduceti numele dvs. de familie : ','s'); (20)
MATLAB va afisa mesaj de mai jos. Presupunem ca numele introdus este Ionescu:
» Introduceti numele dvs. de familie: Ionescu (21)
Daca se face apel la functia MATLAB:
-
8/15/2019 IA2_L3
9/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 53
» isletter(nume), (22)
raspunsul MATLAB va fi urmatorul:
ans = (23)
1 1 1 1 1 1 1
Acest sir de valori binare (0 si 1) are lungimea egala cu lungimea sirului nume. Valoarea1 asociata unui caracter indica faptul ca acel caracter este de tip litera, iar valoarea 0 indicafaptul ca acel caracter nu este de tip liter a.
Pentru a testa daca sirul de caractere introdus de la tastatura si atribuit variabilei numecontine doar litere se poate face apel la functia MATLAB de mai jos, care furnizeazavaloarea 0 daca sirul initial contine doar litere, respectiv diferit de zero daca sirul cont ine sicaractere diferite de literele alfabetului:
» length(nume)-sum(isletter(nume)) (24)
Raspunsul MATLAB este cel de mai jos, ceea ce înseamna ca sirul introdus contine doar litere:
ans = (25) 0
3.6. Functii MATLAB de interpolare si aproximare a datelor
Interpolarea unui set discret de date [xi, yi] presupune determinarea unei functii f(x) astfelîncât f(xi) = yi, în vederea completarii setului de date în orice alt punct x0 xi. Spreexemplu, fie date punctele de coordonate (x1, y1) si (x2, y2), se cere estimarea valorii y(x), în
cazul în care x1
-
8/15/2019 IA2_L3
10/18
-
8/15/2019 IA2_L3
11/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 55
temperaturii Teta din 10 în 10 secunde, folosind interpolarea liniara, cubica si splinecubica si se vor reprezenta pe acelasi grafic rezultatele obtinute.
Tabel 5Teta [°C] 20 60 120 200 300 430Timp [sec.] 0 30 60 90 120 150
În acest sens se foloseste secventa de comenzi MATLAB de mai jos.
» Timp = [0 30 60 90 120 150]; (28)» Timpn = 0:10:150;
» Teta = [20 60 120 200 300 430];
» Tetal = interp1(Timp, Teta, Timpn, 'linear');
» Tetas = interp1(Timp, Teta, Timpn, 'spline');
» Tetac = interp1(Timp, Teta, Timpn, 'cubic');» plot(Timp, Teta,'ro', Timpn, Tetal, 'g', Timpn, Tetas, 'b', Timpn,Tetac, 'm');
» xlabel( 'Timp [s]' );
» ylabel( 'Temperatura [grC]' );
Rezultatele grafice sunt prezentate în Fig. 2, în care se remarca o similitudine întreseturile de valori obtinute prin interpolare liniara, cubica si spline cubica.
0 50 100 1500
50
100
150
200
250
300
350
400
450
T e m p e r a t u r a [ g r C ]
Fig. 2. Rezultatele interpolarii multiple.
3.6.2. Interpolarea functiilor de doua variabile. Interpolarea functiilor de doua variabile presupune utilizarea unor functii MATLAB special destinate unor astfel de calcule, cum ar fi interp2 si griddata.
3.6.2.1. Interpolarea multipla a functiilor de doua variabile. Functia interp2 permiteinterpolarea functiior de doua variabile dupa diferite legi si se apeleaza cu sintaxa:
-
8/15/2019 IA2_L3
12/18
56 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
zi = interp2(x, y, z, xi, yi,’metoda’) (29)
unde ’metoda’ poate fi unul din cuvintele cheie:’linear’ sau ’bilinear’ – pentru interpolare biliniara;
’cubic’ sau ’bicubic’ – pentru interpolare bicubica;’spline’ – pentru interpolare spline cubica;’nearest’ – pentru interpolare de tipul cel mai apropiat vecin;
’Metoda’ implicita de interpolare este cea liniara.De pilda pentru o interpolare spline a functiilor de doua variabile, functia interp2 seapeleaza cu sintaxa:
zi = interp2(x, y, z, xi, yi,’spline’) (30)
Functia returneaza în matricea zi valorile interpolate corespunzatoare lui xi si yi . Matricele x si y specifica punctele în care sunt date valorile lui z . Daca x si y sunt vectori, valorile
acestora trebuie sa fie monotone si egal distantate ca cele obtinute cu functia meshgrid .În cazul valorilor în afara intervalelor de definitie ale lui x si y se returneaza NaN înmatricea zi . In ultimele versiuni de MATLAB exista si alte sintaxe ale functiei interp2.
3.6.2.2. Comparatie între metodele de interpolare. Pentru a compara rezultatele o btinutecu diverse metode de interpolare bidimensionala sa consideram o matrice de date dedimensiune 7 x 7 . Vom genera functia peaks cu o rezolutie slaba:
» [x, y] = meshgrid( -3: 1: 3); (31)» z = peaks(x, y);
» figure(1);
» surf(x, y, z);
» grid on;
-4
-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
Fig. 3. Reprezentarea grafica a functiei peaks cu rezolutie slaba.
-
8/15/2019 IA2_L3
13/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 57
Vom genera un mesh mai fin pentru interpolare.
» [xi yi] = meshgrid( -3: 0.25: 3); (32)
Vom interpola datele folosind metodele ’nearest’, ’bilinear’, ’bicubic’ :
» zi1 = interp2(x, y, z, xi, yi, 'nearest'); (33)» zi2 = interp2(x, y, z, xi, yi, 'bilinear');
» zi3 = interp2(x, y, z, xi, yi, 'bicubic');
Pentru comparatie vom trasa graficele obtinute cu functiile surf si contour , Fig. 4.
» figure(2); (34)» surf(xi, yi, zi1); grid on;
» figure(3);
» surf(xi, yi, zi2); grid on;
» figure(4);
» surf(xi, yi, zi3); grid on;
-4
-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
-4
-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
-4-2
0
2
4
-4
-2
0
2
4
-6
-4
-2
0
2
4
6
Fig. 4. Rezultatele interpolarii bidimensionale multiple ale functiei peaks.
3.6.2.3. Interpolarea datelor pe un grid 2D. Aceasta facilitate a MATLAB-ului presupuneinterpolarea unui set de date functie de doua variabile în nodurile unui grid uniform 2D.Interpolarea datelor se efectueaza cu ajutorul functiei griddata care se apeleaza cu sintaxa:
ZI = griddata(x, y, z, XI, YI) (35)
-
8/15/2019 IA2_L3
14/18
58 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
Datele initiale, stocate în trei vectori x , y, respectiv z = f(x, y), sunt interpolate pe un griduniform, stocat in matricele XI si YI obtinute cu functia meshgrid . Valorile interpolate suntstocate in matricea ZI = f(XI, YI).
Apelata cu sintaxa:
[XI, YI, ZI] = griddata(x, y, z, XI, YI), (36)
functia griddata întoarce matricea interpolata ZI , ca mai sus, însa întoarce si matricele XI ,YI .
Sa consideram functia 22 y x xe z calculata în 100 de puncte aleatoare în intervalul
[-2; 2].
» x = rand(100, 1)*4-2; y = rand(100, 1)*4-2; (37)» z = x.*exp( - x.^2- y.^2);
Vectorii x , y, si z contin date neuniform distribuite. Vom defini un grid uniform si vom
interpola datele pe acest grid:
» gr = -2:.25:2; (38)» [XI,YI] = meshgrid(gr, gr);
» ZI = griddata(x, y, z, XI, YI);
Vom plota datele interpolate împreuna cu datele initiale folosite la interpolare:
» mesh(XI, YI, ZI); hold on; (39)» plot3(x, y, z, 'o'); grid on; hold off
-2-1
0
1
2
-2
0
2
-0.5
0
0.5
Fig. 5. Interpolarea datelor pe un grid, folosind functia griddata.
3.6.3. Aproximarea polinomiala prin metoda celor mai mici patrate. Pentru ca oaproximare a unui set de date de tip perechi (xi, yi), i = 1...n, printr-o curba de tip
polinomial, sa fie considerata cea mai buna, trebuie ca suma patratelor distantelor de lafiecare punct la curba aproximata sa fie minima. Luând în cosiderare aceasta conditie este
-
8/15/2019 IA2_L3
15/18
MEDII DE CALCUL INGINERESC – Îndrumar de laborator 59
posibil ca nici un punct al setului de date sa nu se afle pe curba aproximata. Acest aspectsepara în mod evident notiunea de aproximare de cea de interpolare, în ultimul caz toate
punctele fiind obligatoriu situate pe curba respectiva.În acest context, aproximarea setului de date presupune identificarea coeficientilor ai ai
unui polinom de tipul:
p(x) = a0 x n
+ a1 x n-1
+ a2 x n-2
+ ... + an-1 x 1 + an (40)
Daca setul de date are n elemente, toate datele se afla pe curba de aproximare. Pentru ungrad al polinomului mai mic decât lungimea setului de date, aproximarea este cu atât mai
buna cu cât gradul polinomului este mai apropiat de lungimea setului de date. Utilizareaunui polinom cu grad mai mare decât lungimea setului de date poate conduce la erori deaproximare importante.
Determinarea celei mai bune aproximari a unui set de date (x, y), cu un polinom de ordinn, presupune folosirea functiei MATLAB polyfit care se apeleaza cu sintaxa:
p = polyfit(x, y, n) (41)Functia polyfit gaseste coeficientii polinomului p care aproximeaza cel mai bine setul de
date, în sensul celor mai mici patrate.În apelul functiei, x si y sunt vectori continând datele ce trebuiesc aproximate, iar n este
ordinul polinomului rezultant.Sa consideram de pilda setul de date (x, y):
» x = [1 2 3 4 5]; (42)» y = [5.5 43.1 128 290.7 498.4];
Un polinom de ordinul 3 care aproximeaza setul anterior de date este:
» p = polyfit(x, y, 3) (43)
Rezultatul MATLAB este:
p = -0.1917 31.5821 -60.3262 35.3400 (44)
Pentru a calcula valorile polinomului rezultant obtinut cu polyfit pe un set de date mai finsi pentru a plota comparativ rezultatele urmati secventa MATLAB de mai jos. Functia
polyval permite calculul valorile polinomului într -un punct sau într -o succesiune de punctesub forma unui vector.
» x2 = 1:.1:5; (45)» y2 = polyval(p, x2);
» plot(x, y, ' r o', x2, y2 , 'b' )
» grid on
-
8/15/2019 IA2_L3
16/18
60 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
1 1.5 2 2.5 3 3.5 4 4.5 50
50
100
150
200
250
300
350
400
450
500
Fig. 6. Aproximarea polinomiala a setului de date folosindfunctia pol yval .
4. Aplicatii numerice propuse spre rezolvare
APLICATIA 1
Scrieti instructiunile de mai jos (fara comentarii) în fisierul script sistem.m. Salvati fisierul în directorul curent si lansati în executie programul tastând la linia de comanda
sistem.% Program de rezolvare a unui sistem de ecuatii de tipul A*x=b => x=A
-1*b
clear % Sterge toate variabilele din workspace
clc % Sterge ecranul Command Window
n=100; % Defineste numarul de necunoscute
A = rand(n, n); % Creaza o matrice A de numere aleatoare
b = rand(n, 1); % Creaza un vector coloana b de numere aleatoare
tic, % Porneste cronometrul
x1 = inv(A)*b; % Rezolva sistemul
toc % Opreste cronometrul
tic, x2 = A\b; toc % Rezolva sistemul si cronometreaza timpul de calcul Evaluati diferentele între solutiile x1 si x2 calculate pe cele doua cai, folosind comandasum(abs(x1-x2)). Sunt diferente între cele doua solutii ? Care solutie este calculata mairapid ?
Pentru a obtine informatii de tip help despre programul sistem.m tastati la linia decomanda help sistem.
-
8/15/2019 IA2_L3
17/18
-
8/15/2019 IA2_L3
18/18
62 MEDII DE CALCUL INGINERESC – Îndrumar de laborator
APLICATIA 7
Aproximati cu polinoame de gradele {0, 2, 4, 6} setul de date din tabelul de mai jos. Sa setraseze pe acelasi grafic, cu pas de dx=0.1 rezultatele obtinute, evidentiind setul de date
initiale. X Y 1 5.52 43.13 128
4 290.7
5 200
APLICATIA 8
Se da o bobina cu miez feromagnetic având caracteristicile prezentate în figura de mai jos. Curba de magnetizare a miezului feromagnetic se da în tabelul de mai jos si va t rebui
introdusa într -un fisier text care sa fie citit de programul MATLAB. H [A/m] B [T]
0 0500 0.21400 0.495000 1.088200 1.3411500 1.5315000 1.67 20000 1.8426800 1.96 36700 2.03
57200 2.1
Aplicând legea circuitului magnetic NI dl H pe conturul închis sa se determine
valorile inductiei magnetice Bo si a fluxului fascicular o în miezul magnetic (aceste valori se considera constante pe toata regiunea miez magnetic). Pentru rezolvarea problemei va trebui creat un fisier M care sa ceara interactivutilizatorului valorile celor trei parametri NI, L, si S. Pe baza acestora programul
MATLAB trebuie sa apeleze functia interp1 care sa faca interpolarea liniara a valorilor B- H.
În final se va trasa grafic curba de magnetizare B- H cu evidentierea punctului H o-Bo.
APLICATIA 9
Sa se interpoleze liniar , cubic si spline cubic , cu pas de 500 A/m, curba de magnetizare B- H din aplicatia anterioara, folosind functia interp1. Sa se traseze pe acelasi grafic curbainitiala si curbele obtinute prin interpolare.
NI=10000 AL=100 mm
S = 900 mm2