Sunteți pe pagina 1din 30

LABORATOR 2

Funcția fprintf Funcția se folosește pentru formatarea (aranjarea) datelor pe ecran sau pentru
tipărire. Sintaxa: fprintf ('format',lista de variabile). Format este un șir ce conține text dar și indicații
despre modul în care variabilele, din lista de variabile, se convertesc (formatul) și se poziționează
(afișează)
În tabelul de mai jos sunt date codurile de bază cu care se formatează variabilele din lista de
variabile.
Cod Formatul rezultat
%s format tip șir
%d format număr întreg
%f format în virgulă mobila (floating-point)
%e format în virgulă mobila (floating-point) notația științifică
%g format în cea mai compactă formă dintre %f sau %e
\n insert linie nouă
\t insert tab
Mai jos sunt date codurile pentru a preciza în format atât numărul total de caractere precum și
numărul de zecimale

Codurile pentru formatul variabilelor și al numărului de caractere sunt:

Cod Formatul rezultat


%wd format număr întreg cu w - numărul total de caractere
-

%w.vf format în virgulă mobila, cu w numărul total de caractere și v numărul de zecimale


%w.ve format în virgulă mobila, ca mai sus, dar cu notația stiintifica

Calculăm valorile funcției cu afișarea lor în 2 variante

% varainta 1 % varianta 2

>> x=0:pi/4:2*pi; virgula >> x=0:pi/4:2*pi;


w
mai multe
mirand i
>> y=sin(x); ↓ - (dacdecat
W v pui
ifre baga
· spatie
,

>> y=sin(x);
L

E
>> fprintf('%8.3f\n',y) >> fprintf('y = %8.3f\n',y)
0.000 y = 0.000
0.707 y = 0.707
1.000 y = 1.000
0.707 y = 0.707
0.000 y = 0.000
-0.707 y = -0.707
-1.000 y = -1.000
-0.707 y = -0.707
- 0.00 y = -0.00
Calculăm valorile funcției sin(x) cu afișarea și a vectorului variabilei și a vectorului valorilor
calculate pentru funcție.

x = 0:0.2:1;
fprintf(' x sin(x)\n' )
for i = 1:length(x) fprintf('%4.1f %11.6f\n',x(i),sin(x(i)))
end
x sin(x) 0.000000
0.2 0.198669
0.4 0.389418
0.6 0.564642
0.8 0.717356

1.0 0.841471

Dacă o declaraţie (comandă) nu încape într-o linie de comandă, se vor utiliza trei puncte . . . urmate
de Return sau Enter pentru a indica faptul că expresia continuă pe linia următoare.

fprintf(' k a f(a) b f(b) xr ... f(xr)


semn(fa*fr)\n')
s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9
- 1/10 + 1/11 - 1/12;
display (['Solutiile sunt a = ' num2str(a)', b = 'num2str(b)' ...
'c = ' num2str(c)']);

Spaţiile din jurul semnelor =, +, - sunt opţionale şi pot îmbunătăţi citirea liniilor.
Maximul numărului de caractere pe o singură linie este de 4096.

Instrucțiunea for

Comanda for este comanda cu care se execută repetat o operație pentru toate elementele unui vector.

1. Calculul puterilor numerelor întregi de la 1 la 4 :

n=4;
x=zeros(1,4);
for i=1:n x(i)=i^2;
end
x
x = 1 4 9 16

2. Calculul valorilor funcției cos x, varianta 1

% calculul valorilor pentru la cu pasul


for n=0:5
y(n+1)=cos(n*pi/10);
end
y
y=1.0000 0.9511 0.8090 0.5878 0.3090 0.0000
3. Calculul valorilor funcției cos(x)
x = 0:0.2:1;
fprintf(' x cos(x)\n')
for i = 1:length(x)
fprintf('%4.1f %11.6f\n', x(i), cos(x(i)))
end

x cos(x)
0.0 1.000000
0.2 0.980067
0.4 0.921061
0.6 0.825336
0.8 0.696707
1.0 0.540302

4. Calculul repetat pentru o expresie depinzând de 2 indici

m=4; n=5;
for i=1:m
for j=1:n
A(i,j)=1/(i+j-1);
end
end
A
A=
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250

Instrucțiunea if

Instrucțiunea if este instrucțiunea de testare pe baza unei condiții logice.


In general condiția logică apare sub forma:
expresie operator relațional expresie

Bucla if este folosită pentru luarea unor decizii multiple, executarea lor fiind condiționată. Sunt trei
moduri de construcție a buclei if:
 if..end
 if..else..end
 if..elseif..else .. end
1) Instrucțiunea if..end
Setul de instrucțiuni este executat numai dacă conditie logica este adevărată.
EXEMPLU Scriem un program, pentru a testa dacă un număr este par.
n = input('introduceti un numar intreg');
if (mod(n,2)==0)
fprintf('numarul introdus %d este par. \n' , n)
end
% am apelat functia (built-in) mod (help mod) pentru calculul
% restului impartirii la doi a numărului n
% salvăm fisierul si lansam în execuție
introduceti un numar intreg 18
numarul introdus 18 este par.

2) Instrucțiunea if..else..end

EXEMPLU Scriem un program, pentru a testa dacă un număr este par sau impar, în fisier script cu
conținutul de mai jos, salvată cu numele par_impar.m
% par_impar.m

n=input('Introduceti un numar intreg: ');


if (rem(n,2)==0)
fprintf('Numarul %d este un numar par.\n',n)
else
fprintf('Numarul %d este un numar impar.\n',n)
end
>> par_impar
Introduceti un numar intreg: 5
Numarul 5 este un numar impar.
>> par_impar
Introduceti un numar intreg: 9
Numarul 9 este un numar impar.

EXEMPLU
Scriem un program care testează dacă un număr este par; dacă da, scrie numărul, dacă nu, adună 1
la număr și scrie numărul.

x=input('scrie un numar intreg:');


if(rem(x,2)==0)
x=x;
else
x=x+1;
end
x

 Comentariu asupra algoritmului


% introducem valoarea lui x
x=input('scrie un numar intreg:');
% testăm dacă restul împărțirii la doi este sau nu este zero (x este par sau nu)
if(rem(x,2)==0)
% daca raspunsul este da execută bucla da
% dacă raspunsul este nu execută bucla nu

Este apelată fisierul (built-in) rem din biblioteca Matlab. Cu comanda rem se calculează restul
împarțirii a două numere întregi (>> help rem)
>> rem(5,2)
ans = 1

3) Comanda condițională if..elseif..else..end


Sintaxa: if..elseif..else..end
if conditie logica 1
set de instructiuni 1
elseif conditie logica 2
set de instructiuni 2
elseif conditie logica 3
set de instructiuni 3
else
set de instructiuni 4
end

EXEMPLU
1) Scriem o m-fila tip funcție pentru a testa semnul unui număr real, signum.m.
function sgn = signum(a)
if a > 0
sgn = 1;
elseif a < 0
sgn = -1;
else
sgn = 0;
end
>> signum(6) % executăm funcția pentru a = 6
ans = 1 .
2) Calculul radicalului dintr-un număr real. Se testează condiția ca numărul să fie pozitiv, dacă da,
se calculează și se scrie radicalul, dacă condiția nu este satisfăcută, scrie că numărul este negativ sau
zero.
x=input('numar real:')
if x>0
fprintf('radical din %g este 8.4f\n', x,sqrt(x))
elseif x<0
disp('x este negativ;nu exista radical de ordin doi')
else
disp('x este egal cu zero')
end

