diff --git a/functions/integratore_adattivo_globale.m b/functions/integratore_adattivo_globale.m new file mode 100644 index 0000000..31784bf --- /dev/null +++ b/functions/integratore_adattivo_globale.m @@ -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 + diff --git a/functions/integratore_adattivo_locale.m b/functions/integratore_adattivo_locale.m new file mode 100644 index 0000000..b5b9d5c --- /dev/null +++ b/functions/integratore_adattivo_locale.m @@ -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 + diff --git a/functions/integratore_schema_fisso.m b/functions/integratore_schema_fisso.m new file mode 100644 index 0000000..03c7cb8 --- /dev/null +++ b/functions/integratore_schema_fisso.m @@ -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 + diff --git a/functions/static_quadratic.m b/functions/static_quadratic.m new file mode 100644 index 0000000..b08a657 --- /dev/null +++ b/functions/static_quadratic.m @@ -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 + diff --git a/samples/test.m b/samples/test.m new file mode 100644 index 0000000..dce7d37 --- /dev/null +++ b/samples/test.m @@ -0,0 +1 @@ +a(1:-1,:) \ No newline at end of file