Matlab: Fehlergeraden

Das Verfahren:

(English) Dieser Post geht über das plotten von Fehlergeraden für zum Beispiel Protokolle in der Uni oder andere Anwendungen. Die Methode dabei ist, dass durch die y-Werte mit deren Fehlern eine minimale und eine maximale Gerade geplottet wird. Diese ergeben eine Box bei welcher die x-Abgrenzung an der Stelle des ersten Messwerte mit Fehler in negative x-Richtung und den letzten Messwert mit Fehler in positive x-Richtung. Nun werden die Ecken der Box diagonal mit zwei Geraden verbunden, welche die Fehlergeraden sind.
Die Funktion zeichnet mit dem Befehl "[smax,smin,rmax,rmin] = errlinefunc(x, y,xerr,yerr, count)" die Fehlergeraden (count = 1), die Box (count = 2) oder Fehlergerade und Box (count = 3). (count = 0) gibt nur die Werte zurück und erstellt keine plots.
In diesem Bild sind Messwerte mit deren Fehlerbalken (blau), der Fehlergeraden (grün) und der Fehlerbox (rot) eingezeichnet:
Die Funktion gibt mit "smax,smin" die Steigungen der maximalen und minimalen Fehlergerade an und mit "rmax,rmin" deren Schnittpunkt mit der y-Achse.

Quellcode:

Der Quellcode der Funktion sieht wie folgt aus:

function [smax,smin,rmax,rmin] = errlinefunc(x, y,xerr,yerr, count)
%This is a function to plot a maximal and minimal errorline with given
%errors 'xerr' and 'yerr'. It also can create the box around the mesured
%values to see in which area the errorlines are plotted.
%For count 1 it plots just the errorline. For count 2 it plots the box and
%count 3 it plots both.

l=numel(x);
if(xerr==0)
   xerr = zeros([l,1])
end
ymax=y+yerr
ymin=y-yerr
ymax = y + yerr;

fitmax=fit(x,ymax,@(a,b,x) a*x+b);
fitmin=fit(x,ymin,@(a,b,x) a*x+b);
fitVal=fit(x,y, @(a,b,x) a*x+b);
%Fit the maximal and the minimal errorlines through the mesured values with
%their deviations.
a=coeffvalues(fitmax);
b=coeffvalues(fitmin);
c=coeffvalues(fitVal);
amax=a(1);
amin=b(1);
bmax=a(2);
bmin=b(2);
afit=c(1);
bfit=c(2);

%Declare the 4 corners of the box
xlu=x(1)-xerr(1);
xld=x(1)-xerr(1);
xru=x(l)+xerr(1);
xrd=x(l)+xerr(1);

ylu=amax*xlu+bmax;
yru=amax*xru+bmax;
yld=amin*xld+bmin;
yrd=amin*xrd+bmin;

%Declare the vectors of the corners.
xcorner=[xlu xru xrd xld xlu];
ycorner=[ylu yru yrd yld ylu];
xcrnmax=[xlu xrd];
xcrnmin=[xld xru];
ycrnmax=[ylu yrd];
ycrnmin=[yld yru];

smax=(yru-yld)/(xru-xld);
smin=(yrd-ylu)/(xrd-xlu);
rmax=yld-xld*smax;
rmin=ylu-xlu*smin;

f1(x)=rmax+x*smax;
f2(x)=rmin+x*smin;
%Declare the rises and the y-values
s1=(yrd-ylu)/(xrd-xlu);
s2=(yru-yld)/(xru-xld);

y1=ylu-s1*xlu;
y2=yld-s2*xld;

hold on;
if(count==1)
    line(xcrnmax,ycrnmax,'Color',[0.0 0.7 0.3]);
    line(xcrnmin,ycrnmin,'Color',[0.0 0.7 0.3]);
end

if(count==2)
    plot(xcorner,ycorner,'--','Color',[0.8 0 0.2]);
end

if(count==3)
    line(xcrnmax,ycrnmax,'Color',[0.0 0.7 0.3]);
    line(xcrnmin,ycrnmin,'Color',[0.0 0.7 0.3]);
    plot(xcorner,ycorner,'--','Color',[0.8 0 0.2]);
end

end

Kommentare

Beliebte Posts aus diesem Blog

Matlab: Polarplot Achsenbeschriftungs- und Skalierfunktion

Matlab: GUI Interface

Matlab: Farbspektrum für Plots