Instrucțiunea while

Instrucțiunea while are o structură care combină bucla for cu instrucțiunea if.

Setul de instrucțiuni se execută repetat atâta timp cât condiția logica specificată rămîne adevărată -
true (valoarea este 1).

Sintaxa: while ... end :

while conditia logica


set de instructiuni
end
EXEMPLU:
Sa se determine primul numar întreg pentru care n! (n factorial) este un număr de 4 cifre.

% bucla va fi executata cat timp conditia este indeplinita


% este utilizata functia built-in 'prod'; (>> help prod)
n = 1;
while prod(1:n) < 1.e3
n=n+1;
end
n

Instrucțiunea break

Instrucțiunea break interupe execuția buclelor for sau while.


EXEMPLU
Scriem o functie, numere_prime.m, care să afișeze numerele prime dintr-o listă dată.
Selectarea numerelor prime se face cu funcția Matlab isprime(n)

for n = 2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
end
end
>> numere_prime numerele prime gasite, 2
numerele prime gasite, 3
numerele prime gasite, 5
numerele prime gasite, 7
numerele prime gasite, 11
numerele prime gasite, 13
numerele prime gasite, 17
numerele prime gasite, 19
numerele prime gasite, 23
numerele prime gasite, 29
numerele prime gasite, 31
numerele prime gasite, 37
numerele prime gasite, 41
numerele prime gasite, 43
numerele prime gasite, 47

În varianta cu instrucțiunea break observăm ca instrucțiunea break întrerupe execuția buclei for
după prima evaluare.

for n=2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
break
end
end

>> prime_numere
numerele prime gasite, 2

Instrucțiunea continue

Instrucțiunea continue trece controlul la următoarea iterație din bucla for sau while, în care apare,
sărind peste orice alte comenzi din interiorul buclei.

EXEMPLU
Scriem o m-fila, multipli_3.m, care să calculeze și să afișeze multiplii lui 3 din primele 15 numere.

N=15;
i=1;
while i <= n
if rem(i,3)~=0
i=i+1;
continue
end
fprintf ('multiplul lui 3: %d\n',i)
i=i+1;
end

>> multipli_3
multiplul lui 3: 3
multiplul lui 3: 6
multiplul lui 3: 9
multiplul lui 3: 12
multiplul lui 3: 15
Scriem o m-fila sol_sistem.m pentru a găsi soluția sistemului algebric liniar:
5a + 2b +c = 12
a + 4b + 2c = 15
a + 2b + 5c = 20

% sol_sistem.m
a=0;
b=0;
c=0;
while 1
a1 = (12 - 2*b - c)/5;
b1 = (15 - a1 - 2*c)/4;
c1 = (20 - a1- 2*b1)/5;
if((a==a1)&&(b1==b)&&(c1==c))
break;
end;
a = a1;
b = b1;
c = c1;
end;
display (['Solutiile sunt a=' num2str(a) ', b = ' num2str(b)' ... ', c = ' num2str(c)']);

>> sol_sistem
Solutiile sunt a = 1, b = 2, c = 3

Polinoame în MATLAB

Un polinom de gradul este de forma: ,


.

În Matlab polinoamele se reprezintă printr-un vector linie care conține coeficientii polinomului,
scrisi în ordine descrescatoare a puterilor lui . .

Exemplu: Pentru polinomul , în Matlab se reprezintă

Valoarea unui polinom intr-un punct , se obtine cu ajutorul functiei polyval.


