prima implementazione di integratori
This commit is contained in:
83
functions/integratore_adattivo_globale.m
Normal file
83
functions/integratore_adattivo_globale.m
Normal file
@@ -0,0 +1,83 @@
|
||||
function [ area, err, ier ] = integratore_adattivo_globale( f, m, toll , maxite )
|
||||
%algoritmo dei trapezi composto, addattivo con controllo di errore globale
|
||||
% input
|
||||
% f = function handle
|
||||
% m = matrice n x 2 ordinata in modo crescente per righe rispetto alla
|
||||
% prima colonna. la prima colonna rappresenta un punto x, la seconda
|
||||
% colonna la f(x). ogni valore della seconda colonna deve essere uguale a
|
||||
% 0 o essere la f(x) del punto x della prima colonna sulla medesima riga.
|
||||
% toll = tolleranza assoluta voluta
|
||||
% maxite = numero massimo di iterazioni
|
||||
% output
|
||||
% area = area finale
|
||||
% err = errore assoluto
|
||||
% ier = indice di errore
|
||||
|
||||
[x,~] = size(m);
|
||||
i=1;
|
||||
k=i+1;
|
||||
j=x;
|
||||
ite = 0;
|
||||
ier = 0;
|
||||
report=[];
|
||||
while (i <= j - 1) && (ite < maxite)
|
||||
[~,larea,lerr,m1] = static_quadratic(f,m(i:k,:));
|
||||
m=[m(1:i-1,:);m1;m(k+1:j,:)]
|
||||
ite = ite + 1;
|
||||
j= j + 1;
|
||||
report=[report;i,k+1,larea,lerr]
|
||||
i = i + 2;
|
||||
k = k + 2;
|
||||
end
|
||||
report = sortrows(report,4)
|
||||
report = flipud (report)
|
||||
[lenght,~] = size(report);
|
||||
area=0;
|
||||
err = 0;
|
||||
for i=1:lenght
|
||||
err= err + report(i,4);
|
||||
area = area + report(i,3);
|
||||
end
|
||||
|
||||
while ( err > toll)&& (ite < maxite)
|
||||
i=report(1,1);
|
||||
k=report(1,2) - 1;
|
||||
[lenght,~] = size(report);
|
||||
report=report(2:lenght,:)
|
||||
[~,larea,lerr,m1] = static_quadratic(f,m(i:k,:));
|
||||
m=[m(1:i-1,:);m1;m(k+1:j,:)]
|
||||
ite = ite + 1;
|
||||
j= j + 1;
|
||||
report=[report;i,k+1,larea,lerr]
|
||||
i=k+1;
|
||||
k=k+2;
|
||||
[~,larea,lerr,m1] = static_quadratic(f,m(i:k,:));
|
||||
m=[m(1:i-1,:);m1;m(k+1:j,:)]
|
||||
ite = ite + 1;
|
||||
j= j + 1;
|
||||
report=[report;i,k+1,larea,lerr];
|
||||
report = sortrows(report,4)
|
||||
report = flipud (report)
|
||||
[lenght,~] = size(report);
|
||||
area=0;
|
||||
err = 0;
|
||||
for i=1:lenght
|
||||
err= err + report(i,4)
|
||||
area = area + report(i,3)
|
||||
end
|
||||
end
|
||||
|
||||
if ite >= maxite
|
||||
disp('Warning: Massimo numero di step raggiunti')
|
||||
ier = 1;
|
||||
|
||||
end
|
||||
|
||||
|
||||
hold on
|
||||
fplot (f,[m(1,1) m(j,1)],'k')
|
||||
plot (m(:,1),m(:,2),'*r')
|
||||
hold off
|
||||
|
||||
end
|
||||
|
||||
60
functions/integratore_adattivo_locale.m
Normal file
60
functions/integratore_adattivo_locale.m
Normal file
@@ -0,0 +1,60 @@
|
||||
function [ area, err, ier ] = integratore_adattivo_locale( f, m, toll , maxite )
|
||||
%algoritmo dei trapezi composto, addattivo con controllo di errore locale
|
||||
% input
|
||||
% f = function handle
|
||||
% m = matrice n x 2 ordinata in modo crescente per righe rispetto alla
|
||||
% prima colonna. la prima colonna rappresenta un punto x, la seconda
|
||||
% colonna la f(x). ogni valore della seconda colonna deve essere uguale a
|
||||
% 0 o essere la f(x) del punto x della prima colonna sulla medesima riga.
|
||||
% toll = tolleranza assoluta voluta
|
||||
% maxite = numero massimo di iterazioni
|
||||
% output
|
||||
% area = area finale
|
||||
% err = errore assoluto
|
||||
% ier = indice di errore
|
||||
|
||||
[x,~] = size(m);
|
||||
i=1;
|
||||
k=i+1;
|
||||
j=x;
|
||||
ite = 0;
|
||||
area=0;
|
||||
err = 0;
|
||||
ier = 0;
|
||||
while (i <= j - 1) && (ite < maxite)
|
||||
ltoll = (toll * (m(k,1) - m(i,1))) / (m(j,1) - m(i,1));
|
||||
[~,larea,lerr,m1] = static_quadratic(f,m(i:k,:));
|
||||
m=[m(1:i-1,:);m1;m(k+1:j,:)];
|
||||
ite = ite + 1;
|
||||
j= j + 1;
|
||||
while (lerr > ltoll) && (ite < maxite)
|
||||
ltoll = (toll * (m(k,1) - m(i,1))) / (m(j,1) - m(i,1));
|
||||
[~,larea,lerr,m1] = static_quadratic(f,m(i:k,:));
|
||||
m=[m(1:i-1,:);m1;m(k+1:j,:)];
|
||||
ite = ite + 1;
|
||||
j= j + 1;
|
||||
end
|
||||
area = area + larea;
|
||||
err = err + lerr;
|
||||
|
||||
i = i + 2;
|
||||
k = k + 2;
|
||||
end
|
||||
if ite >= maxite
|
||||
disp('Warning: Massimo numero di step raggiunti')
|
||||
ier = 1;
|
||||
err = inf;
|
||||
for i=i:j-1
|
||||
k=i+1;
|
||||
area= area + (((m(i,2) + m(k,2)) * ( m(k,1) - m(i,1) )) /2);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
hold on
|
||||
fplot (f,[m(1,1) m(j,1)],'k')
|
||||
plot (m(:,1),m(:,2),'*r')
|
||||
hold off
|
||||
|
||||
end
|
||||
|
||||
19
functions/integratore_schema_fisso.m
Normal file
19
functions/integratore_schema_fisso.m
Normal file
@@ -0,0 +1,19 @@
|
||||
function [ area, err ] = integratore_schema_fisso( f, m, toll )
|
||||
%algoritmo dei trapezi composto a schema fisso
|
||||
% input
|
||||
% f = function handle
|
||||
% m = matrice n x 2 ordinata in modo crescente per righe rispetto alla
|
||||
% prima colonna. la prima colonna rappresenta un punto x, la seconda
|
||||
% colonna la f(x). ogni valore della seconda colonna deve essere uguale a
|
||||
% 0 o essere la f(x) del punto x della prima colonna sulla medesima riga.
|
||||
% toll = tolleranza assoluta voluta
|
||||
% output
|
||||
% area = area finale
|
||||
% err = errore assoluto
|
||||
|
||||
err = inf;
|
||||
while (err > toll)
|
||||
[~,area,err,m] = static_quadratic(f,m);
|
||||
end
|
||||
end
|
||||
|
||||
49
functions/static_quadratic.m
Normal file
49
functions/static_quadratic.m
Normal file
@@ -0,0 +1,49 @@
|
||||
function [ areai,areaf,err,m ] = static_quadratic( f,m )
|
||||
%algoritmo dei trapezi per approssimare un integrale
|
||||
% input
|
||||
% f = function handle
|
||||
% m = matrice n x 2 ordinata in modo crescente per righe rispetto alla
|
||||
% prima colonna. la prima colonna rappresenta un punto x, la seconda
|
||||
% colonna la f(x). ogni valore della seconda colonna deve essere uguale a
|
||||
% 0 o essere la f(x) del punto x della prima colonna sulla medesima riga.
|
||||
% output
|
||||
% areai = area iniziale
|
||||
% areaf = area finale
|
||||
% err = errore area iniziale - finale in valore assoluto
|
||||
% m = la matrice iniziale con i nuovi punti aggiunti
|
||||
|
||||
|
||||
[x,~] = size(m);
|
||||
for i=1:x
|
||||
if m(i,2) == 0
|
||||
m(i,2)= f(m(i,1));
|
||||
end
|
||||
end
|
||||
|
||||
areai=0;
|
||||
for i=1:x-1
|
||||
k=i+1;
|
||||
areai= areai + (((m(i,2) + m(k,2)) * ( m(k,1) - m(i,1) )) /2);
|
||||
end
|
||||
|
||||
i=1;
|
||||
k=i+1;
|
||||
j=x;
|
||||
while i<= ((x * 2)-2)
|
||||
valuex= ( m(i,1) + m(k,1) ) /2;
|
||||
valuey= f(valuex);
|
||||
m= [m(1:i,:);valuex,valuey;m(k:j,:)];
|
||||
i=i+2;
|
||||
k=k+2;
|
||||
j= j + 1;
|
||||
end
|
||||
|
||||
areaf=0;
|
||||
for i=1:j-1
|
||||
k=i+1;
|
||||
areaf= areaf + (((m(i,2) + m(k,2)) * ( m(k,1) - m(i,1) )) /2);
|
||||
end
|
||||
|
||||
err = abs(areaf - areai) / 3;
|
||||
end
|
||||
|
||||
1
samples/test.m
Normal file
1
samples/test.m
Normal file
@@ -0,0 +1 @@
|
||||
a(1:-1,:)
|
||||
Reference in New Issue
Block a user