Forum: Digitale Signalverarbeitung / DSP / Machine Learning Approximationkurve aus mehrehe Messpunkte


von Sebastian (Gast)


Lesenswert?

Hallo Leute

ich beschäftige mich grad mit Matlab und habe dazu eine  Frage.
ich habe hier Daten  mit mehr als 500 Messpunkte.   Zwischen den 
einzelnen Punkten tretten Nullstellen auf.

nun möchte ich mit den von Null  verschiedene Punkte, eine Kurve 
darstellen, die sich an diesen Punkte annährt.
Hat da jemenad eine Idee wie diese zu realisieren ist.

Eine Mittelung ist auch nicht die Lösung,  da die Null-Werte auch 
betrachtet werden.

danke für Hilfe
Sebastian

von Tom E. (tkon)


Lesenswert?

Nullwerte rausschmeißen und dann die Fitting Toolbox von Matlab 
verwenden (falls du die hast)

von gast (Gast)


Lesenswert?

such mal im file exchange von matlab, da gibts sehr gute projekte, z.b. 
polyfitn oder direkt von matlab polyfit

von Sebastian (Gast)


Lesenswert?

Danke Tom,

aber die Zeitachse an sich soll  sich nicht ändern  .  d h   egal ob 
dich   die Nullwerte rausschmeißt tretten an den Stellen Lücken.


Fitting Toolbox  habe ich noch  nicht gehört.

sonst eine andere Möglichkeit ??

danke
Sebastian

von Tom E. (tkon)


Lesenswert?

Häufig funktionieren fertige Algorithmen auch wenn du die "0" durch 
"NaN" ersetzt.

Weitere Informationen zur Toolbox die ich meinte finden sich unter: 
http://www.mathworks.de/products/curvefitting/description1.html
Allerdings muss die nicht unbedingt bei dir auch installiert sein.

Mit welcher Art von Kurve willst den annähern (Polygon, Spline,.. ) ?

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Jungs, mal in nen Mathebuch kucken hilft, in diesem Falle lineare 
Algebra. Der große Gauß sagt, dass das lineare Gleichungssystem A*x=y 
durch x=inv(A'A)A'y im Sinne minimaler Fehlerquadrate gelöst wird. Damit 
kann man wunderbar Polynome fitten, in diesem Fall eine Parabel in 
Meßwerte gefittet. Nulen in Matlab rauswerfen ist auch trivial.

Da braucht man keine Toolbox zu, nix.

Math rulez!
Cheers
Detlef

y=[1 0 2.5 0 0 4.5 0 3.5 2.5 0 1].';
x=(1:length(y));
x=x(:);
ind=find(y~=0);
xx=x(ind);
yy=y(ind);
M=[xx.*xx xx ones(length(xx),1)];
coff=inv(M'*M)*M'*yy;
xxx=linspace(min(x),max(x),1000).';
yfit=[xxx.*xxx xxx ones(length(xxx),1)]*coff;
plot(xxx,yfit,'b.-',x,y,'r.-')

von Sebastian (Gast)


Lesenswert?

Danke detlef
es scheint eine gzute lösung zu sein.

aber bei:
>> ind=find(y~=0);

habe ich in meinem Vektor NaN anstatt 0.

das Ergebniss ist dann nicht mehr richtig.  ich habe in der Gleichung 
mit 'NaN' versucht. auch ohne erfolg.
hast jemand  da bitt ein Tricks.

in einem If-Anweisung zu konvertieren   von NaN in Nullen  klappt auch 
nicht.


danke

von Tom E. (tkon)


Lesenswert?

NaN ist ein besonderer Ausnahmefall - dafür gibts isnan()

verwende einfach Folgendes:
y(isnan(y))=0;

von Nicolas S. (Gast)


Lesenswert?

Nimm eine neue Variable t mit der Länge der Meßwertvariable m und 
numeriere den Inhalt:
t = zeros(1,length(m));
t = 1:length(t);

Dann suche nach den Nullstellen:
indices = ~(m == 0);

t = t(indices);
m = m(indices);

Und schon hast Du m und t-Wert von allen gültigen Werten.

von Michael L. (Gast)


Lesenswert?

Hallo Sebastian,

wahrscheinlich suchst Du die Funktion interp1, die Du beispielsweise so 
bedienen kannst:

yneu = interp1(x,y,xneu,'spline')

Gruß,
  Michael

von Sebastian (Gast)


Lesenswert?

ja  es muss quasi  alle Punkte Mitteln  ohne die Nullen zu betrachten 
und dann eine interpolation über diese von Null verchieden gemittelte 
Punkten.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Wenn es nur darum geht, eine Menge Meßwerte durch eine mathematische 
Kurve mit bestimmten Genauigkeits- und Aufwandsanforderungen zu 
beschreiben, ist dieses Tool hier genau richtig. Dort bekommst du 
Vorschläge fürs Fitten bis zum Abwinken. Such dir dann einfach die für 
dich passenste Approximation aus.

http://zunzun.com/


Das ist auch nett:
http://www.softintegration.com/chhtml/lang/lib/libch/numeric/CGI_Curvefit.html


Gruß -
Abdul

von Dipl.-Ing. (Gast)


Lesenswert?

Moin,

aus Sicht der Signalverarbeitung stellt Dein Problem ein Signal mit 
hohen Freuqenzen dar, die sich durch "schnelle" Änderungen darstellen.

Wenn Du nun die hohen Frequenzen herausfilterst, wird das Signal 
automatisch geglättet.

Dazu genügt es, das Signal durch ein FIR-Tiefpass prozessieren zu 
lassen. FIR-Filter sind einfach zu realisieren und sollten kein 
unüberwindbares Problem darstellen. Guck einfach, wo Du die 
Grenzfrequenz hinlegst, damit das Ergebnis optimal wird.

Wenn Du das Problem besonders elegant und optimal lösen willst, kannst 
Du auch ein CIC-Interpolator (Cascaded Integrator Comb nach Hogenauer) 
einsetzen. Die Theorie hat's in sich aber die Realisierung ist ebenfalls 
einfach.

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.