Sintaxa Matlab:

Exemplu: Valoarea polinomului (dat mai sus) în punctul : returneaza


rezultatul .

Polinomul se poate evalua și pentru un vector sau o matrice. Comanda polyval returneaza un
vector cu valorile corespunzatoare ale polinomului.
,
returneaza vectorul .

Pentru a obtine graficul unui polinom putem utiliza comanda polyval împreuna cu comanda
linspace.

Graficul polinomului

;
;
;

Radacinile unui polinom le obținem cu comanda :

;
.

Operatii cu polinoame

Inmultirea polinoamelor: functia , sintaxa unde reprezintă polinoamele.


Exemplu: Să se determine polinomul produs unde iar

;
;
% produsul polinoamelor

Împărțirea polinoamelor: functia , sintaxa

Împărțirea polinoamelor date

;
;
% împărțirea polinoamelor, în obținem coeficientii polinomului cât iar în coeficientii restului
.

Derivarea unui polinom: functia , sintaxa , returneaza coeficientii polinomului


, , returneaza derivata produsului .
Rezultatul obținut reprezintă coeficientii derivatei.
INTERPOLAREA

Interpolarea este procesul prin care se estimeaza valori situate intre puncte de date cunoscute.

Se da o funcție , se pune problema determinarii unei funcții care sa aproximeze


functia . Aceasta aproximatie este necesara atunci când nu se cunoaște forma analitica a funciei
ci numai valorile sale într-un numar finit de puncte ale intervalului sau când
expresia analitica a functiei este complicata și calculele efectuate cu ajutorul acesteia ar fi
dificile. Functia trebuie să fie o funcție simpla, ușor de evaluat, de derivat sau de integrat, motiv
pentru care poate fi de exemplu polinom.

Mai precis fiind date perechi care reprezintă date obtinute


din masuratori, distincte doua câte doua , problema consta în a găsi o funcție astfel încât
. Altfel spus interpoleaza punctele în nodurile . Spunem ca avem o
interpolare polinomiala când este polinom, aproximare trigonometrica când este un polinom
trigonometric sau polinom de interpolare prin funcții spline.

Interpolare polinomiala

Avem trei metode de interpolare polinomiala:


• metoda directa
• metoda lui Newton
• metoda Lagrange
1. Metoda directa

Fiind date punctele se numește polinom de interpolare asociat


nodurilor și valorilor un polinom care indeplineste urmatoarele condiții:

, . Un astfel de polinom exista și este unic.

Eroarea maxima cu care polinomul aproximeaza functia este:

Prin metoda directa coeficientii polinomului: se calculează în mod direct din sistemul
algebric liniar obținut prin impunerea conditiei ca polinomul sa treacă prin cele puncte de
date numerice , .
Se obtine un sistem cu ecuații pentru a determina cei coeficienti ai polinomului de
interpolare.
:

Sistemul obținut este un sistem cu determinantul de tip Vandermonde cu prima linie:


, linia a doua , linia a III- a determinantului va fi de
forma a și așa mai departe, ajungand la ultima linie a determinantului

Se poate demonstra prin inductie matematica ca valoarea determinantului este


Deoarece determinantul este diferit de zero pentru , rezulta ca sistemul admite o
soluție unica deci polinomul de interpolare este unic.

Consideram urmatoarele date pentru :

Determinam polinomul de interpolare de gradul doi care trece prin punctele , :

Coeficientii polinomului sunt solutiile sistemului :

Sau sub forma matriceala:

PROBLEMA Se dau datele din următorul tabel, aceste date s-au obținut experimental și reprezintă
masuratori ale distantei parcurse de un automobil în funcție de timp

0 0
10 142.04
15 224.18
20 317.35
23.5 402.97
Să se determine:
a) Distanța parcursa după secunde;
b) Viteza și accelerația după secunde.

Pentru determinarea distantei parcuse după secunde folosim metoda directa de interpolare și
aproximam distanța ca funcție de timp cu un polinom de gradul al doilea.
Din tabelul dat vom citi trei valori care sunt mai apropiate de valoarea , adică valorile
și .
Sistemul în acest caz devine:

În forma matriceala sistemul se rescrie:


Variante de rezolvare:

I) Metoda de eliminare a lui Gauss

• se citește matricea extinsa


• se determina linia pivot (elementul cel mai mare, ),
se schimba linia 3 cu linia 1
• se elimina în prima coloana elementele următoare
folosind elementul .
• se schimba liniile doi și trei (elementul pivot devine
elementul din linia 2 și coloana 2 și se anulează
termenul din linia trei coloana doi
• soluția se determina prin metoda substitutiei inverse
începând cu ultima ecuație
• rezultatul reprezintă coeficientii polinomului de
interpolare

Răspuns:

pentru se obtine distanța parcursa după


secunde calculand .

II) Varianta:

• se citește matricea și coloana termenilor liberi și

·
• se face împărțirea la dreapta
• se determina răspunsul
III Varianta

Folosind functia octave rref:


• verificați cu help functia rref
• se citește matricea extinsa - determina matricea extinsa

IV Varianta

Se folosește functia polyfit pentru calculul coeficientilor polinomului de interpolare și functia


polyval pentru a calcula valoarea polinomului.

-transpusa
Interpolare cu polinomul lui Newton

1. Interpolare liniara-polinomul lui Newton de gradul I

Consideram doua date numerice:

