Professional Documents
Culture Documents
Introducere in Matlab
1.1 Despre Matlab
Matlab este un limbaj de inalta performanta pentru calcul tehnic, conform producatorului The MathWorks,
Inc. Integreaza, intr-un sistem interactiv, elemente de calcul, vizualizare si programare, fiind folosit, in mod
tipic, pentru: matematica si calcul; dezvoltarea de algoritmi; modelare, simulare si creare prototipuri; analiza de
date, explorare si vizualizare; grafice stiintifice si tehnice; dezvoltare de aplicatii, incluzand interfata grafica
utilizator. Deasemeni, Matlab include biblioteci de functii Matlab, numite toolbox - uri, orientate pe categorii de
probleme, cum sunt procesare semnal, sisteme de control, retele neurale, logica fuzzy, functii wavelets,
optimizare, simulare s.a., oferind utilizatorului atat posibilitatea de a asimila tehnicile specializate cat si de a le
folosi in aplicatii.
Denumirea Matlab provine de la matrix laboratory, programul fiind conceput initial pentru a facilita accesul
la softul performant de calculul matriceal LINPACK si EISPACK. Caracteristica principala a sistemului
interactiv Matlab este ca opereaza cu siruri de date care nu necesita dimensionare, astfel ca editarea programelor
pentru rezolvarea unor probleme de calcul tehnic, in special a celor care includ matrici si vectori, necesita mult
mai putin timp decat in cazul folosirii unor limbaje neinteractive care opereaza cu scalari, cum sunt C sau
Fortran.
In timp, Matlab - ul a fost extins, uneori cu contributia utilizatorilor, si adaptat la evolutia sistemelor de
operare si a tehnicii de calcul. A fiost lansat in mai multe versiuni succesive, de referinta fiind versiunile 4, 5 si,
cea mai recenta, 6. Este folosit pe scara larga in mediile universitare din intreaga lume in activitatile de instruire,
cercetare siintifica si tehnica, precum si in industrie, in activitati de analiza, cercetare si dezvoltare.
1.2 Instalarea programului Matlab
Programul Matlab este furnizat, de regula, pe un compact disk (CD), fiind necesara, pentru instalarea pe un
calculator, licenta de folosire a programului. Poate fi procurat, deasemeni, direct de la firma producatoare (The
Math Work Inc) folosind reteaua internet, care furnizeaza unele variante, in anumite conditii, in modul liber de
utilizare (fara plata licentei), in special pentru studenti si universitati.
Cerintele de hard si soft difera in functie de varianta de program Matlab. De exemplu, pentru Matlab,
versiunea 5.1, acestea sunt: sistem de calcul - minimum 486 DX , sistem de operare - Windows 95, Windows NT
sau mai recent, placa video - pe minimum 8 biti, spatiu de memorare pe hard disk - 115 MB pentru Matlab si
250 MB pentru Matlab si Help, memorie interna - minimum 8 MB, recomandat 16 MB sub Windows 95,
minimum 12 MB, recomandat 16 MB sub Windows NT. Se recomanda spatiu larg de memorare, accelerator
grafic, imprimanta, placa de sunet iar pentru vizualizarea documentelor din Matlab Help Desk, sunt necesare
programele Netscape Navigator sau Microsoft Internet Explorer pentru fisierele de tip HTML, si programul
Adobe Acrobat Reader pentru fisierele de tip PDF.
Pentru instalarea programului Matlab pe un calculator, sub sistemul de operare Windows se deschide
fereastra Start, se selecteaza din meniu Settings, apoi Control Panel; cu dublu clic mouse se lanseaza apoi in
executie Add/Remove Programs; din meniul acestuia, se selecteaza Install si, cu ajutorul comenzii Browse, se
selecteaza fisierul Setup.exe din kit - ul Matlab, dupa care se continua urmarind dialogul propus de programul de
instalare. In cazul unei instalari corecte a programului Matlab, este afisat, in final, un mesaj in acest sens.
1.3 Lansarea programului in executie
Lansarea in executie a programului Matlab sub controlul sistemului de operare Windows, se poate face
folosind unul dintre urmatoarele moduri:
1) dublu clic buton stanga mouse pe fereastra shortcut Matlab;
2) se deschide fereastra Start a Windows - ului, se selecteaza Programs, apoi, din submeniu, Matlab (sau alt
nume sub care a fost instalat programul), apoi numele fisierului executabil Matlab si se tasteaza Enter;
3) Se deschide fereastra Start, se selecteaza din meniu comanda Run, se tasteaza sau se inscrie cu ajutorul
comenzii Browse calea si numele fisierului matlab.exe, dupa care se tasteaza Enter.
Dupa lansarea in executie, programele Matlab in versiunile pana la 5.3 inclusiv, deschid o fereastra de lucru
Matlab, cu un meniu de comenzi, si prompterul de linie program >, fiind gata sa execute o comanda sau o
instructiune Matlab. In versiunea 6 (rel.12), programul deschide trei ferestre - una pentru comenzi si instructiuni
Matlab (fereastra curenta de lucru in Matlab), una pentru editare fisiere Matlab (denumite de tip script programe, functii externe, baze de date), si una pentru istoricul sesiunii de lucru curente.
1.4 Meniul ferestrei curente de lucru
In fereastra de instructiuni si comenzi Matlab, meniul afisat in partea de sus a ferestrei contine optiunile: File,
Edit, Window, Help. Cu un clic stanga mouse pe una dintre fereastre, se deschide submeniul acesteia.
Deasemeni, deschiderea unui submeniu se poate face tastand simultan Alt si F pentru File, Alt si E pentru Edit,
Alt si W pentru Windows si Alt si H pentru Help. Inchiderea submeniului se face cu clic stanga mouse pe
fereastra respectiva sau tastand Esc. Submeniurile ferestrelor de comenzi sunt prezentate in continuare.
Fereastra File
New, cu submeniul si functiile acestuia:
M - File - deschide fereastra editorului de fisiere Matlab;
Figure - deschide o fereastra pentru o figura (grafic) Matlab;
Model - deschide o fereastra pentru construirea unui model simulink, si o fereastra cu elementele de
modelare din biblioteca simulink;
Open - pentru deschiderea unui fisier Matlab;
Open Selection - deschide un fisier Matlab selectat cu mouse - ul de pe ecranul de lucru curent (selectarea se
face prin apasarea continua a butonului stanga mouse simultan cu deplasarea cursorului mouse pe numele
fisierului pe are dorim sa-l selectam);
Run Script - deschide o fereastra pentru inscrierea caii si numelui unui program Matlab in vederea lansarii in
executie; inscrierea poate fi facuta de la tastatura sau cu ajutorul comenzii Browse din meniul ferestrei,iar
lansarea in executie prin clic mouse pe fereastra OK sau tastand Enter;
Load Workspace - deschide o fereastra pentru selectarea si incarcarea unui fisier de tip .mat care contine un
spatiu de lucru salvat anterior. Un spatiu de lucru include numele si valorile curente ale variabilelor,
dimensiunile, spatiul de memorie alocat si marimile lor dintr-o sesiune de lucru. O sesiune de lucru este
reprezntata de activitatea in Matlab desfasurata intre momentul imediat dupa lansarea in executie a programului
si un moment curent considerat. Selectarea si incarcarea fisierului se poate face fie prin tastarea caii si numelui in
fereastra File name din submeniu, urmata de activarea comenzii din fereastra Open, fie cu ajutorul mouse - ului
si a ferestrei de comanda Open pentru inspectarea directorilor si selectarea fisierului;
Save Workspace As ... - deschide o fereastra pentru salvarea spatiului de lucru curent intr-un fisier de tip
.mat. Calea fiserului poate fi selectata cu ajutorul mouse - ului sau poate fi inscrisa de la tastatura in fereastra
File name, iar numele fisierului trebuie inscris de la tastatura. Pentru salvarea fisierului, se foloseste fereastra de
comanda Save din submeniu;
Show Workspace - deschide o fereastra pentru afisarea spatiului de lucru curent;
Show Graphics Property Editor - deschide o fereastra cu afisarea proprietatilor editorului grafic;
Show GUI Layout Tool - deschide o fereastra pentru afisarea mijloacelor de lucru ale unitatii de interfata
grafica;
Set Path ... - permite includerea unui director in calea de cautare a Matlab - ului;
Preferences ... - deschide un meniu cu urmatoarele ferestre: General, Command, Window Font si Copying
Options.
Fereastra General include subferestrele:
Numeric Format, pentru selectarea formatului de afisare a numerelor;
Editor Preference - pentru alegerea editorului de fisiere Matlab;
Help Directory - pentru precizarea caii si fisierului de help Matlab;
Fereastra Window
Afiseaza lista ferestrelor deschise pana in momentul curent de lucru, ferestrele fiind numerotate, incepand de
la zero, in ordinea deschiderii lor. O fereastra din meniu poate fi deschisa prin selectarea ei cu clic mouse. Poate
fi inchisa prin folosirea comenzii Close din meniul File al ferestrei deschise.
Fereastra Help
Help Window - dechide o fereastra pentru obtinerea de informatii privind elemente Matab (fereastra de help),
cu optiunile:
Matlab Help Topics - aici poate fi inscris un cuvant (sau un simbol) - cuvant cheie, dupa care, tastand
Enter, sunt afisate informatiile de baza referitoare la el (help - ul aferent) ;
See also - afiseaza o lista de cuvinte care au legatura cu cuvantul cheie; selectand cu mouse - ul un cuvant
din lista, este imediat afisat help - ul aferent;
Go to Help Desk - deschide o fereastra cu optiuni de cautare locala (in help extins Matlab) sau pe reteaua
internet, la adresa data de firma producatoare, pentru obtinerea de informatii extinse aferente cuvantului cheie
dat;
Back - pentru trecerea la ecranul de help afisat anterior;
Forward - pentru trecerea la ecranul de help urmator;
Home - pentru trecerea la ecranul initial, afisat dupa deschiderea ferestrei Help Window; acesta contine
fereastra HELP topics, cu numele principalelor fisiere de help Matlab; un fisier din lista poate fi deschis cu
dublu clic mouse, ca si help - ul pentru un cuvant cheie selectat din fisierul deschis;
Tips - pentru afisarea tipurilor de help disponibile;
Close - pentru inchiderea ferestrei de help.
1.5 Moduri de lucru in Matlab
Exista doua moduri de lucru in Matlab: modul de lucru direct si modul de lucru cu fisiere de tip script.
a. Modul de lucru direct
Dupa lansarea in executie a programului Matlab, in fereastra curenta de lucru se afiseaza cursorul de linie
program - caracterul > sau >>, si cursorul de caracter, reprezentat printr - o bara verticala aflata in flash
continuu (clipire continua). Din acest moment, poate fi editata (de regula de la tastatura) o linie de program, care
poate fi simpla - constand dintr - o instructiune sau o comanda Matlab, sau multipla - constand din mai multe
instructiuni si/sau comenzi Matlab separate intre ele prin caracterul , (virgula) sau caracterul ; (punct si
virgula). Daca se foloseste caracterul , (virgula), valoarea curenta a variabilei din instructiunea de alocare
aflata in stanga virgulei este afisata pe ecran; daca se foloseste caracterul ; (punct si virgula), aceasta nu este
afisata.
O linie program poate fi editata pe una sau mai multe linii ecran (fizice). In al doilea caz se foloseste grupul
de caractere ... (trei puncte) pentru a semnifica o continuare de linie program. Trebuie evitata includerea
acestui grup de caractere intre doua apostrofuri ale unei instructiuni sau comenzi Matlab. Unele instructiuni
Matlab nu mai necesita indicarea continuarii liniei de program (de exemplu, la alocarea elementelor unei
matrice, o linie fizica semnifica o linie a matricei. Deplasarea cursorului de caracter pe linie poate fi facuta fie
prin pozitionare cu mouse - ul, fie prin deplasarea cu ajutorul tastelor " " ," " (sageata dreapta, sageata
stanga). Pentru stergerea unui caracter editat, pot fi folosite tastele Delete sau Back Space.
Dupa editarea unei linii de program, se tasteaza Enter si aceasta este executata imediat. Similar, se editeaza o
noua linie, se executa s.a.m.d. Liniile de program executate sunt memorate automat si pot fi selectate, in vederea
reactivarii lor, folosind tastele "" ,"" (sageata in sus, sageata in jos). Deasemeni, liniile de program deja
editate pot fi copiate de pe ecran (v. Copy din meniul ferestrei Edit) si inscrise pe linia curenta (v. Paste, din
acelasi meniu), in vederea reutilizarii lor. Deplasarea inapoi/inainte a ecranelor de afisaj poate fi efectuata cu
ajutorul tastelor Page Up/ Page Down sau a cursorului de ecran din marginea din dreapta a ferestrei de lucru.
Exemplul 1.1. Se dau: a = 1, b = 2. Sa se calculeze, folosind modul de lucru direct in Matlab,
c = (a + b+1)0.15.
Rezolvare. Din meniul ferestrei File, selectam Preferences, apoi, formatul de afisare a numerelor, de exemplu
Long G; in modul de lucru direct, se editeaza linia de program:
>a=1, b=2, c=(a+b+1)^0.15
Se tasteaza apoi Enter si pe ecran se afiseaza:
a=
1
b=
2
c=
1.23114441334492
Ca exercitiu, propunem utilizatorului reluarea calculelor din Exemplul 1.1, dar cu folosirea diferitor formate
numerice de afisare si folosirea caracterului ; dupa primele doua instructiuni.
b. Modul de lucru cu fisiere script
Acest mod corespunde modului de lucru programat in Matlab. Pentru editarea unui program Matlab, se
procedeaza astfel:
- Din meniul principal Matlab, selectati File, apoi New, apoi M - file pentru deschiderea editorului de text
program (in ASCII);
- Se editeaza programul in limbaj Matlab;
- Se salveaza programul: din meniul editorului, se selecteaza File, apoi Save As ... , se da un nume legal de
program, cu extensia de nume .m;
- Se inchide fereastra editorului (in versiunile 5.1 - 5.3) si se revine la fereastra de lucru curent in Matlab;
- Pentru executia programului, fie se tasteaza numele programului, fara extensia de nume si apoi Enter, fie se
selecteaza din meniul principal File, apoi Run Script ... , se tasteaza adresa si numele programuluiu si apoi Enter.
Exemplul 1.2. Se dau: a = 1, b = 2. Sa se calculeze, folosind modul de lucru script in Matlab,
c = (a + b+1)0.15.
Rezolvare. Din meniul ferestrei File, selectam New, apoi M - file. Se editeaza programul
programul
a=1, b=2, c=(a+b+1)^0.15
Se salveaza programul, de exemplu cu numele prog12.m, si se coboara fereastra editorului.
Selectati formatul de afisare a numerelor, de exemplu Long G. Tastati prog12, apoi Enter si pe ecran se
afiseaza:
a=
1
b=
2
c=
1.23114441334492
help - functie pentru furnizarea de informatii Matlab in modul de lucru direct (online).
Sintaxa:
> help <Enter> - afiseaza lista tuturor subiectelor primare de informatii,
corespunzatoare directorilor din calea Matlab;
>help subiect <Enter> - afiseaza informatii despre subiect, unde subiect poate fi o
comanda Matlab, un nume de functie sau un nume de director aflat in calea Matlab (in acest caz
afiseaza tabela de continut a directorului)
Exemple:
help <Enter> - afiseaza lista directorilor din calea Matlab, cu informatii primare;
help path <Enter> - furnizeaza informatii despre comanda path;
help plot <Enter> - furnizeaza informatii despre functia plot;
help general <Enter> - afiseaza tabela de continut a directorului general din calea Matlab;
helpwin - functie pentru furnizarea de informatii in modul de lucru direct, cu deschiderea unei
ferestre separate pentru cautare;
Sintaxa:
>helpwin subiect <Enter> - deschide o fereastra si afiseaza informatii despre subiect;
>helpwin(text,titlu) <Enter> - deschide o fereastra cu numele titlu in care inscrie text;
informatii despre subiect pentru informatii despre subiect; cu numele ferestrei titlu.
Exemple:
>helpwin plot <Enter> - deschide o fereastra cu informatii despre functia plot;
>helpwin(plot) <Enter> - idem
>helpwin(Informatii despre text, Ionel) <Enter> - deschide o fereastra cu numele Ionel, in
care inscrie textul Informatii despre text;
helpdesk - incarca Matlab Help Desk in fereasrea Web de cautare pentru help extins.
Sintaxa:
>helpdesk <Enter>
Exemplu:
Pentru informatii Help Desk despre functia plot:
>helpdesk <Enter> ,inscrie apoi plot in fereastra Search Matlab Index si tasteaza Search.
version - ofera informatii cu privire la versiunea Matlab curenta si a datei de realizare a ei.
>version <Enter> - returneaza versiunea Matlab curenta;
>[v,d]=version <Enter> - returneaza versiunea Matlab curenta si data realizarii ei.
whatsnew - afiseaza fisierele de tip Readme care contin informatii cu privire la noutatile
versiunii Matlab curente;
>whatsnew <Enter>
lookfor - comanda pentru identificarea fisierelor care contin un cuvant cheie pe linia 1 de help;
Sintaxa:
>lookfor cuvant_cheie <Enter> - listeaza numele fisierelor care contin textul cuvant_cheie in
linia 1 de help (linia H 1);
Exemplu:
>lookfor plot <Enter> - listeaza fisierele care contin cuvantul plot pe linia 1 de help.
pcode - creaza fisiere pre-parsed pseudo-cod (fisisere .p) din fisiere .m;
Sintaxa:
>pcode lista_de_functii <Enter> - creaza fisiere .P in directorul curent ale functiilor
specificate in lista_de_functii;
>pcode lista_de_functii -inplace <Enter> - creaza fisiere .P in directorul functiilor din
lista_de_functii;
Exemple:
>pcode plot.m fzero.m <Enter> - creaza fisierele plot.p si fzero.p in directorul curent;
>pcode plot.m fzero.m -inplace <Enter> - creaza fisierele plot.p si fzero.p in directorii
fisierelor plot.m si fzero.m (directorii graph2D, respectiv funfun din toolbox\matlab);
clc - sterge fereastra de comenzi si pozitioneaza cursorul in coltul stanga sus al ferestrei de
comenzi;
>clc <Enter>
echo - comanda pentru afisarea liniilor din programele .m de tip script, pe masura executarii
lor;
>echo on <Enter> - activeaza comanda echo; vor fi afisate liniile programelor .m de tip script
care vor fi executate dupa aceasta comanda;
Exemple:
Fie programul ptest.m, de tip script, care apeleaza functia ftest.m, prezentate mai jos:
% program ptest.m
x1=fzero(ftest,8);
x2=fzero(ftest,-8);
x1, x2
function y=ftest(x)
y=x^4+5.0*x^3-6;
>echo on; ptest <Enter> - afiseaza liniile programului ptest.m pe masura ce sunt executate;
>echo off; ptest <Enter> - dezactiveaza comanda echo on; liniile programului ptest.m nu vor
mai fi afisate;
>echo ftest on; ptest <Enter> - afiseaza liniile functiei ftest.m, apelata de ptest.m;
>echo ftest off; ptest <Enter> - dezactiveaza comanda echo aplicata functiei ftest.m; liniile
functiei ftest.m nu vor mai fi afisate la executarea programului ptest.m;
>echo on all; ptest <Enter> - afiseaza liniile functiilor din memorie folosita la executarea
programului ptest.m;
>echo off all; ptest <Enter> - dezactiveaza comanda echo on all; liniile functiilor din memorie
nu vor mai fi afisate la executia programului ptest.m;
+ - simbolurile + , - si blank sunt returnate pentru numerele pozitive, respectiv negative sau
egale cu zero, cu neglijarea partii imaginare in cazul numerelor complexe;
bank - format bancar, scalat in virgula fixa cu doua zecimale;
rat - format expresie rationala; aproximare prin rata celor mai mici intregi;
Exemple:
>format short, pi, format long, pi <Enter> - afiseaza valoarea numarului in formatele
virgula fixa cu 5 cifre si cu 15 cifre;
>format short e, pi, format long e, pi <Enter> - afiseaza valoarea numarului in formatul
virgula mobila cu 5 cifre si cu 15 cifre;
> a=1/3*10^10; format short g, a, format long g, a <Enter> - calculeaza si afiseaza valoarea
variabilei a in cea mai buna reprezentare, in forma scurta si in forma lunga;
>format hex, pi <Enter> - afiseaza valoarea numarului in sistemul de numeratie
hexadecimal;
>a=10; b=-10; c=0.0; format +, a, b, c <Enter> - atribuie valori variabilelor a, b, si c si
returneaza simbolurile +, - si blanc.
>a=1/3*10^10; format bank, a <Enter> - calculeaza valoarea variabilei a si o afiseaza in
format bancar;
>format rat; pi <Enter> - afiseaza valoarea numarului sub forma rationala (355/13);
>b=1:20; format compact, b, format loose b <Enter> - genereaza vectorul b si afiseaza
elementele lui cu suprimarea, respectiv includerea liniei de spatiere la afisare;
clock - returneaza un vector cu 6 elemente reprezentand anul, luna, ziua, ora, minutul,
secunda curente, dupa data si ceasul calculatorului;
Sintaxa:
>clock <Enter>
Exemple:
>format bank; clock <Enter> - afiseaza data si ora curente, in format bancar;
>format short; fix(clock) <Enter> - afiseaza data si ora curente, rotunjite la valorile intregi
cele mai apropiate spre zero;
>s=clock; s(1) <Enter> - atribuie variabilei s valorile returnate de clock si afiseaza primul
element (anul);
tic, toc - tic porneste un cronometru (timpul in secunde), toc citeste cronometrul;
>tic <Enter> - porneste cronometrul;
>toc <Enter> - citeste cronometrul, returneaza timpul scurs, in secunde, de la pornirea
cronometrului;
>tic, operatii, toc <Enter> - porneste cronometrul, efectueaza operatii si afiseaza timpul in
secunde folosit pentru operatii;
>s=toc; <Enter> - atribuie variabilei s timpul scurs de la pornirea cronometrului;
Exemple:
>tic; A=0:0.01:2*pi; B=sin(A); plot(A,B); grid; toc <Enter> - porneste cronometrul,
genereaza vectorul A cu elemente sirul valorilor de la 0 la 2 cu pasul de crestere 0.01,
calculeaza valorile functiei sin a acestor valori, traseaza graficul valorilor calculate, citeste
cronometrul si afiseaza timpul scurs de la pornire, in secunde.
etime - returneaza timpul scurs intre doua momente reprezentate prin doi vectori returnati de
functia clock sau avand formatul acestora (6 elemente); nu ia in consideratie diferentele implicate
de luna si an diferite;
> t1=clock; operatii, t2=clock; etime(t2,t1) <Enter> - atribuie variabilei t1 timpul curent
returnat de functia clock, efectueaza operatii, atribuie variabilei t2 timpul curent returnat de clock
si afiseaza diferenta, in secunde, dintre momentele t2 si t1;
Exemple:
> t1=clock; A=rand(1,100);B=1:100; bar(B,A); grid; t2=clock; etime(t2,t1) <Enter> atribuie variabilei t1 data si timpul curent, genereaza matricea A(1 ,100) cu numere aleatoare
cuprinse intre 0 si 1 dupa legea distributiei uniforme, construieste graficul tip bare cu valorile
generate, atribuie variabilei t2 timpuil curent si afiseaza timpul, in secunde, scurs intre t1 si t2;
- MS-Windows
MAC2
- Macintosh
SUN4
- Sun SPARC
SOL2
- Solaris 2
HP700
- HP 9000/700
SGI
SGI64
- Silicon Graphics
- Silicon Graphics R8000
IBM_RS
- IBM RS6000
ALPHA
- Dec Alpha
- Linux Intel
ans - cel mai recent raspuns (l.e., answer =raspuns). Este variabila creata in mod automat,
careia i se atribuie valoarea celei mai recente expresii neasignate.
Exemple:
>x=1.5; y=0.10; x^y
<Enter>
ans =
1.0414
Deci variabilei ans i se atribuie valoarea expresiei x^y.
> a=[1 2 3 4 5]; a>=2, ans-1 <Enter>
ans =
0
ans =
-1
In acest caz, variabilei ans i se atribuie mai intai vectorul cu elementele 0 sau 1 dupa cum este indeplinita sau
nu conditia a>=2, dupa care i se atribuie vactorul cu elementele ans-1.
<Enter>
ans =
2.220446049250313e-016
> epsc=1; while 1+epsc>1; epsc=epsc/2; end; epsc=2*epsc <Enter>
epsc =
2.220446049250313e-016
Se observa ca epsc=eps si acest exemplu reprezinta un mod practic pentru determinarea
preciziei curente a masinii.
>1+eps>1, 1+eps/2>1
ans =
1
ans =
0
<Enter>
In acest caz, pentru 1+eps>1 se obtine valoarea 1, corespunzand valorii logice adevarat,
in timp ce pentru 1+eps/2>1 se obtine valoarea 0, corespunzand valorii logice fals, raspuns
incorect datorat preciziei limitate in reprezentarea numerelor in modul virgula mobila.
<Enter>
ans =
3.141592653589793e+000
>4*atan(1)
<Enter>
ans =
3.141592653589793e+000
>log(-1)
<Enter>
ans =
0 +3.141592653589793e+0001
>sin(pi)
<Enter>
ans =
1.224606353822377e-016
Valoarea functiei sin(pi) este foarte mica, dar nu zero, datorita erorilor care decurg din
reprezentarea in virgula mobila a numerelor pe un numar finit de biti.
<Enter>
ans =
0 + 1.00000000000000i
ans =
0 + 1.00000000000000i
>a=1+3i, b=2+4j, c=a+b
<Enter>
a=
1.0000 + 3.0000i
b=
2.0000 + 4.0000i
c=
3.0000 + 7.0000i
> for i=1:10; a(i)=i/2; end; a
<Enter>
a=
Columns 1 through 7
0.5000
1.0000
1.5000
2.0000
2.5000
3.0000
3.5000
Columns 8 through 10
4.0000
4.5000
5.0000
In acest caz, i este variabila de ciclare a calculelor si nu mai reprezinta, in continuare, unitatea
imaginara.
Inf - plus infinit, reprezentat in aritmetica virgula mobila; in calcule, se obtine ca rezultat al
impartirii unui numar prin zero sau prin depasirea celui mai mare numar reprezentabil in
aritmetica curenta (overflow).
Exemple:
>1/0, exp(710), Inf+Inf
<Enter>
NaN - Nu este un numar (l. e., Not-a-Number), in aritmetica virgula mobila. Se obtine ca
rezultat al unor operatii: 0/0, Inf/Inf, Inf-Inf s.a.
Exemple:
>0/0, Inf/Inf, Inf-Inf, Nan-NaN
<Enter>
realmax - cel mai mare numar pozitiv reprezentabil in virgula mobila pe calculatorul curent.
Exemple:
>x=realmax, x+1.0e+291, x+1.0e+292, x+x
x=
1.797693134862316e+308
ans =
1.797693134862316e+308
<Enter>
ans =
Inf
ans =
Inf
realmin - cel mai mic numar pozitiv reprezentat normalizat in modul virgula mobila; orice
numar mai mic este egalat cu zero sau reprezentat denormal in modul virgula mobila.
Exemple:
> realmin
<Enter>
ans =
2.225073858507202e-308
> realmin/1.0e+015, realmin/1.0e+016, realmin/realmax
ans =
2.470328229206233e-323
ans =
0
ans =
0
<Enter>
<Enter>
<Enter>
<Enter>
<Enter>
a=
1
<Enter>
a=
1
b=
5
c=
1
55
35
d=
d=
55
35
Exemple:
>a=1:5; save c:\fisier3.dat a -ascii
<Enter>
<Enter>
<Enter>
b=
1
M=
a=
b=
1
Constantele in Matlab pot fi de tip numeric si de tip caracter sir. Constantele numerice
pot fi numere reale sau numere complexe.
Exemple:
1.2000 ; 12e-001 ; 1.0+2i ;
Variabilele in Matlab pot fi numerice sau de tip sir si sunt reprezentate ca matrice. Astfel, un
scalar este definit si tratat ca matrice (1x1), un vector ca matrice (1xn) sau (nx1), o matrice ca
matrice (nxm). Valorile momentane ale variabilelor se definesc prin operatiunea de atribuire,
variabila = expresie
unde variabila este un nume legal in Matlab (incepe cu o litera, contine litere din alfabetul
anglo-saxon si cifre, literele mari nu se confunda cu cele mici), iar expresie reprezinta o
constanta, expresie aritmetica, expresie logica, functie Matlab.
Exemple:
> a=1.2, b=a+2.5, c=a>b, d=sin(a)
a=
1.2000
b=
3.7000
c=
0
d=
0.9320
> A=eye(4), B=ones(4,2), C=A*B
A=
1
B=
1
C=
1
Elementele unei matrice pot fi constante de tip sir sau numere reale, complexe, expresii
Matlab si sunt referite prin indici cuprinsi in paranteze rotunde, separati intre ei prin virgula.
Definirea matricelor poate fi facuta:
a) prin introducerea listei de elemente:
nume_matrice = [lista_de_elemente]
unde nume_matrice este un nume legal de variabila (trebuie sa inceapa cu o litera, sa
contina numai caractere legale - litere din alfabetul anglo-saxon si, eventual, cifre). Elementele
din lista_de_elemente sunt separate intre ele, pe linie, prin unul sau mai multe spatii albe
(blank-uri), iar liniile sunt separate intre ele prin caracterul puct si virgula (;) sau prin
introducere elementelor pe linia ecran urmatoare.
Exemple:
>a=1.20, size(a)
a=
1.2000
ans =
1
2.5000
3.1000
4.2000
0.3000
2.5000
3.1000
4.2000
0.3000
>B=[1 0 2 4 2; 3 2 1 0 0; 5 4 3 2 1]
B=
1
>C=[1 0 1 -1
1234
4 3 2 1]
C=
1
-1
2.0000
3.0000
0.8415
> B=zeros(3,3)
B=
0
> C=ones(3,3)
C=
1
> D=eye(3)
D=
1
2.0000
3.0000
0.5000
1.5000
2.5000
0.8415
0.9093
0.1411
0.4794
0.9975
0.5985
A=
2.0000
3.0000
0.5000
1.0000
1.5000
2.0000
3.0000
4.0000
5.0000
1.0000
1.4142
1.7321
2.0000
2.2361
2.0000
3.0000
4.0000
5.0000
1.0000
1.4142
1.7321
2.0000
2.2361
d) prin extragere din matrice mai mari sau prin compunere de matrice mai mici:
Exemple:
> A=[1:0.5:2.5; 2.5:-0.5:1]; B=A(1:2,1:3)
B=
1.0000
1.5000
2.0000
2.5000
2.0000
1.5000
a) Expresii aritmetice
Expresiile aritmetice sunt definite prin operanzi, separati intre ei prin operatori
aritmetici. Operanzii pot fi constante sau variabile. Operatorii aritmetici in Matlab sunt
diferentiati dupa natura operanzilor. Astfel, pentru operatii intre scalari, operatii intre matrice si
operatii intre scalari si matrice (tablouri), se folosesc urmatorii operatori aritmetici:
Operatia
Scalari
Matrice
Tablouri
Adunare
Scadere
Inmultire
.*
Impartire la stanga
.\
Impartire la dreapta
./
Ridicare la putere
.^
Transpunere
Ordinea operatiilor aritmetice este cea din matematica obisnuita. Se folosesc numai
paranteze rotunde.
Exemple:
>a=1.2, b=0.10, c=a+b, d=a-b, e=a*b, f=a/b, g=a\b, h=a^b
a=
1.2000
b=
0.1000
c=
1.3000
d=
1.1000
e=
0.1200
f=
12.0000
g=
0.0833
h=
1.0184
> A=[0 1 2; 3 1 4; 5, 2 -6], B=eye(3), C=A+B, D=A-B, E=A*B, F=A/B, G=A\B, H=A^2, I=A'
A=
0
-6
-5
-1
-7
-6
-6
B=
C=
D=
E=
F=
G=
-0.3500
0.2500
0.0500
0.9500 -0.2500
0.1500
0.0250
0.1250 -0.0750
H=
13
-8
23
12 -14
-24
-5
54
-6
I=
C=
1.1000
0.1000
1.1000
-0.9000
2.1000 -2.9000
D=
0.9000 -0.1000
-1.1000
0.9000
1.9000 -3.1000
E=
0.1000
-0.1000
0.1000
0.2000 -0.3000
F=
10
10
-10
20 -30
G=
1.0 0
1.0000
1.0615 + 0.3449i
b) Expresii relationale
Sunt constituite din constante, variabile, expresii aritmetice (operanzi), separate intre
ele prin operatori de relatie. Valoarea unei expresii relationale poate fi adevarat, reprezentat
numeric prin numarul 1, sau fals, reprezentat numeric prin numarul 0. In Matlab, operatorii
relationali compara doua matrice element cu element si returneaza rezultatul intr-o matrice
de aceleasi dimensiuni, cu elementele 0 sau 1. Operatorii de relatie in Matlab sunt:
Operator
Semnificatie
<
<=
>
>=
==
~=
Exemple:
>A=[1 -1 2 -2; 0 1 2 3], B=ones(2,4), A<B, A<=B, A>B, A>=B, A==B, A~=B
A=
1
-1
-2
B=
1
ans =
ans =
ans =
ans =
ans =
ans =
c) Expresii logice
Sunt constituite din expresii relationale, separate intre ele prin operatori logici.
Valoarea unei expresii logice poate fi adevarat, reprezentat numeric prin numarul 1, sau
fals, reprezentat numeric prin numarul 0. In Matlab, operatorii logici opereaza asupra a doua
matrice in modul element cu element si returneaza rezultatul intr-o matrice cu aceleasi
dimensiuni, cu elementele 0 sau 1. Operatorii logici in Matlab sunt:
Operator
Simbol
Operatie logica
Prioritate
Matlab
NU
~=
SI
&
SI logic
SAU
SAU logic
-2
-3
-2
-3
-4
B=
C=
ans =
ans =
ans =
T=
1
ans =
1
0.5000
0.4794
1.0000
0.8415
0.4794
1.0000
0.8415
1.5000
0.9975
2.0000
0.9093
2.5000
0.5985
3.0000
0.1411
3.5000 -0.3508
Instructiunea break - intrerupe executia unei instructiuni de calcul repetitiv for sau while.
Exemple:
> clear; x=0; k=0; while x<pi; k=k+1; x=x+0.50; f=sin(x); X(k)=x; F(k)=f; if x>1.5; break; end,end; [X' F']
ans =
0.5000
0.4794
1.0000
0.8415
1.5000
0.9975
2.0000
0.9093
inclusiv atribuirea de noi valori variabilelor curente. Iesire din modul keyboard se face tastand
comanda return.
Exemple:
A=zeros(1,2); for k=1:2; k, A(k)=input('A(k) = '); keyboard; end; A
k=
1
A(k) = -1
K A(1)=3
A=
3
K return
k=
2
A(k) = 1
K return
A=
3
Programul Matlab este orientat in mod deosebit spre lucrul cu functii. Exista functii
interne, pentru calcule uzuale, si functii externe, definite in bibliotecile Matlab (toolbox-uri)
sau definite de catre utilizator. Functiile externe utilizator se definesc dupa sintaxa:
unde:
function - cuvant cheie (instructiune), se foloseste obligatoriu pentru a preciza ca urmeaza
definirea unei functii externe utilizator;
lista_variabile_de iesire - lista variabilelor de iesire, separate intre ele prin virgula, cu
valori returnate de functie; in cazul unei singure variabile, nu mai este necesara incadrarea ei in
paranteze drepte;
nume_functie - un nume legal de functie (incepe cu o litera, contine litere si, eventual cifre,
lungime maxima opt caractere);
lista_argumente_de_intrare - lista argumentelor de intrare (constante sau variabile),
separate intre ele prin virgula;
set_de_instructiuni - set de instructiuni Matlab pentru calculul variabilelor de iesire.
Instructiunea return - cauzeaza intreruperea executiei unui program de tip functie externa si
transfera executia catre programul apelant. Se foloseste deasemenea pentru terminarea modului
keyboard.
Exemple:
Fie functia externa fh.m :
function q=fh(h);
global m b n Jf
T=[m b n Jf];
if (m<0|b<0|n<0|Jf<0)
disp('Cel putin una din valorile initiale este negativa');
return
end
j=Jf;
A=(b+m*h)*h; P=b+2*h*sqrt(1+m^2); R=A/P;
C=1/n*R^(1/6);
q=A*C*sqrt(R*j);
Fie programul principal pfh.m:
% program pfh.m
global m b n Jf
m=1; b=1; n=0.018; Jf=-0.001;
h=0.50;
Q=fh(h)
Lansam in executie programul principal:
>pfn
<Enter>
Se obtine:
m=
1
b=
-1
n=
0.0180
Jf =
0.0050
h=
0.5000
Cel putin una din valorile initiale este negativa
Warning: One or more output arguments not assigned during call to 'fh'.
> In C:\MATLAB5.0\bin\pfh.m at line 5
In Matlab este recomandata ori de cate ori este posibila efectuarea operatiilor cu vectori
si matrici in locul celor repetitive cu scalari, acest fapt conducand la cresterea vitezei de
executie a calculelor de 10 - 15 ori. Deasemeni, ori de cate ori se lucreaza cu vectori si matrice
se recomanda prealocarea acestora cu functia zeros, economisindu-se timp de calcul prin
evitarea redimensionarii acestora la fiecare ciclu.
Exemple:
Se doreste trasarea graficului functiei
y = x 4 + 5 x 3 6 , x [6, 2] .
Se adopta un pas de crestere a argumentului x egal cu 0.01. Se editeaza si se executa, comparativ, programele:
a) fara vectorizarea calculelor
% Exemplul 9.1.a
k=0;
t1=cputime;
for x=-6:0.1:2;
k=k+1; X(k)=x; Y(k)=x^4+5*x^3-6;
end
t2=cputime;
t=t2-t1
hf=figure; plot(X,Y); grid; xlabel('x'); ylabel('y')
Se obtine (t - timpul folosit de CPU pentru calcule, in secunde):
t=
0.0100
250
200
150
100
50
-50
-100
-6
-5
-4
-3
-2
x
-1
b) cu vectorizarea calculelor:
% Program pex91b.m
t1=cputime;
x=-6:0.1:2;
y=x.^4+5.*x.^3-6;
t2=cputime;
t=t2-t1
hf=figure; plot(x,y); grid; xlabel('x'); ylabel('y');
se obtine
t=
0
Exemple:
>clear;A=zeros(3),B=ones(2,3),C=eye(3),D=rand(2,3),E=randn(2,3),F=linspace(0,10,5),G=logspace(0,1,5)
A=
0
B=
C=
D=
0.4103
0.0579
0.8132
0.8936
0.3529
0.0099
-0.5883 -0.1364
1.0668
2.1832
0.0593
E=
0.1139
F=
0
2.5000
5.0000
7.5000 10.0000
G=
1.0000
1.7783
3.1623
5.6234 10.0000
y=
2
X=
Y=
f=
0.8415 -0.7568
0.8415
0.9564
0.9894
0.9200 -0.6160
0.1760
0.8415
0.7737
0.8415
0.9200
c) Operatii cu vectori
n
Produsul scalar a doi vectori, C = A B = a ( i ) b( i ) se calculeaza cu functia sum,
i =1
B=
-1.0000
2.0000
0.5000
C=
1.5000
ans =
4.5826
Exemplu:
>A=ones(1,3), B=[-1 2 0.5], cosAB=sum(A.*B)/(norm(A)*norm(B)), alfa=acos(cosAB)
A=
1
B=
-1.0000
2.0000
0.5000
cosAB =
0.3780
alfa =
1.1832
i
Produsul vectorial C = A x B = a x
bx
j k
b y bz
Exemplu:
A=ones(1,3), B=[-1 2 0.5], C=A'*B
A=
1
B=
-1.0000
2.0000
0.5000
-1.0000
2.0000
0.5000
-1.0000
2.0000
0.5000
-1.0000
2.0000
0.5000
C=
Modulul produsului vectorial (norma sau lungimea), C = A B sin( A, B ) se calculeaza,
B=
-1.0000
cosAB =
0.3780
2.0000
0.5000
alfa =
1.1832
modpvAB =
3.6742
d) Operatii cu matrice
Manipulare matrice
diag - creaza sau extrage diagonala unei matrice;
diag(V), unde V este un vector, creaza o matrice cu elementele vectorului V pe
dagonala principala;
elementele vectorului V;
diag(V,k), unde V este un vector, creaza o matrice cu elementele vectorului V pe
diagonala k (k>0 - deasupra diagonalei principale, k<0 - sub diagonala
principala);
diag(A) , unde A este o matrice, extrage diagonala principala;
diag(A,k), unde A este o matrice, extrage diagonala k;
flipir - roteste matricea in jurul axei verticale, cu sintaxa flipir(A);
flipud - roteste matricea in jurul axei orizontale, cu sintaxa flipud(A);
tril - extrage matricea inferior triunghiulara, cu sintaxa tril(A);
triu - extrage matrice superior triunghiulara, sintaxa triu(A);
Exemple:
>V=[1 2 3]; A=diag(V), D=diag(A), E=diag(A,2),F=flipud(A),G=tril(A)
A=
1
D=
1
2
3
E=
0
F=
G=
1
Operatii cu matrice
Determinantul unei matrice patrate A se calculeaza cu functia det(A);
Inversa unei matrice patrate A se calculeaza cu functia inv(A);
Pseudoinversa unei matrici A(n,m) se calculeaza cu functia pinv(A);
Rangul unei matrice A se calculeaza cu functia rank(A);
Urma unei matrice A se calculeaza cu functia trace(A);
Valori si vectori proprii. Daca A este o matrice patrata, atunci [V,D]=eig(A) returneaza
matricea V cu vectorii proprii pe coloane si matricea diagonala D cu valorile proprii, astfel incat
A*V=V*D.
A se vedea si functiile: chol, lu, qr, qz, rref, svd.
Exemple:
>A=rand(3,3),detA=det(A), invA=inv(A), rankA=rank(A),[V,D]=eig(A)
A=
0.9318
0.8462
0.6721
0.4660
0.5252
0.8381
0.4186
0.2026
0.0196
2.1270
6.3365
detA =
0.0562
invA =
-2.8374
2.9425
1.6899
rankA =
3
V=
0.8133
0.5171
0.2666
D=
1.6901
0
0
-0.1068 + 0.1479i
0
-0.1068 - 0.1479i
Simbol plotare
Tip linie
------------------------------------. punct
- solid
o cerc
: prin puncte
x semnul x
-. linie punct
+ plus
-- linie intrerupta
* steluta
s patrat
d diamant
v triunghi (in jos)
^ triunghi (in sus)
< triunghi (stanga)
> triunghi (dreapta)
p pentagon
h hexagon
Se obtine:
y=f(x)
1
y=si n(x)/2
y=si n(x)
y=cos(x)
y=si n(x)*cos(x)
0.8
0.6
0.4
0.2
0
-0.2
-0.4
Autor: Ing. I. Ion
-0.6
Coautor: Ing. G. Ion
-0.8
-1
4
x [rad]
Exemplu:
% program p10b.m Exemplu pentru functia plot, combinata cu subplot
x=0:0.05:2*pi;
y=sin(x)./2; y1=sin(x); y2=cos(x); y3=sin(x).*cos(x);
xmin=min(x); xmax=max(x);
ymin=min(y); ymax=max(y);
ymin1=min(y1); ymax1=max(y1);
ymin2=min(y2); ymax2=max(y2);
ymin3=min(y3); ymax3=max(y3);
hf=figure;
subplot(2,2,1);
plot(x,y); axis([xmin xmax ymin ymax]);
xlabel('x [rad]'); grid; ylabel('y'); title('y=sin(x)./2');
subplot(2,2,2);
plot(x,y1); axis([xmin xmax ymin1 ymax1]);
xlabel('x [rad]'); grid; ylabel('y'); title('y=sin(x)');
subplot(2,2,3);
plot(x,y2); axis([xmin xmax ymin2 ymax2]);
xlabel('x [rad]'); grid; ylabel('y'); title('y=cos(x)');
subplot(2,2,4);
plot(x,y3); axis([xmin xmax ymin3 ymax3]);
xlabel('x [rad]'); grid; ylabel('y'); title('y=sin(x)*cos(x)');
Se obtine:
y=sin(x)./2
y=sin(x)
0.4
0.5
0.2
-0.2
0
-0.5
-0.4
0
4
x [rad]
y=cos(x)
4
x [rad]
y=sin(x)*cos(x)
1
0.4
0.2
0.5
0
-0.2
-0.5
-0.4
0
4
x [rad]
4
x [rad]
10
sin(x)*sin(x)
sin(x)*sin(x)
0.8
0.6
0.4
0.2
0
4
x [rad]
10
-5
10
10
-2
10
x [rad]
10
sin(x)*sin(x)
sin(x)*sin(x)
0.8
0.6
0.4
0.2
0
-2
10
10
x [rad]
10
10
-5
4
x [rad]
Se obtine:
90
3.0668
120
60
2.0445
150
30
1.0223
180
210
330
240
300
270
0.9
1.6
0.8
0.8
1.4
0.7
0.6
1.2
0.6
0.4
0.5
0.8
0.4
0.2
0
-0.2
0.6
0.3
0.4
0.2
0.2
0.1
-0.4
-0.6
-0.8
-1
Fie un set discret de date [x, y], in care x si y sunt vectori de aceeasi lungime si y = f(x),
unde expresia functiei f este necunoscuta. Aproximarea functiei f prin interpolare presupune
determinarea unei functii f* astfel incat pentru orice x [min( x ), max( x )] , sa avem
f (x) f *(x) .
proprietatile:
(i) pe fiecare interval [x i , x i+1 ] , s coincide cu un polinom de grad cel mult n;
(ii) s C n 1 [a , b].
Punctele x i , i = 1,2,..., n se numesc nodurile functiei spline. O functie spline interpoleaza
datele ( x1 , y1 ), ( x 2 , y 2 ),..., ( x n , y n ) daca si = y i , i = 1,2,..., n . Cel mai frecvent utilizate sunt
functiile spline de tip polinom de gradul trei, numite si functii spline cubice, de forma
si ( x ) = a i + bi ( x x i ) + c i ( x x i ) 2 + d i ( x x i ) 3 , cu x [x i , x i +1 ] ,
unde a i , bi , c i , d i , i = 1,2,..., n sunt coeficientii functiei spline cubice si se determina din
proprietatile functiei spline, care in acest caz sunt:
(i) si ( x i ) = y i , i = 1,2,..., n;
(ii) si( k ) ( x i +1 ) = si(+k1) ( x i +1 ), k = 0,1, 2 ; i = 1,..., n 1.
Acestea conduc la un sistem liniar cu n-1 ecuatii si n+1 necunoscute; considerand
c1 = c n = 0 , caz in care functia este numita spline naturala, se solutioneaza sistemul,
YI = spline(X,Y,XI) , unde X, Y sunt vectori de lungimi egale cu valorile functiei date prin
puncte, XI - vectorul punctelor in care se doreste interpolarea, YI - valorile interpolate cu functii
cubice spline;
pp = spline(X,Y); YI=ppval(pp,XI) , unde pp este forma pp a interpolantului spline cubic,
folosit de functia ppval; ceilalti termeni au aceeasi semnificatie ca mai sus.
Exemplul 10.1. Se dau vectorii X si Y cu valorile functiei in cateva puncte. Sa se interpoleze cu functii spline
domeniul x cu pasul dx=0.10 si sa se reprezinte grafic ambele functii.
>X=1:10;Y=[0.3 0.1 0.4 0.5 0.6 0.55 0.45 0.3 0.2 0.25];x=1:0.1:10;y=spline(X,Y,x); plot(X,Y,'*',x,y);grid;
legend(valori date, valori interpolate)
Se obtine reprezentarea grafica:
0.7
valori date
valori interpolate
0.6
0.5
0.4
0.3
0.2
0.1
10
Exemplul 10.2. Sa se foloseasca interpolantul pp si functia ppval pentru problema din Exemplul 10.1.
>X=1:10; Y=[0.3 0.1 0.4 0.5 0.6 0.55 0.45 0.3 0.2 0.25]; x=1:0.1:10; pp=spline(X,Y); y=ppval(pp,x);
plot(X,Y,'*',x,y); grid; legend('valori date','valori interpolate')
b) Interpolare multipla
Pentru interpolare liniara, spline cubica si cubica se foloseste in Matlab functia interp1,
cu sintaxa
YI=interp1(X,Y,XI,regula),
unde X, Y - vectorii valorilor functiei date prin puncte, XI - vectorul valorilor in care se doreste
interpolarea, regula - unul din cuvintele cheie linear, spline sau cubic, corespunzand cazurilor
interpolare liniara, respectiv spline cubica si cubica, YI - valorile functiei calculate prin
interpolare.
Exemplul 10.3. Se dau vectorii X si Y cu valorile functiei date prin puncte. Sa se interpoleze pe domeniul x cu
pasul de calcul dx=0.1 valorile functiei prin interpolare liniara, spline cubica si cubica si sa se reprezinte grafic
rezultatele.
>X=1:10; Y=[0.3 0.1 0.4 0.5 0.6 0.55 0.45 0.3 0.2 0.25]; x=1:0.1:10; y1=interp1(X,Y,x,'linear');
y2=interp1(X,Y,x,'spline'); y3=interp1(X,Y,x,'cubic'); plot(X,Y,'*',x,y1,x,y2,x,y3); grid; legend('valori
date','int.liniara','int.spline cubica','int.cubica')
Se obtinereprezentarea grafica:
0.7
valori date
int.liniara
int.spline cubica
int.cubica
0.6
0.5
0.4
0.3
0.2
0.1
10
ZI=interp2(X,Y,Z,XI,YI,regula)
in care X si Y sunt vectorii coordonatelor in care se dau valorile functiei, dintre care unul este
vector linie si celalalt este vector coloana; Z - vectorul valorilor date ale functiei; XI si YI vectorii coordonatelor in care se doreste interpolarea, ZI - vectorul valorilor functiei calculate
prin interpolare, regula - unul din cuvintele cheie linear sau cubic, pentru interpolare
biliniara, respectiv bicubica.
Exemplul 10.4. Se dau vectorii X, Y, Z, XI si YI. Sa se calculeze prin interpolare cu pasi dx si dy dati, valorile
functiei prin interpolare biliniara si bicubica si sa se reprezinte grafic rezultatele in 3-D.
% program p13a.m
X=1:5; Y=1:3;
Z=[0.1 0.3 0.2 0.1 0.5;
0.2 0.3 0.1 0.4 0.5;
0.2 0.3 0.4 0.3 0.2];
[X0,Y0]=meshgrid(X,Y);
hf=figure; mesh(X0,Y0,Z);
x=1:0.1:5; y=1:0.1:3;
zi=interp2(X,Y',Z,x,y','cubic');
[x0,y0]=meshgrid(x,y);
hf=figure; mesh(x0,y0,zi)
Se obtin reprezentarile grafice:
0.5
0.4
0.3
0.2
0.1
3
2.5
5
4
1.5
2
1
Regresia polinomiala aproximeaza, in sensul celor mai mici patrate, valoarea functiei
data printr-un numar de puncte, printr-un polinom de grad n,
Pn ( x ) = a1 x n + a 2 x n 1 + a 3 x n 2 + ... + a k x n k +1 + ... + a n x + a n +1 .
Exemplul 10.5. Se dau vectorii X si Y. Sa se determine coeficientii polinomului de gradul 3 care interpoleaza
valorile functiei date prin puncte. Sa se reprezinte grafic punctele date si valorile functiei calculate prin interpolare,
folosind pe domeniul x un pas de crestere dx dat.
> X=1:5; Y=[0.1 0.25 0.32 0.40 0.50]; A=polyfit(X,Y,3); x=1:0.1:5; y=polyval(A,x); plot(X,Y,'*',x,y); grid
Se obtine reprezentarea grafica:
0.6
valori date
valori interpolate
0.55
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
1.5
2.5
3.5
4.5
(1)
se determina in Matlab cu ajutorul functiei roots, cu sintaxa X=roots(A), unde A este vectorul
coeficientilor polinomului si X este vectorul solutiilor.
x 4 + 5x 3 6 = 0.
-6
X=
-5.04668032415002
-0.47665983792499 + 0.98066087317288i
-0.47665983792499 - 0.98066087317288i
1.00000000000000
Exemplul 11.2. Calculul adancimii normale a apei intr-un canal trapezoidal, cunoscand Q, b, m, n si j.
Se editeaza functia externa fhn.m;
function y=fhn(x);
global Q m b n j
h=x;
A=(b+m*h)*h; P=b+2*h*sqrt(1+m^2); R=A/P;
C=1/n*R^(1/6);
y=Q-A*C*sqrt(R*j);
Q =
10
b =
1
m =
1
n =
0.01800000000000
j =
0.00500000000000
Func evals
f(x)
Procedure
4.90377
initial
0.971716
5.18844
search
1.02828
4.60968
search
0.96
5.30362
search
1.04
4.48508
search
0.943431
5.4638
search
1.05657
4.30606
search
0.92
5.68495
search
1.08
4.04724
search
10
0.886863
5.98703
search
11
1.11314
3.6698
search
12
0.84
6.39325
search
13
1.16
3.11289
search
14
0.773726
6.92661
search
15
1.22627
2.27818
search
16
0.68
7.60122
search
17
1.32
1.00103
search
18
0.547452
8.40301
search
19
1.45255
-1.00529
search
1.35584
0.482049
interpolation
21
1.38718
0.0139832
interpolation
22
1.38811 -1.00861e-005
interpolation
23
1.3881
4.17773e-009
interpolation
24
1.3881
3.55271e-015
interpolation
25
1.3881
1.77636e-015
interpolation
26
1.3881 -1.77636e-015
interpolation
h =
1.38810488162221
a) Rezolvarea sistemelor prin folosirea matricei inverse. Fie un sistem de n ecuatii liniare cu n
necunoscute, A x = b . Daca matricea A este nesingulara, atunci inversa ei, notata cu A-1 , poate
fi calculata cu functia inv, cu sintaxa inv(A), si solutia sistemului este x = A 1 b .
Exemplul 6.1. Sa se rezolve sistemul liniar de ecuatii
4x1 + x 2 + 2x 3 = 16
x1 + 3x 2 + x 3 = 10
x + 2x + 5x = 12
2
3
1
Notam, in Matlab, cu A matricea coeficientilor sistemului, cu x vectorul necunoscutelor si cu b vectorul termenilor
liberi. Solutia se obtine cu secventa urmatoare de instructiuni,in modul de lucru direct, verificand si nesingularitatea
matricei A.
>A=[4 1 2; 1 3 1; 1 2 5], b=[16; 10; 12], detA=det(A), x=inv(A)*b
A=
4
b=
16
10
12
detA =
46
x=
3.0000
2.0000
1.0000
b=
16
10
12
x=
3
2
1
9 x1 + x 2 x 3 = 9
x + 9x x = 9
1
2
4
x1 + 9 x 3 + x 4 = 9
x 2 + x 3 + 9 x 4 = 9
Solutionarea in Matlab, in modul de lucru direct:
> A=[9 1 -1 0; 1 9 0 -1; -1 0 9 1; 0 -1 1 9], b=[9; 9; 9; 9], [L,U,P]=lu(A), y=L\(P*b), x=U \ y
A=
9
-1
-1
-1
-1
b=
9
9
9
9
L=
1.0000
0.1111
1.0000
-0.1111
0.0125
1.0000
-0.1125
0.1139
1.0000
U=
9.0000
1.0000
-1.0000
8.8889
0.1111
-1.0000
8.8875
1.0125
8.7722
P=
1
y=
9.0000
8.0000
9.9000
8.7722
x=
1.0000
1.0000
1.0000
1.0000
d. Metoda factorizarii QR. Se foloseste pentru solutionarea sistemelor cu mai multe ecuatii
decat necunoscute, in sensul celor mai mici patrate. Cea mai buna solutie a unor astfel de sisteme
se obtine in Matlab cu instructiunea x=A\b care utilizeaza aceasta factorizare.
Fie un sistem de m ecuatii liniare cu n necunoscute, m>n, A x = b. Matricea A poate fi
factorizata sub forma Q R = A E (sau Q R E = A), unde E reprezinta o matrice identitate de
permutare, folosind in Matlab functia qr cu sintaxa [Q,R,P]=qr(A). Astfel sistemul de ecuatii
A x = b devine Q R E x = b; notam R E x = y si obtinem Q y = b. Solutia poate fi calculata in
doua etape: y = Q\b, x =(R*E)\ y.
Exemplul 6.4.
>A=[4 1 2; 1 3 1; 1 2 5; 2 -1 3], b=[16; 10; 12; 11], [Q,R,E]=qr(A), y=Q\b, x=(R*E)\y
A=
4
-1
b=
16
10
12
11
Q=
-0.3203 -0.8679 -0.0508 -0.3762
-0.1601 -0.1422 -0.7923
-0.8006
0.5713
-0.4804 -0.1347
0.5834
0.6409
R=
-6.2450 -3.2026 -1.9215
0
-3.4269 -0.2469
-3.3536
P=
0
y=
-21.6173
-11.3132
-4.3738
2.5637
x=
1.3042
1.4155
3.2073
-1
b=
16
10
12
11
x=
3.2073
1.3042
1.4155
Conditionarea sistemelor. Un sistem este slab conditionat daca modificari mici ale valorilor
coeficientilor produc variatii mari ale solutiilor. Functia cond, cu sintaxa c=cond(A) returneaza
numarul de conditionare al matricei A, calculat ca raportul dintre cea mai mare si cea mai mica
valoare singulara a acesteia. O valoare mare indica o conditionare slaba si invers. O functie mai
performata pentru estimarea conditionarii unei matrice este rcond, cu sintaxa r=rcond(A), care
returneaza valoarea 1 pentru matrice bine conditionate si valori apropiate de zero pentru cele
foarte slab conditionate. Imbunatatiri ale conditionarii se pot obtine prin aplicarea unor
transformari elementare matricelor.
Exemplul 6.6. Fie sistemul
1.57 x - 3.42 y = 2.35
1.60 x -3.40 y = 2.40
Se calculeaza numarul de conditiuonare si se rezolva sistemul in modul de lucru direct. Se constata o
conditionare foarte slaba. Modificati apoi foarte putin elementul de pe linia 1, coloana 1, a matricei A,
luandu-l egal cu 1.58. Rezolvati din nou sistemul. Observati diferentele intre cele doua solutii. Prin scaderea
primei ecuatii din a doua si multiplicarea rezultatului cu 100 se obtine, in acest caz, o imbunatatire a solutiei.
Repetati calculul numarului de conditionare si analizati din nou stabilitatea solutiei.
>A=[1.57 -3.42; 1.60 -3.40], b=[2.35; 2.40], x=A\b, c=cond(A), r=rcond(A)
A=
1.5700 -3.4200
1.6000 -3.4000
b=
2.3500
2.4000
x=
1.6269
0.0597
c=
211.0497
r=
0.0039
Nu exista metode generale, bune, pentru rezolvarea sistemelor cu mai mult de o ecuatie
neliniara si, foarte probabil, nici nu vor fi [Press W. H, Flannery B. P., Vetterling W. T. Numerical Recipes, pag. 269, Cambridge University Press, Cambridge, 1989]. Aceasta
afirmatie este argumentata prin faptul ca functiile sistemului nu au nici o legatura intre ele,
numarul solutiilor este necunoscut si o solutie nu reflecta nimic special cu privire la o functie
sau alta.
In cazul sistemelor de doua ecuatii, reprezentarea contururilor functiilor de valoare zero pe un
domeniu dat poate furniza informatii cu privire la existenta si numarul solutiilor reale pe
domeniul considerat. In cazul sistemelor cu mai mult de doua ecuatii, procedeul este dificil de
aplicat. In unele aplicatii tehnice, numarul solutiilor si domeniile care le contin rezulta din
considerente fizice. Presupunand ca o solutie a sistemului a fost localizata, calculul solutiei
aproximative este posibil printr-un procedeu iterativ, cel mai cunoscut fiind Newton - Raphson.
Exemplul 15.1.a. Sa se localizeze solutiile sistemului de ecuatii
f 1 ( x1 , x 2 ) = x12 + x 22 x1 = 0
f 2 ( x1 , x 2 ) = x12 x 22 x 2 = 0
Vom reprezenta in planul ( x1 , x2 ) contururile functiilor f 1 , f 2 de valoare zero, folosind functia Matlab
contour. Se editeaza functia externa contf0.m in care se definesc expresiile functiilor f 1 , f 2 si care poate fi apelata
cu sintaxa contf0 (X1,X2), unde X1, X2 reprezinta vectorii domeniului de calcul ai variabilelor x1 , x2 .
Considerand X1=-1:0.02:1, X2=-1:0.02:1, se obtine reprezentarea grafica din Fig. 15.1.a. Se observa ca sistemul
are doua solutii reale, prima banala si a doua, localizata mai bine cu ajutorul functiei Matlab zoom, Fig. 15.1.b,
continuta in domeniul x1 ( 0.771; 0.772) , x2 ( 0.419; 0.420) .
function contf0(X1,X2);
X2=X2';
[x1,x2]=meshgrid(X1,X2);
f1=x1.^2+x2.^2-x1;
f2=x1.^2-x2.^2-x2;
hf=figure;
contour(x1,x2,f1,[0 0],'r'); hold on;
contour(x1,x2,f2,[0 0],'b:'); grid;
xlabel('x1'); ylabel('x2');
legend('f1(x1,x2)=0','f2(x1,x2)=0'); zoom on;
1
f1(x1,x2)=0
f2(x1,x2)=0
0.8
f1(x1,x2)=0
f2(x1,x2)=0
0.423
0.6
0.422
0.4
0.421
x2
x2
0.2
0
0.42
-0.2
0.419
-0.4
0.418
-0.6
-0.8
-1
-1
0.417
-0.5
0
x1
0.5
0.769
a)
0.77
0.771
0.772
x1
0.773
0.774
b)
Fig. 15.1.
............................
f n ( x1 , x 2 ,..., x n ) = 0
(15.1)
(15.2)
(15.3)
= x (k ) + (k ) ,
(15.4)
unde ( k ) este vectorul corectiilor (erorilor de aproximare). Tinand cont de relatia (15.4), relatia
(15.3) devine
f (x ( k ) + ( k ) ) = 0 .
(15.5)
(15.6)
( 15.7)
f 1 f 1
f
... 1
x1 x 2
x n
f '( x ( k ) ) = J( x ( k ) ) = .... ......
f n f n
x1 x 2
f
..... = i , i, j = 1, 2,..., n .
x j
f n
...
x n
(15.8)
Sistemul de ecuatii (15.7) este liniar in raport ( k ) , astfel incat, presupunand ca matricea
J( x ( k ) ) este nesingulara, corectiile pot fi calculate ca solutie a sistemului liniar
J( x ( k ) ) ( k ) = f ( x ( k ) )
(15.9)
( k ) = J ( x ( k ) ) 1 f ( x ( k ) ) .
( 15.10)
Corectiile calculate cu relatiile (15.9) sau (15.10) vor verifica ecuatia (15.4) numai daca
sistemul de ecuatii (15.2) este liniar in raport cu x, datorita liniarizarii admise in relatia (15.6).
In cazul general, nu putem decat sa obtinem o noua aproximare a solutiei exacte,
x ( k +1) = x ( k ) + ( k ) ,
(15.11)
x ( k +1) = x ( k ) J( x ( k ) ) 1 f ( x ( k ) ) .
(15.12)
Relatia (15.12) reprezinta o extindere a metodei Newton (metoda tangentei) folosita pentru
rezolvarea ecuatiilor neliniare de o singura variabila la cazul sistemelor neliniare,
multivariabile.
Pornind de la o solutie de start, x ( 0 ) , din vecinatatea solutiei exacte, in anumite conditii sirul
vectorilor generati prin relatia iterativa ( 15.12) converge catre solutia exacata .
Daca functiile f(x) sunt derivabile si au derivate de ordinul intai continue pe D si daca
matricea jacobiana J( x ( 0 ) ) admite o inversa J( x ( 0 ) )1 , atunci convergenta procedeului iterativ
este asigurata de indeplinirea conditiilor [Simionescu I., Dranga M., Moise V. - Metode
numerice in tehnica, pag. 83, Editura Tehnica, Bucuresti, 1995]
J( x ( 0 ) )1 A ; J( x ( 0 ) )1 f ( x ( 0 ) = x (1) x ( 0 ) B ;
k =1
2fi
C, i, j = 1,2,..., n ; 2nABC 1 ,
xix j
(15.13)
unde
reprezinta norma .
Daca conditiile (15.13) sunt indeplinite si este o solutie a sistemului, atunci aproximatiile
succesive x ( p ) , p = 0,1, 2,... verifica inegalitatea [Demidovici B., Maron I. - Elements de calcul
numerique, pag. 469, Edition Mir, Moscou, 1973]
1
2
x( p)
p 1
B( 2nABC )2 p 1 ,
(15.14)
ceea ce semnifica faptul ca pentru 2nABC < 1 convergenta procedeului iterativ Newton Raphson este superrapida.
Drep criterii de stop calcul in aplicarea relatiei iterative (15.12) pot fi folosite conditiile
(15.15)
unde ax si af sunt erorile maxime absolute admise (tolerate, impuse) in aproximarea solutiei
x ( k +1) x ( k )
x ( k +1)
rx , rx > 0 ,
(15.16)
unde:
x reprezinta vectorul solutie calculata;
cod - un scalar cu valoarea 0 pentru iesire normala din algoritm si 1 in caz contrar (daca
dupa
kmax=1000 de iteratii nu este atinsa convergenta cu precizia impusa);
k - numar iteratii efectuate;
Fun01 - sir de caractere continand numele functiei externe editate de utilizator pentru
definirea expresiilor functiilor sistemului de ecuatii; este folosita pentru evaluarea
functiilor la fiecare iteratie a algoritmului si trebuie sa aiba sintaxa
y=Fun01(x), sau, daca lista_de_parametri nu este vida, y=Fun01(x,varagin),
unde x este vectorul coloana al necunoscutelor;
Fun02 - sir de caractere continand numele functiei externe pentru calculul elementelor
matricei jacobiene. Daca se doreste evaluarea derivatelor de ordinul intai pe cale
numerica, atunci poate fi folosita functia externa numjac.m editata in acest scop,
prezentata mai jos, si Fun02 va contine sirul de caractere numjac. Daca se folosesc
end
% verifica daca fx si jx sunt reale si finite
if any(~isreal([fx jx]))|any(~isfinite([fx jx]))
error('Valorile functiilor si jacobianului nu sunt reale si finite')
end
% afiseaza valorile curente x, f(x) si dif daca este cazul
if trace
disp(sprintf('
%5.0f',k));
disp(sprintf('
%13.6g %13.6g %13.6g\n',[x';fx';dif']));
disp('
-----------------------------------------------------')
end
% verifica indeplinirea criteriilor de convergenta
if abs(fx)<=tol
if abs(dif)<=tol;
if (abs(x)<1)
cod=0; return; % criterii de stop indeplinite
elseif (abs(dif)./abs(x))<=tol
cod=0; return;
end
end
end
% criteriile de stop nu sunt indeplinite;
% initializare x0, fx0 si jx0 pentru o noua iteratie
x0=x; fx0=fx; jx0=jx;
end
% Au fost efectuate kmax iteratii fara atingerea convergentei
disp(['Iesire anormala dupa ' fprints('% 5.0f',k) ' iteratii ']);
cod=1;
% iesire anormala din subprogram
function jac=numjac(Fun01,x,varargin)
Fun01=fcnchk(Fun01,length(varargin));
[n,m]=size(x);
xmin=min(abs(x)); xmax=max(abs(x));
dx=0.01;
t=zeros(n);
for k=1:n;
xs=x(k);
x(k)=xs-dx;
y1=feval(Fun01,x,varargin{:});
x(k)=xs+dx;
y2=feval(Fun01,x,varargin{:});
x(k)=xs;
jac(:,k)=(y2-y1)./(2*dx);
end
function y=fex15_1(x);
[n,m]=size(x);
y=zeros(n,m);
y(1)=x(1)^2+x(2)^2-x(1);
y(2)=x(1)^2-x(2)^2-x(2);
function jac=jex15_1(x);
n=length(x);
jac=zeros(n,n);
jac(1,1)=2*x(1)-1; jac(1,2)=2*x(2);
jac(2,1)=2*x(1); jac(2,2)=-2*x(2)-1;
In modul de lucru direct, se initializeaza valorile parametrilor x0=[0.771; 0.419], tol=eps (in Matlab, eps este
predefinit, eps=2.22044604925031e-01), tol=1, dupa care se apeleaza functia frsnmn:
Se obtine:
=====================================================
Iteratia
Valori x
Valori f(x)
Progres
----------------------------------------------------1
0.771846
1.12973e-006
-0.000845521
0.419644
3.00085e-007
-0.000644066
----------------------------------------------------2
0.771845
1.50424e-012
1.01487e-006
0.419643
5.55889e-013
6.88618e-007
----------------------------------------------------3
0.771845
0
1.40847e-012
0.419643
0
8.7988e-013
----------------------------------------------------4
0.771845
0
0
0.419643
0
0
----------------------------------------------------x =
0.771844506346038
0.419643377607081
cod =
0
k =
4
Daca se adopta solutia de start x0=[1.0 ; 1.0], destul de indepartata de solutia exacta, se obtine practic aceeasi
solutie numerica dupa 7 iteratii. Daca adopta solutia de start x0=[0.1; 0.1], se obtine solutia x=[0; 0], dupa 6
iteratii, care este si solutie exacta.
Daca se doreste evaluarea pe cale numerica a elementelor matricei jacobiene, functia jex15_1 nu mai este
necesara, adoptandu-se pentru functia Fun02 numele numjac:
f1 ( x1 , x2 ) = x1 + 3 log x1 x22 = 0
2
f 2 ( x1 , x2 ) = 2 x1 x1x2 5 x1 + 1 = 0
a) Localizarea solutiilor reale. Se foloseste functia contf0.m in care, pe randurile 4 si 5, se inscriu expresiile
functiilor sistemului,
f1=x1+3.*log10(x1)-x2.^2;
f2=2.*x1.^2-x1.*x2-5.*x1+1;
4
3
2
x2
1
0
-1
-2
-3
-4
-5
x1
Fig. 15.2
Se observa ca sistemul are doua solutii reale, care pot fi localizate astfel: x (1) D1 = {x1 [1; 2], x2 [2; 1]} ,
Aplicatia 15.1. Calculul curbei de depresiune si a debitului de filtratie prin corpul unui baraj din
pamant fundat pe un strat impermeabil, metoda N. N. Pavlovski
Fie o sectiune transversala prin baraj - Fig. 15.3. Sistemul de ecuatii atasat problemei [ , pag. 257],
y
a
d0
Pamant
omogen
1:m2
Hb
1:m1
a0
h0 x
Strat impermeabil
s
Fig. 15.3 - Schema de calcul si notatii.
poate fi scris sub forma
f1 ( h, s, a0 , q ) =
q Hb d0 h
Hb
ln
=0
k
m1
Hb h
f 2 ( h, s, a0 , q ) =
q h 2 ( a0 + h0 )2
=0
k
2s
q a
a + h0
0 1 + ln 0
, daca h0 > 0
h0
k m2
f 3 ( h, s, a0 , q ) =
=0
q
a
0 , daca h = 0
0
k m
f 4 ( h, s, a0 , q ) = s a m2 [ H b ( a0 + h0 )] = 0
in care necunoscutele problemei sunt h - ordonata curbei de depresiune in punctul de abscisa x=0, [m], s - abscisa
punctului de iesire a curbei de depresiune pe taluzul aval al barajului, [m], a0 - diferenta dintre ordonata punctului
de iesire a curbei pe taluzul aval si nivelul apei in aval de baraj , [m], q - debitul de filtratie pe un metru din
lungimea barajului, [m 3 / zi] sau [m 3 / s] , ceilalti parametri reprezentand constante ale problemei: H b - inaltimea
barajului, [m], d0 - inaltimea de garda, [m], m1 , m2 - coeficientii de taluz ai barajului; a - latimea la coronament a
barajului, [m], si k - coeficientul de permeabilitate a pamantului, [m/zi] sau [m/s], dupa unitatea de masura
adoptata pentru q, h 0 .- adancimea apei in aval de baraj, [m]. Dupa solutionarea sistemului, ordonatele curbei de
depresiune se calculeaza, pentru x [0; s] , cu relatia y 2 = h 2 2qx / k .
Fie x = [h s a0 q ]T vectorul necunoscutelor si f ( x ) vectorul functiilor sistemului. Se editeaza functia
externa fap15_1a.m pentru evaluarea functiilor sistemului. Elementele matricei jacobiene vor fi evaluate prin
derivare numerica folosind functia numjac.m.
function y=fap15_1a(x,varargin)
[n,m]=size(x);
y=zeros(n,m);
h=x(1); s=x(2); a0=x(3); q=x(4);
[Hb,d0,m1,m2,a,k,h0]=deal(varargin{1:7});
y(1)=q/k-(Hb-d0-h)/m1*log(Hb/(Hb-h));
y(2)=q/k-(h^2-(a0^2+h0))/(2*s);
if h0==0
y(3)=q/k-a0/m2;
else
y(3)=q/k-a0/m2*(1+log((a0+h0)/h0));
end
y(4)=s-a-m2*(Hb-(a0+h0));fap14_a1
Se initializeaza parametrii constanti, solutia de start (pozitiva), precizia de calcul , parametrul trace si se
apeleaza functia frsnmn.m in modul de lucru direct:
Fie o sectiune transversala prin baraj - Fig. 15.4. In punctul de abscisa x = s , s dat, se afla capatul amonte al
unui dren care coboara curba de filtratie la nivelul apei in aval, deci a0 = 0 . In acest caz, sistemul de ecuatii
y
a
d0
1:m2
Hb
1:m1
h
Dren
h0 x
Strat impermeabil
s
Fig. 15.4 - Schema de calcul si notatii.
f1 ( h , q ) =
f ( h, q ) =
2
q Hb d0 h
Hb
=0
ln
k
m1
Hb h
q h2
= 0, s 0
k 2s
in care notatiile au aceeasi semnificatie ca in cazul precedent. Fie x = [h q]T vectorul necunoscutelor si f ( x )
vectorul functiilor sistemului. Se editeaza functia externa fap15_1b.m pentru evaluarea functiilor sistemului.
Elementele matricei jacobiene vor fi evaluate, ca si in cazul precedent, prin derivare numerica folosind functia
numjac.m.
function y=fap15_1b(x,varargin)
[n,m]=size(x);
y=zeros(n,m);
h=x(1); q=x(2);
[Hb,d0,m1,a,k,h0,s]=deal(varargin{1:7});
y(1)=q/k-(Hb-d0-h)/m1*log(Hb/(Hb-h));
y(2)=q/k-(h^2-h0^2)/(2*s);
Se initializeaza parametrii si se apeleaza functia frsnmn.m:
>Hb=15;d0=1.5;m1=3;a=5;k=0.1;h0=0;s=105;x0=[10; 1];tol=1.0e-006;trace=eps;
>[x,cod,k]=frsnmn('fap15_1b','numjac',x0,tol,trace,Hb,d0,m1,a,k,h0,s)
y = h 2 2qx / k .
Aplicatia 15.2. Calculul hidraulic al retelelor inelare de conducte sub presiune pentru
Se considera o retea de conducte sub presiune pentru distributia apei, constituita din -Fig.15.5: m tronsoane,
numerotate prin i = 1, ..., m; n noduri interioare de distributie a debitelor, numerotate prin j = 1, ..., n, si
r noduri rezervoare, numerotate prin j = n+1, ...,n+r.
8
3
Q6=0.030 m3/s
Q8=0.010 m /s
Tronson 13
L13 =500 m
q13
Tronson 10
L10 = 500 m
q14
3
q6
q3
Tr. 7
L7=600 m
3
Q3=0.020 m /s
Q1=0.010 m3/s
D
q7 5
q5 Tronson 5
q10
Tr. 8
L5 =500 m
L8=600 m
Q5=0.010 m3/s
q8
4
9
Q9=0.020 m3/s
q11
Tronson 1
L1 = 100 m
Tronson 3
L3 =1000 m
Tronson 6
L6 = 1000 m
Tronson 11
L11=1000 m
q12
q9
Tr. 14
3
L14 = Tronson 12 Q7=0.020 m /s Tronson 9 Q4=0.015 m3/s
300 m L12 = 1000 m
L9 =1000 m
q1 10
q2
Tronson 2
L2 = 500 m
q4
Tronson 4
L4 = 1000 m
Q2=0.020 m3/s
11
E i , i = 1,..., m , [m];
Q - vectorul debitelor distribuite la noduri, cu elementele Q j ,, j=1,...,n, considerate cu semnul + daca sunt
debite de iesire din nod si cu semnul - daca sunt debite de intrare in nod, [m3/s];
H - vectorul cotelor piezometrice la nodurile rezervoare, cu elementele H j , j=n+1,...,n+r, [m].
Fie un sens initial, presupus de curgere a apei prin conducte si fie vectorii coloana cu elementele necunoscute:
q - vectorul debitelor pe tronsoane, elementele q i , i=1,...,m, considerate cu semnul + daca curgerea are loc
in sensul considerat initial si cu semnul - daca scurgerea are loc in sens invers, [m3/s];
h - vectorul cotelor piezometrice la nodurile interioare, cu elementele h j , j=1,...,n, [m];
Se considera ca fiecare tronson i, i=1,...,m, este delimitat amonte de nodul j i2 si aval de nodul j i1 .
Ecuatiile de continuitate a debitelor la nodurile interioare, cate una pentru fiecare nod interior, pot fi scrise sub
forma matriceala
AT q - Q = 0,
iar ecuatiile de miscare a apei prin conducte, in regim permanent, cate una pentru fiecare tronson al retelei, pot fi
scrise sub forma matriceala
B ( q )
0
A q A H
+
= 0,
0 h 0
in care:
matricei A de incidenta (de legatura) a nodurilor retelei, elemente definite prin relatia
*
ij
B(q ) - matrice diagonala, cu m elemente pe diagonala principala, definite prin relatia bii = Ci qi ,
Ci =
8 i Li
, = Fi ( q i , Di , Ei ) , i = 1,..., m , in care i sunt coeficientii de rezistenta ai
g 2 Di5 i
Considerand atat ecuatiile de continuitate cat si cele de miscare, sistemul atasat problemei poate fi scris sub
forma compacta
B ( q )
T
A
A q A H
+
= 0,
0 h Q
A
A H
=0.
x+
0
Q
Sistemul de ecuatii este neliniar, cu n+m ecuatii si tot atatea variabile, si intereseaza solutia reala, cu h 0 ,
care, daca exista, poate fi calculata printr-o metoda numerica, Newton - Raphson de exemplu. Matricea jacobiana
a sistemului este, neglijand derivatele
i
q i
2 B ( x )
J( x ) = T
A
A
,
0
obtinandu-se usor din ecuatiile sistemului prin inmultirea matricei B(x) cu scalarul 2.
Exemplu numeric. Se considera reteaua inelara din Fig. 15. 5, cu sensul initial de curgere marcat pe figura si
cu datele initiale:
500
100
100
500
100
600
600 1000
500
300]T , [m];
D = [0.496 0.315 0.315 0.248 0.248 0.248 0.177 0.177 0.248 0.248 0.248 0.315 0.315 0.496] T , [m];
A* =
1
-1
0
0
0
0
0
0
0
0
0
0
0
0
-1 0 1
0 -1 0
0 0 -1
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0 1
1 -1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0 -1 0
0 0 0
0 0 -1
0 0 1
0 0 0
1
0
0
0 0
0 -1
1 -1
0
0
0
0
0
0
0
0
0
0
1
0
0 -1
1 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0 -1 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
,
0 0 0
0 0 0
0 0 0
0 0 0
-1 0 0
-1 0 0
1 0 - 1
A * , si matricea A formata din
fiind calculate cu
relatia A. D. Altschul, functia jretea.m pentru calculul elementelor matricei jacobiene si programul principal
pretea.m pentru initializarea datelor, apelarea functiei frsnmn.m pentru rezolvarea sistemului de ecuatii prin
metoda Newton - Raphson si afisarea rezultatelor.
function y=fretea(x)
global n m L D Q H A Abarat E B lambda
y=zeros(n+m,1);
q(1:m,1)=x(1:m,1);
g=9.81; niu=1.01e-006;
omega=(pi.*D.^2)./4.0; v=abs(q)./omega; Re=v.*D./niu;
lambda=0.11.*(E./D+68./Re).^0.25;
C=8.*lambda.*L./((g*pi^2).*D.^5); b=C.*abs(q);
B=diag(b);
y=[B A; A' zeros(n,n)]*x+[Abarat*H; -Q];
function jac=jretea(x)
global n m A B
jac=zeros(n+m,n+m);
jac=[2.*B A; A' zeros(n)];
% program pretea.m
% A. Pricop, dec. 2001
global n m L D Q H A Abarat E
% Date initiale
m=14; n=9; r=2;
L=[ 100
500
100
100
500
100
600
600 1000
500 1000...
1000
500
300]';
D=[0.496 0.315 0.315 0.248 0.248 0.248 0.177 0.177 0.248 0.248 0.248...
0.315 0.315 0.496]';
Q=[0.010 0.020 0.020 0.015 0.010 0.030 0.020 0.010 0.020]';
E=ones(m,1).*0.00005;
H=zeros(n+r,1); H(10,1)=142.00; H(11,1)=142.50;
% Matricea de incidenta
Astelat=[ 1 0 0 0 0 0 0 0 0 -1 0;
-1 1 0 0 0 0 0 0 0 0 0;
-1 0 1 0 0 0 0 0 0 0 0;
0 -1 0 1 0 0 0 0 0 0 0;
0 0 -1 1 0 0 0 0 0 0 0;
0 0 -1 0 0 1 0 0 0 0 0;
0 0 0 0 1 -1 0 0 0 0 0;
0 0 0 -1 1 0 0 0 0 0 0;
0 0 0 1 0 0 -1 0 0 0 0;
0 0 0 0 0 1 -1 0 0 0 0;
0 0 0 0 0 1 0 -1 0 0 0;
0 0 0 0 0 0 1 0 -1 0 0;
0 0 0 0 0 0 0 1 -1 0 0;
0 0 0 0 0 0 0 0 1 0 -1];
% ------------------------------------------------------------------% Construieste matricele A si Abarat din Astelat
A(1:m,1:n)=Astelat(1:m,1:n); Abarat=[zeros(m,n) Astelat(1:m,n+1:n+r)];
% Initializare argumente si apelare functie pentru rezolvarea
% sistemului de ecuatii prin metoda Newton - Raphson
%
* construieste solutia de start x0=[q0; h0]
sQ=sum(Q); qs=sQ/m; q0=ones(m,1).*qs; % q0 ca debit mediu
hs=min(H(n+1:n+r,1))-0.5; h0=ones(n,1).*hs; % h0<min(H(n+1:n+r,1))
x0=[q0; h0];
if km==0;
% Metoda Newton - Raphson
%
* initializare precizie de calcul, optiune afisari intermediare
tol=1.0e-010; trace=0;
%
* apeleaza frsnmn
[x,cod,k]=frsnmn('fretea','jretea',x0,tol,trace);
% Daca solutia este "anormala", stop program
if cod==1
error('Solutie anormala sistem ');
end
% Solutie normala
% Extrage q si h din x
q=x(1:m,1); h=x(m+1:m+n,1)-Z0;
% H initial
H=H-Z0;
% Pierderi de sarcina pe tronsoane
hr=8.*lambda.*L.*q.*q./(9.81*pi^2.*D.^5);
% Afisare rezultate
disp('
');
disp(['
Precizia de calcul:
eps = ' sprintf('%G',tol)]);
disp(['
Nr. iteratii efectuate: k = ' sprintf('%G',k)]);
disp('
--------------------------------------------------- ');
disp('
');
disp('
REZULTATE:');
disp('
');
disp(' Tronson
Debit
Pierdere de sarcina
lambda ');
disp('
[mc/s]
[m]
');
disp('
');
for k=1:m;
disp([blanks(5) sprintf('%5.0f
%12.6f
%12.6f
%12.6f...
%12.6f\n',k,q(k,1),hr(k,1),E(k,1),lambda(k,1))]);
end
disp('
');
disp('
Nod
Cota piezometrica ');
disp('
[m]
disp('
');
for k=1:n;
disp([blanks(5) sprintf('%5.0f
end
');
%12.6f\n',k,h(k,1))]);
Precizia de calcul:
eps = 1E-010
Tronson
Debit
Pierdere de sarcina
[mc/s]
lambda
[m]
0.076875
0.026043
0.016011
0.024550
0.150834
0.018787
0.042325
0.080768
0.016923
0.004550
0.004749
0.026042
0.008696
0.074815
0.022466
0.013629
0.033377
0.020401
0.005342
0.191090
0.023462
0.004658
0.149652
0.024174
0.006412
0.087109
0.024058
10
0.006586
0.045671
0.023912
11
0.015128
0.402479
0.019968
12
0.032997
0.514078
0.017722
13
0.025128
0.157270
0.018698
14
0.078125
0.080440
0.015961
Nod
Cota piezometrica
[m]
41.973957
41.823122
41.893189
41.818373
41.668722
41.859811
41.905482
42.262290
42.419560
Prin ecuatie diferentiala se intelege o ecuatie care contine derivate (sau diferentiale) de
ordinul n inclusiv ale unor functii necunoscute de variabile independente, de exemplu
y( x, y, z ,
z z 2 z 2 z 2 z
,
,
,
,
) = 0.
x y x 2 x y y 2
O ecuatia diferentiala de ordinul n este numita ordinara daca contine o singura variabila
independenta, avand forma generala
( x , y , y ', y '',..., y ( n ) ) = 0 .
y ( n ) = f ( x , y , y ', y '',..., y ( n 1) ) .
Ecuatia poate fi scrisa sub forma unui sistem echivalent de ecuatii de ordinul inati. Notam
y n = y , y n1 = y ' , y n 2 = y ' ' , ..., y1 = y ( n 1) , de unde rezulta y1' = y ( n ) , y 2' = y 1 , ..., y n' = y n 1
,
Y ' = F( x, y )
unde
y1
f ( x , y1 , y 2 ,..., y n 1
y
2
y1
.
y2
Y= , F=
.
...
y n 1
yn
Rezulta ca algoritmii folositi pentru rezolvarea unei ecuatii diferentiale ordinare de ordinul
intai pot fi folositi si pentru rezolvarea ecuatiilor diferentiale ordinare de ordinul n sau pentru
rezolvarea sistemelor de ecuatii diferentiale ordinare. Pentru rezolvarea pe cale numerica a
ecuatiilor diferentiale ordinare cu conditii initiale, se considera o diviziune a intervalului de
definitie [a, b],
a = x 0 , x1 , x 2 ,..., x n = b ,
si se determina solutia in mod prpgresiv: din expresia functiei si conditiile initiale se calculeaza
solutia in punctul x1 , care apoi este folosita drept conditie initiala pentru calculul solutiei in x 2
, si asa mai departe.
Exista doua categorii de metode de aproximare numerica a solutiei unei ecuatii diferentiale
ordinare:
metode directe, sau unipas, prin care solutia este calculata intr-un punct x i pe baza
informatiei continuta in punctul precedent x i1 si eventual din intervalul [ x i1 , x i ]. Din
aceasta categorie fac parte metoda seriei Taylor, metoda Euler si metodele de tip Runge Kutta;
y1 = y 0 + p rj k j
j =1
(16.1)
unde r este un numar intreg, p rj sunt constante care trebuie determinate, k j sunt anumite valori
ale functiei f(x, y) in puncte vecine punctului (x 0 , y 0 ), valori inmultite apoi cu h, adica
k j = hf j ,
),
= x 0 + j h,
(16.2)
j 1
j = y 0 + i k i , j = 2,3,..., r
i =1
Din relatiile (16.2) reiese clar caracterul algoritmic al procedeului Runge-Kutta, marimile
urmatoare calculandu-se cu ajutorul marimilor deja cunoscute. Ramane sa determinam
constantele p rj , j , ji , dupa ideea expusa la inceput, adica cele doua dezvoltari in serie dupa
puterile lui h ale lui y 1 date de (16.1) si y(x 1 ) sa coincida pana la o anumita putere a lui h,
independent de functia f(x, y). Vom da diverse valori lui r in (16.1) si vom obtine diverse
formule de tip Runge-Kutta.
Pentru r = 1 se ajunge la
y 1 = y 0 + hf(x 0 , y 0 ),
y1 = y 0 + p 2 j k j
j =1
sau, dezvoltat,
y 1 = p 21 hf(x 0 , y 0 ) + p 22 hf(x 0 + 2 h, y 0 + 21 hf(x o , y 0 )).
Avem, de asemenea,
y ( x1 ) = y 0 + hy ( x 0 ) +
h2
h3
y ( x 0 ) +
y ( x 0 + x1 ),
2!
3!
0 < < 1,
y ( x1 ) = y 0 + hf ( x 0 , y 0 ) +
h2
f ( x , y ) + f y( x 0 , y 0 ) f ( x 0 , y 0 ) + T2 ,
2! x 0 0
unde
T2 =
h3
y ( x 0 + x1 ) .
3!
p 21 + p 22 = 1
p 22 2 =
2
p 22 21 = 2
(16.4)
y1 = y 0 +
1
(k + k2 )
2 1
y 2 = y1 +
h
h
f ( x1 , y1 ) + f ( x1 + h, y1 + hf ( x1 , y1 ))
2
2
sau, inlocuind pe k 1 si k 2 :
In general
y i +1 = y i +
h
h
f ( x i , y i ) + f ( x i + h, y i + hf ( x i , y i )),
2
2
(16.5)
i = 0,1,2,..., n
care constituie tocmai algoritmul metodei lui Euler perfectionate pentru generarea
aproximantelor y 1 , y 2 , ..., y n+1 ale valorilor adevarate y(x 1 ), y(x 2 ), ..., y(x n+1 ) plecand de la
valoarea cunoscuta y 0 .
Cazul cel mai important al metodei Runge-Kutta este pentru r = 4. Folosind rationamentul
din cazul r = 2, pentru determinarea constantelor p 2j , j , ji se ajunge la un sistem de 10
ecuatii cu 13 necunoscute, care nu are solutie unica. S-au determinat diferite sisteme de
constante care verifica acest sistem, cautandu-se in acelasi timp sa se obtina constante cu o
structura foarte simpla pentru usurinta calculelor. Alegerea cea mai raspandita si care conduce
la cea mai utilizata formula Runge-Kutta este
y i +1 = y i +
1
( k + 2k 2 + 2k 3 + k 4 ), i = 0,1,2,..., n
6 1
(16.6)
unde
k
k
h
h
k1 = hf ( x i , y i ); k 2 = hf x i + , y i + 1 , k 3 = hf x i + , y i + 2 ; k 4 = hf ( x i + h, y i + k 3 )
2
2
2
2
(16.7)
Matlab dispune de mai multe functii externe, ode113.m, ode15s.m, ode23.m, ode23s.m,
ode45.m, pentru aplicarea metodelor Runge - Kutta la rezolvarea sistemelor de ecuatii
diferentiale ordinare de ordinul intai cu conditii initiale.
Functia externa ode45.m se poate folosi cu una din urmatoarele sintaxe:
yp = nume_functie(t,y), sau
yp = nume_functie(t,y,flag,P1,P2,..),
unde vectorul coloana yp contine valorile returnate ale derivatelor functiilor calculate
in t curent, cu valorile functiilor din vectorul y; flag - sir de caractere pentru
optiuni, dupa conventia:
flag
Valoare returnata
-------
-----------------------
(vid)
F(t,y)
init
'jacobian'
'jpattern'
'mass'
'events'
y' =
xy
x + y2
2
pe intervalul
x [0; 1], cu conditia initiala y( 0) = 1 , cu precizia implicita inclusa in vectorul OPTIONS (eroare relativa
maxima, 1.0e-003; eroare absoluta maxima, 1.0e-006).
function yp=fex16_1(x,y)
yp=x*y/(x^2+y^2);
In modul de lucru direct, se initializeaza parametrii de intrare si se apeleaza functia ode45.m, apoi se afiseaza
rezultatul si se reprezinta grafic functia integrata:
>[x,y]=ode45('fex16_1',[0 1],[1]);[x y]
>hf=figure; plot(x,y); grid; xlabel('x'); ylabel('y')
Se obtin valorile functiei y din coloana a doua, corespunzatoare valorilor x din coloana intai,
ans =
0
0.02500000000000
0.05000000000000
0.07500000000000
0.10000000000000
0.12500000000000
0.15000000000000
0.17500000000000
0.20000000000000
0.22500000000000
0.25000000000000
0.27500000000000
0.30000000000000
0.32500000000000
0.35000000000000
0.37500000000000
0.40000000000000
0.42500000000000
0.45000000000000
0.47500000000000
0.50000000000000
0.52500000000000
0.55000000000000
0.57500000000000
0.60000000000000
0.62500000000000
0.65000000000000
0.67500000000000
0.70000000000000
0.72500000000000
0.75000000000000
0.77500000000000
0.80000000000000
0.82500000000000
0.85000000000000
0.87500000000000
0.90000000000000
0.92500000000000
0.95000000000000
0.97500000000000
1.00000000000000
1.00000000000000
1.00031236632523
1.00124766540197
1.00280071284616
1.00496301155966
1.00772291322165
1.01106587410668
1.01497498192731
1.01943120766704
1.02441366893100
1.02990013398805
1.03586751211315
1.04229211237140
1.04914985596333
1.05641670708037
1.06406894598672
1.07208332877340
1.08043719371737
1.08910868750113
1.09807684673848
1.10732165610250
1.11682407252963
1.12656608493471
1.13653069247123
1.14670190158406
1.15706470878411
1.16760507379119
1.17830986113315
1.18916681240600
1.20016451580513
1.21129234997946
1.22254042246626
1.23389953741599
1.24536116548995
1.25691738668932
1.26856083799121
1.28028468484877
1.29208259619015
1.30394869639415
1.31587752455208
1.32786401189552
1.4
1.35
1.3
1.25
1.2
1.15
1.1
1.05
1
0.2
0.4
0.6
0.8
y ''+ ( y 2 1) y '+ y = 0 ,
Mai intai se reduce ecuatia la un sistem echivalent de ecuatii diferentiale de ordinul intai cu conditii initiale,
dupa cum s-a aratat in partea introductiva. Notam
y1' = ( y 22 1) y1 + y 2
,
'
y 2 = y1
cu conditiile initiale
ecuatiilor sistemului,
function yp=fex16_2(x,y)
yp=zeros(2,1);
yp(1)=-(y(2)^2-1)*y(1)-y(2);
yp(2)=y(1);
In modul de lucru direct, se initializeaza parametrii de intrare si se apeleaza functia ode45.m, fara afisarea
rezultatelor dar cu plotarea lor.
3
y1
y2
2
y1, y2
-1
-2
-3
10
x
15
20
y1 si y 2 .
Aplicatia 16.1. Calculul adancimilor apei in lungul unui canal trapezoidal prismatic in miscare
permanenta, gradual variata. Ecuatia miscarii permanente gradual variate in albii prismatice este
Q2
dh
A2C 2 R ,
=
ds
Q 2
1
B
gA3
i
unde
dh
reprezinta variatia adancimii apei in functie de distanta parcursa de curent intr-o sectiune transversala
ds
R=
A
1 1
, [m], unde P este perimetrul udat, [m], C - coeficientul lui Chezy, C = R 6 ,
n
P
unde n este coeficientul de rugozitate al albiei, B - latimea albiei la luciul apei [m],
- coeficientul Coriolis.
Ecuatia este diferentiala, ordinara, de ordinul intai. Pentru rezolvarea ecuatiei prin metoda Runge - Kutta de
ordinul 4/5, se editeaza functia utilizator fmngvcp.m pentru definirea expresiei ecuatiei, si programul pmngvcp.m
pentru initializarea parametrilor, apelarea functiei ode45.m si reprezentarea grafica a rezultatelor,
function yp=fmngvcp(x,y);
global Q b m n Jf alfa
yp(1,1)=0;
h=y; S=(b+m*h)*h; P=b+2*h*sqrt(1+m^2);
Rh=S/P; C=1/n*Rh^(1/6); B=b+2*m*h; U=Q/S; UP=U^2;
yp(1)=(Jf-UP/(Rh*C^2))/(1-alfa*UP*B/(9.81*S));
% Program pmngvcp.m
global Q b m n Jf alfa
b=2.50; Q=40; m=1; n=0.014; Jf=0.05; L=150.00; alfa=1.05;
h0=2.2104; ti=0.00; tf=L; Y0=[h0];
options = odeset('RelTol',1e-10,'AbsTol',1e-10);
[T Y]=ode45('fmngvcp',[ti tf],Y0,options);
h=figure; plot([ti tf],[Jf*(tf-ti) 0],T,Y+(tf-T)*Jf); grid;
xlabel(' s [m]'); ylabel('z [m]');
legend('linie fund albie','linie superafata libera a apei');
10
linie fund albie
linia suprafetei apei
9
8
7
z [m]
6
5
4
3
2
1
0
50
100
150
s [m]
Valorile numerice ale adancimilor calculate sunt continute in vectorul Y si corespund absciselor continute in
vectorul T. Variatia adancimii apei in lungul canalului este reprezentat in Fig. 16.3.