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
Nullwerte rausschmeißen und dann die Fitting Toolbox von Matlab verwenden (falls du die hast)
such mal im file exchange von matlab, da gibts sehr gute projekte, z.b. polyfitn oder direkt von matlab polyfit
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
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,.. ) ?
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.-')
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
NaN ist ein besonderer Ausnahmefall - dafür gibts isnan() verwende einfach Folgendes: y(isnan(y))=0;
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.
Hallo Sebastian, wahrscheinlich suchst Du die Funktion interp1, die Du beispielsweise so bedienen kannst: yneu = interp1(x,y,xneu,'spline') Gruß, Michael
ja es muss quasi alle Punkte Mitteln ohne die Nullen zu betrachten und dann eine interpolation über diese von Null verchieden gemittelte Punkten.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.