Exista o dreapta care trece prin cele doua puncte , adică un polinom de
gradul întâi care uneste cele doua puncte.
Construim polinomul lui Newton:
Prin cele doua puncte trece o dreapta a carei ecutie este
sau unde am notat

și

Panta dreptei este o diferența finita care aproximeaza derivata de ordinul întâi.

Ne propunem sa determinam soluția problemei anterioare cu polinomul lui Newton de ordin întâi.
Consideram dat tabelul cu datele masurate:

0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

Avem

unde

Observație: Eroarea relativa intre cele doua metode (metoda directa cu polinom de gradul doi și
metoda lui Newton liniara este:
Aproximatia va fi mai buna cu cât intervalul dintre și este mai mic.

Obținem polinomul lui Newton:


Pentru se obtine distanța parcursa de automobil.

2. Interpolare patratica – Polinomul lui Newton de gradul doi

Presupunem citite experimental trei date numerice:

Polinomul lui Newton de ordinul doi este de forma :

Determinam coeficientii polinomului inpunand conditia sa interpoleze datele numerice


Pentru avem:

Pentru obținem:

cu

Pentru avem:

Astfel avem polinomul de interpolare a lui Newton de ordinul doi.

relatiile de calcul ai coeficientilor reprezintă diferențele divizate de ordin unu, doi și


trei.
• diferența divizata de ordinul unu:
• diferența divizata de ordinul doi:
• diferența divizata de ordinul trei:

Folosind diferențele divizate polinomul lui Newton de ordinul doi devine:

Reluam problema anterioara pentru a o rezolva utilizand polinomul lui Newton de ordinul doi:

Consideram datele din tabel:

0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

Vom considera trei puncte date din tabel care sa incadreze valoarea , consideram
avem
Calculam și obținem:

Se obtine polinomul de interpolare de ordinul doi:

Pentru se obtine .

3. Polinomul cubic de interpolare al lui Newton

Se determina pentru patru puncte de date


Exercițiu
Să se calculeze utilizand interpolarea cubica a lui Newton.
Comparati rezultatele cu metoda directa, interpolarea liniara și interpolarea patratica.

4. Forma generala a polinomului lui Newton

Se considera un set de date:


...
...

Forma polinomului lui Newton pentru setul de date este:

Coeficientii se determina din relatiile:

, , ..., unde

....

Implementarea în Octave a metodei lui Newton

Coduri de program pentru calculul diferentelor divizate și a polinomului de interpolare.

Fisier de tip funcție pentru diferente divizate:

function f = intpol_newton_dfin(x,f)
n = length(x);
for i = 2:n
f(i:n) = (f(i:n) - f(i-1:n-1)) ./ ...
(x(i:n) - x(1:n+1-i));
end

Polinomul lui Newton de interpolare se obtine utilizand fișierul de tip funcție:

function p = intpol_newton_val(x,a,t)
n = length(x);
p = a(n) * ones(size(t));
for i = n-1:-1:1 p = p.*(t-x(i)) + a(i);
end
Codul pentru interpolare cu polinomul lui Newton de ordinul doi este:

x=[10,15,20];
f=[142.04,224.18,317.35];
>>x = [10,15,20];
>>f = [142.04,224.18,317.35];
>>a = intpol_newton_dfin(x,f) c = 142.0400 16.4280 0.2206
% calculăm distanţa parcursă la t=18 şi graficul polinomului
>> t=8:0.05:24 ;
>> p=intpol_newton_val(x,a,t);
>> plot(x,f,'o',t,p,'r-')
>> d=intpol_newton_val(x,a,18) d= 278.7584

Polinomul lui Lagrange de interpolare

Fie , puncte distincte și , . Se


numesc polinoame Lagrange cele polinoame cu proprietatile:


• pentru deoarece are gradul și are radacinile
,


Forma Lagrange a polinomului de interpolare asociat nodurilor și valorilor
este:

sau
.

Interpolare liniara

Pentru obținem polinomul de interpolare de ordinul întâi.

Interpolare cu polinoame Lagrange de ordinul doi (interpolare patratica)

Pentru polinomul de interpolare a lui Lagrange este :

unde polinoamele fundamentale

sunt:
Reluam problema anterioara pentru a evalua distanța parcursa după cu polinomul lui
Lagrange de ordinul doi.

0 0
10 142.04
15 224.18
20 317.35
23.5 402.97

Polinomul lui Lagrange este:

unde

Pentru rezulta .
Cod pentru interpolare cu polinomul lui Lagrange:

function yint=Lagrange_interp
% interpolare cu polinomul Lagrange
% x- vector variabile independente
% y-vector variabile dependente
% xd-valoarea la care calculaminterpolarea
% yint-valoarea obtinuta prin interpolare
;

În fereastra de comanda se scriu instrucțiunile:

Lagrange_interp

Avem următoarea simulare pentru soluția numerica și pentru graficele polinoamelor liniare și
patratice:

INTERPOLARE LINIARA:
punctele de date:
valorile :
valorile polinoamelor fundamentale:
polinomul
Valoarea polinomului de gradul I în este .

INTERPOLAREA PATRATICA:
punctele :
valorile :
valorile polinoamelor fundamentale
polinomul lui Lagrange de ordinul doi
.

Interpolare spline

Termenul de funcţie spline a fost introdus de matematicianul românoamerican Isaac Jacob


Schoenberg, (1903 - 1990). Născut la Galaţi, Schoenberg a studiat la Universitatea din Iaşi şi la
Universităţile din Berlin si din Göttingen .
Termenul de funcţie spline a fost utilizat pentru a defini o funcţie formată din polinoame pe porţiuni
(subintervale) adiacente şi care se racordează ȋn noduri ȋmpreună cu derivatele sale până la un
anumit ordin.

1. Interpolare spline liniara

Fie un set discret de date numerice . Ne propunem sa


determinam o funcție continua care trece prin aceste puncte
...
...

folosind funcții spline liniare . Functiile spline liniare sunt polinoame de gradul I pe
subintervale de forma .

2. Interpolare spline patratica

Funcţiile spline pătratice sau funcţiile spline de gradul II sunt date de polinoame de gradul doi:

.
.
.

1. Pentru a determina functia trebuie sa determinam cei coeficienti, avem nevoie de ecuații.
Aceste ecuații le obținem astfel:
Fiecare polinom de ordinul al doilea trece prin doua puncte consecutive

.
.
.

.
.
.

2 . Derivatele de ordinul ȋntâi ale celor două polinoame consecutive sunt continue ȋn punctele
interioare şi valorile lor sunt egale (funcţia spline este netedă). Astfel, pentru primul punct interior
obţinem o ecuaţie egalând cele două derivate calculate în .

Procedând la fel pentru toate cele puncte interioare vom obţine ecuații:
.
.
.

Am obţinut până acum ecuaţii. Mai avem nevoie de ȋncă o ecuaţie. Putem alege prima
funcţie spline liniară, astfel avem şi putem considera că aceasta este a -a ecuaţie. Sistemul
liniar de ecuaţii cu necunoscute se poate rezolva prin metode directe: regula lui Cramer,
metoda lui Gauss, soluția cu matricea inversa sau metode indirecte : metoda Jacobi sau Gauss-
Seidel.

3. Interpolare spline cubica

Interpolarea cubică se realizează cu polinoame de gradul trei. Pentru cele puncte de date
numerice avem polinoame de gradul trei, deci vom avea coeficienţi necunoscuţi. Aceştia se
determină impunând condiţii de racordare ȋn punctele interioare atât pentru funcţiile spline cât şi
pentru derivalele lor de ordinul unu şi doi. Nu mai prezentăm aici aceste calcule. Pentru interpolarea
spline cubică se poate folosi funcţia Matlab spline ( >> help spline). Sintaxa: >> pp = spline(x,y)

% M-file metode de interp_spline.m


% clc
clf
clear all
% INPUTS:
% x-data
% y-data
% valoarea lui xd
% x=[ 0 20 40 56 68 80 84 96 104 110];
% y=[ 0 20 20 38 80 80 100 100 125 125];
% xd=60;
disp(sprintf('\n*****Simulare*****'))
% SOLUTIA
% sortarea crescatoare a datelor dupa datele x xy=cat(1,x,y);
xy=xy';
xy=sortrows(xy,1);
for i = 1:numel(x) x(i)=xy(i,1);
y(i)=xy(i,2);
end
% Datele de intrare
disp(sprintf('\n\n***Datele de intrare****'))
fprintf('\n');
disp(' valorile x:')
x
disp('valorile y:')
y
disp(sprintf('Valoarea x la care calculam y, xd = %g',xd))
%%%%%%%% INTERPOLAREA SPLINE LINIARA %%%%%%%%%
disp(sprintf('\nINTERPOLAREA SPLINE LINIARA:'))
% Crearea unei variabile simbolice 'z'.
z=sym('z');
% Scrie ecatiile functiilor spline
disp(sprintf('Ecuatiile functiilor spline liniare:'));
for i = 1:numel(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
f = m*(z-x(i))+y(i);
M = (-m*x(i) + y(i));
% Scrierea ecuatiilor in spatiul command window
str1 = ['f(x)_',num2str(i),' = ',num2str(m),'x'];
if M > 0
str2 = [' + ',num2str(M)];
else
str2 = [' ',num2str(M)];
end
finalstr = [str1,str2];
disp(finalstr);
end
axis off
figure(1)
for i = 1:length(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
z=sym('z');
f = m.*(z-x(i))+y(i);
if xd < x(i+1) & xd >= x(i) fxld=subs(f,z,xd);
end X = x(i):0.1:x(i+1);
Y = subs(f,z,X) ;
plot(X,Y);
hold on
Y = 0;
X = 0;
end
hold on
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxld,'kx','Linewidth',2,'MarkerSize',12' )
title('\bfInterpolarea spline liniara','FontSize',14)
xlabel('\bfx data');
ylabel('\bff(x)');
grid
% Afiseaza f(x) la xd (in figura)
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') = ',num2str(fxld)])
xlim([min(x) max(x) ])
ylim([min(y) max(y)])
hold off

%%%%%%%%% INTERPOLAREA SPLINE PATRATICA %%%%%%%%%

disp('---------------------------------------')
disp(sprintf('\nINTERPOLAREA SPLINE PATRATICA:'));

% Generarea matricei necesara la calculul coeficientilor polinoamelor

n=numel(x);
A=zeros(3*(n-1));
for i=1:n-1
for j=0:1
for k=0:2
A(2*i-1+j+1,3*i-3+k+1)=x(i+j)^k;
end
end
end
for i=1:n-2
for j=0:1
for k=0:1
A(2*(n-1)+i+1,3*i-2+k+j*3+1)=((-1)^j)*(2*x(i+1))^k;
end
end
end
A(1,3)=1;
% Genereaza matricea Y
Y=zeros(3*(n-1),1);
for i=0:n-2
for j=0:1
Y(2*(i+1)+j)=y(i+j+1);
end
end
% Calculam matricea coeficientilor C
C=inv(A)*Y;
% Scriem ecuatiile splinurilor
disp(sprintf('\nEcuatiile functiilor spline patratice:'));
for i = 0:n-2
f=C(3*i+1)+C(3*i+2)*z+C(3*i+3)*z^2;
str1 = ['f(x)_',num2str(i+1),' = ',num2str(C(3*i+1))];
if C(3*i+2) > 0
str2 = [' + ',num2str(C(3*i+2)),'x'];
else
str2 = [' ',num2str(C(3*i+2)),'x'] ;
end if
C(3*i+3) > 0 str3 = [' + ',num2str(C(3*i+3)),'x^2'];
else
str3 = [' ',num2str(C(3*i+3)),'x^2'];
end
finalstr = [str1,str2,str3];
disp(finalstr);
end
% graficele
figure(2)
title('\bfInterpolarea spline patratica','FontSize',14)
xlabel('\bfx data');
ylabel('\bff(x)');
grid
for i=0:n-2
f=C(3*i+1)+C(3*i+2).*z+C(3*i+3).*z.^2;
if xd < x(i+2) & xd >= x(i+1)
fxqd=subs(f,z,xd);
end
X = x(i+1):0.1:x(i+2);
Y = subs(f,z,X);
plot(X,Y)
X = 0;
Y = 0;
hold on
end;
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxqd,'kx','Linewidth',2,'MarkerSize',12')
% Scrie f(x) pentru xd text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxqd)])
title('\bfInterpolarea spline patratica','FontSize',14);
xlabel('\bfx data')
ylabel('\bff(x)')
xlim([min(x) max(x)])
grid
hold off

