prima implementazione di integratori

This commit is contained in:
2014-12-04 03:09:28 +01:00
parent a154133af8
commit e73b1a2065
5 changed files with 212 additions and 0 deletions

View 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

View 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

View 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

View 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
View File

@@ -0,0 +1 @@
a(1:-1,:)