Files
unisa_analisi_numerica_2014…/functions/integratore_adattivo_locale.m

68 lines
2.0 KiB
Matlab

function [ area, err, ier ] = integratore_adattivo_locale( f, m, toll , maxite )
%algoritmo dei trapezi composto, addattivo con controllo di errore locale
%se l'algoritmo raggiunge maxite l'errore stimato sara' inf poiche' non e'
%stato possibile calcolare l'errore dei punti piu a destra
% 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
minlen_factor=1e-6;
[x,~] = size(m);
i=1;
k=i+1;
j=x;
minlen=(m(j,1) - m(i,1)) * minlen_factor ;
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) &&( (m(j,1) - m(i,1)) > minlen )
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
if (m(j,1) - m(i,1)) <= minlen
disp('Warning: Minlen raggiunto')
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