%%%%%%%%% INTERPOLAREA SPLINE CUBICA %%%%%%%%%

disp('-------------------------------------');
disp(sprintf('\nINTERPOLAREA SPLINE CUBICA:'))
disp(sprintf('\nVom folosi functia Matlab "spline"'))
ymax=max(y);
ymin=min(y);
xx=min(x):(max(x)-min(x))/1000:max(x);
disp('-------------------------------------');
disp(sprintf('\nINTERPOLAREA SPLINE CUBICA:'))
disp(sprintf('\nVom folosi functia Matlab "spline"')) ymax=max(y);
ymin=min(y);
xx=min(x):(max(x)-min(x))/1000:max(x);
plot(xx,yy,'b') fxcd=spline(xx,yy,xd);
% Afiseaza f(x) la xd (in figura) text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),')
= ',num2str(fxcd)])
plot(xd,fxcd,'kx','Linewidth',2,'MarkerSize',12')
title('\bfInterpolarea spline cubica','FontSize',14)
xlabel('\bfx data')
ylabel('\bff(x)')
xlim([min(x) max(x)]) tot=(max(yy)-min(yy))*0.05;
ylim([min(yy)-tot max(yy)+tot])
hold off
disp(sprintf('\n **********Rezultate:********'))
disp(' Functii spline Functii spline Functii spline ')
disp('xd liniare patratice cubice')
disp('---------------------------------------------------------');
disp(sprintf('%g %g %g %g',xd, fxld, fxqd, fxcd))

Problema: să se interpoleze cu metodele de interpolare spline datele numerice: viteza unui


autovehicul versus timp. Apelam fișierul metode_inter_spline după ce introducem datele de intrare
și și valoarea pentru care se face interpolarea.
x=[ 0 20 40 56 68 80 84 96 104 110];
y=[ 0 20 20 38 80 80 100 100 125 125];
xd=60;
>> metode_interp_spline
Obținem polinoamele de interpolare liniare și patratice. Valoarea vitezei autovehiculului se
determina pentru prin cele trei tipuri de functii spline.

valorile x:
x = 0 20 40 56 68 80 84 96 104 110
valorile y:
y = 0 20 20 38 80 80 100 100 125 125
Valoarea x la care calculam y, xd = 60

INTERPOLAREA SPLINE LINIARA:


Ecuatiile functiilor spline liniare:
f(x)_1 = 1x 0
f(x)_2 = 0x + 20
f(x)_3 = 1.125x -25
f(x)_4 = 3.5x -158
f(x)_5 = 0x + 80
f(x)_6 = 5x -320
f(x)_7 = 0x + 100
f(x)_8 = 3.125x -200
f(x)_9 = 0x + 125
--------------------------------------

INTERPOLAREA SPLINE PATRATICA:

Ecuatiile functiilor spline patratice:

f(x)_1 = 0 + 1x 0x^2
f(x)_2 = -20 + 3x -0.05x^2
f(x)_3 = 272.5 -11.625x + 0.13281x^2
f(x)_4 = -78.6667 + 0.91667x + 0.020833x^2
f(x)_5 = -1620 + 46.25x -0.3125x^2
f(x)_6 = 14380 -353.75x + 2.1875x^2
f(x)_7 = -9140 + 206.25x -1.1458x^2
f(x)_8 = 20860 -418.75x + 2.1094x^2
f(x)_9 = -38008.3333 + 713.3333x -3.3333x^2

--------------------------------------------

INTERPOLAREA SPLINE CUBICA:

Vom folosi functia Matlab "spline"

********** Rezultate: ********

Functii spline Functii spline Functii spline


xd liniare patratice cubice

-------------------------------------------------------------------------------
60 52 51.3333 54.5338

Interpolare cu funcţia Matlab interp1 Funcția interp1 (>> help interp1)interpolează date numerice
folosind funcţii 1-D (o singură variabilă)

Syntaxa:

yi = interp1(x,Y,xi)
yi = interp1(Y,xi)
yi = interp1(x,Y,xi,method)
yi = interp1(x,Y,xi,method,'extrap')

Descriere:

yi = interp1(x,Y,xi)
interpolează datele (x,Y) pentru a determina valorile yi ale funcţiei Y ȋn punctele xi, yi=Y(xi)
• x trebuie să fie vector
• Y poate să fie vector (trebuie să aibă aceeaşi dimensiune cu x, dim(x)=dim(Y))
• Y poate fi un tabel de forma [n,d1,d2,...,dk], unde n este lungimea lui x . Interpolarea,
determinarea valorilor funcţiei, se face pentru fiecare d1, d2..dk.
• xi poate fi un scalar, un vector sau un tabel multidimensional
• yi va avea aceeaşi dimensiune cu xi

Dimensiunile lui xi şi yi sunt relationate astfel:


• dacă xi este scalar sau vector, size(yi) este [length(xi), d1, d2, ..., dk].
• dacă xi este un tabel de mărimea size [m1,m2,...,mj], yi va avea mărimea
size [m1,m2,...,mj,d1,d2,...,dk].

Descriere:

yi = interp1(x,Y,xi,method)

Interpolare folosind următoarele metode :


• 'nearest' - interpolare folosind valoarea invecinată (care este cea mai aproape)
• 'linear' - interpolare liniară (default)
• 'spline'- interpolare spline cubică
• 'pchip'- interpolare cu polinoame Hermite

Descriere:

yi = interp1(x,Y,xi,method,'extrap')

Comandă folosită pentru extrapolare, calcululează yi=Y(xi) ȋn puncte xi din afara valorilor date ȋn
vectorul x Comanda interpl interpolează ȋntre punctele date. Cu ea determinăm valorile funcţiei de
interpolare ȋn puncte intermediare

x_data = [0 75];
Y_data = [28 189];
xi = 48;
yi = interp1(x_data,Y_data,xi)
yi = 131.0400

Problema 2 Interpolarea datelor pentru deformațiile unui arc elastic versus forțe.
% Se dau datele care leaga alungirile unui arc de fortele care-l intind
x_forte = [0 6 11 17.5 23 31]; % fortele
Y_alung = [0 1 2 3 4 5]; % alungirile
plot(x_forte,Y_alung,'r o'); % grafic date numerice

% interpolare cu funcția interp1

xi = 20;
yi = interp1(x_forte,Y_alung,xi,'linear')

% extrapolare

x1i = 50;
y1i = interp1(x_forte,Y_alung,x1i,'linear','extrap')

% determinam valoarea interpolata cu polyfit pentru compararea rezultatelor


p = polyfit(x_forte,Y_alung,1);
y2i = polyval(p,xi )

% graficul punctelor obtinute (solutiile)

hold on
plot(xi,yi,'bo'); % solutia interpolare liniara
plot(xi,y2i,'g*'); % solutia cu polyfit
plot(x1i,y1i,'ko');% valoarea extrapolata

% graficul celei mai bune aproximatii


xx1 = [0 60];
yy1 = polyval(p,xx1);
hold on;
plot(xx1,yy1,'b-');

% linia de extrapolare

xx1 = x_forte(end-1);
xx2 = 60;
yy1 = Y_alung(end-1);
yy2 = interp1(x_forte,Y_alung,60,'linear','extrap')
plot([xx1 xx2],[yy1 yy2],'k--');

xlabel('Forte');
ylabel('Alungirile');
legend('punctele de interpolare','val interpolata','valoarea interp best','valoarea extrapolata','linia best
fit','linia extrapolare')

Exemplu
Facem următorul test cu un automobil: la intervale de timp specificate accelerăm şi apoi menţinem
viteza constanta (!! nu decelerăm, nu ȋncetinim pe timpul testului). Masurătorile efectuate sunt date
ȋn tabelul de mai jos:

t 0 20 40 56 68 80 84 96 104 110
v 0 20 20 38 80 80 100 100 125 125
Vom folosi pentru interpolare funcţia Matlab interp1 cu cele trei opţiuni pentru 'method'. Programul
Matlab este salvat in fila test_drive_interp1.

test_drive_interp1.m
% exemplu interpolare test drive

t=[ 0 20 40 56 68 80 84 96 104 110];


v=[ 0 20 20 38 80 80 100 100 125 125];
% interpolare liniara
tt=linspace(0,110);
v1=interp1(t,v,tt,'linear');
figure(1);
plot(t,v,'o',tt,v1)
title('interpolare liniara')

% interpolare spline

vs=interp1(t,v,tt,'spline');
figure(2);
plot(t,v,'o',tt,vs)
title('interpolare spline')

% interpolare cu polinoame Hermite

vh=interp1(t,v,tt,'pchip');
figure(3);
plot(t,v,'o',tt,vh)
title('interpolare polinoame cubice Hermite')

>> v1(60) = 71.4444;


>> vs(60) = 75.7560 ;
>> vh(60) = 76.1737

Interpolare cu funcţia Matlab polyfit

O alternativă pentru aproximarea funcției pentru un set de date numerice discrete este obținută cu
funcțiile Matlab polyfit și polyval. Sintaxa:

coef_pol = polyfit(xdata, ydata, n)


Comanda polyfit returnează vectorul coef_pol al coeficienților polinomului de cea mai bună
aproximație (bazată pe metoda celor mai mici pătrate). xdata și ydata sunt vectorii care conțin datele
numerice iar n este gradul polinomului care va fi determinat.
După ce s-a folosit comanda polyfit vom putea determina valorile polinomului de cea mai bună
apriximație folosind comanda polyval.

Exemplu test drive cu polyfit


>> test_drive_polyfit
coeff = 0.6953 -0.1996

t=[ 0 10 15 20 34 40 50 56 60 68 80 84 96 104 110];


v=[ 0 15 18 19 20 22 24 28 38 45 54 60 70 75 84];
coeff = polyfit(t,v,1) v_fit = polyval(coeff,t);
plot(t,v,'r+',t,v_fit),
grid on,
xlabel('t-data') ylabel('v-data')
title('Exemplul test drive')
legend('Datele masurate','Lina de cea mai buna aproximatie','Location','SouthEast')

CONCLUZII:

Am studiat problema aproximării unei funcții folosind polinoame sau polinoame pe porțiuni.
Funcția poate fi dată printr-o ecuație sau prin valorile ei într-un set de noduri xi yi , i =0,1,2...n .
Problema de interpolare constă în determinarea aproximativă a funcției care trece prin aceste
puncte. Polinomul de interpolare este polinomul de gradul cel mai mic care satisface pentru, o
funcție dată f , .
Cu toate că acest polinom de interpolare este unic el poate lua forme diferite: polinomul Lagrange,
polinomul Newton sau polinomul Hermite. Polinomul lui Lagrange este util, când este mic,
pentru deducerea formulelor de aproximare a derivatelor și a intrgralelor. Polinomul lui Newton
produce o eroare de calcul mai mică și este foarte util la rezolvarea ecuațiilor diferențiale .
Funcția de interpolare Matlab interp1 poate fi folosită pentru interpolarea unui set de date discrete
prin interpolare liniară, interpolare cubică sau interpolare cubică cu funcții spline. Funcția Matlab
polyfit bazată pe aproximarea prin metoda celor mai mici pătrate, poate fi utilizată pentru a produce
o funcție de interpolare de grad cel mult și care trece prin cele puncte

Algoritm de determinare a polinomului lui Lagrange:


Date de intrare:
-numarul punctelor distincte este ;
- lista ce conține cele puncte distincte din intervalul ;
- lista care conține valorile corespunzatoare functiei;
- punctul în care se evalueaza polinomul;
- valoarea polinomului în

• Interpolare spline cubica

Curba spline cubica este o curba neteda, defnita de un set de polinoame de gradul trei. Curba dintre
fiecare pereche de puncte este un polinom de gradul trei, astfel încât sa conduca la tranzitii netede
de la un polinom de gradul trei la altul. De exemplu, șase puncte vor fi conectate cu cinci curbe
diferite de gradul trei ceea ce conduce la o funcție neteda intre cele șase puncte. Curba de
interpolare spline cubica se calculează cu functia spline .

Exemplu: Să se determine valoarea de interpolare spline cubica pentru cu datele de mai


jos:
temp=spline(x,y,2.6)
se obtine rezultatul:

Pentru calculul a doua valori interpolate, se folosește secvența:

rezultatul obținut:

Problema: 1) Să se reprezinte grafic o interpolare liniara și spline cubica prin șase puncte (datele de
mai sus).

2) Fiind date 10 perechi de puncte în planul xOy, să se traseze graficul rezultat prin interpolarea
spline pe o rețea de 4 ori mai fina:

secvența determina vectorul al celor 40 de puncte corespunzatoare valorilor .


• Interpolarea prin metoda transformatei Fourier

Functia interpoleaza datele cu o singura variabila utilizand metoda FFT (Fast Fourier
Transform); se apeleaza cu sintaxa:

care returneaza un vector de lungime obținut din vectorul . Numărul trebuie să fie mai mare
decât numărul de elemente al vectorului , iar rezultatul are periodicitate circulara data de utilizarea
transformatei Fourier.

Problema: Fie datele obtinute dintr-un sinus esantionat cu 8 pași pe perioada:

;
;
;
;

se obtine rezultatul:
Diferența maxima intre valorile interpolate și cele reale este egala cu ordinul de mărime al celui mai
mic numar reprezentabil în calculator (eroarea de trunchiere).

• Interpolare multipla

Functia interpoleaza datele după o lege liniara, cubica sau spline cubica și se apeleaza cu
sintaxa:
- interpolare liniara
- interpolare spline cubica
- interpolare cubica
Toate legile de interpolare cer ca să fie ordonat monoton, în plus interpolarea cubica cere ca
punctele pe axa ox să fie egal distantate.

1) Fie urmatoarele date ale unei funcții de o variabila:

x -2 -1 0 1 2
y 6 2 3 1 7

Să se estimeze cu functia interp1 valoarea care corespunde lui și folosind


interpolarea liniara, cubica și spline cubica.

;
;

se obțin rezultatele:

INTERPOLAREA FUNCTIEI DE MAI MULTE VARIABILE

• Interpolarea prin metoda distantei inverse

Se realizeaza cu functia:

Valoarea matricei corespund valorilor matricelor și . Matricea asociaza fiecarei perechi


câte o valoare .

Exemplu: Să se reprezinte grafic functia de doua variabile pe intervalul


.

mesh
(pentru comparație rezultatul interpolarii a fost deplasat pe axa cu fata de reprezentarea
neinterpolata)

S-ar putea să vă placă și